blob: 9766cc060fb0844da3bc427d552771d6b3aa6d7f [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.tez.mapreduce.hadoop;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapreduce.MRJobConfig;
import org.apache.hadoop.util.Shell;
import org.apache.hadoop.yarn.api.ApplicationConstants.Environment;
import org.apache.hadoop.yarn.api.records.Resource;
import org.apache.tez.dag.api.TezConstants;
import org.apache.tez.runtime.library.api.TezRuntimeConfiguration;
import org.junit.Assert;
import org.junit.Test;
public class TestMRHelpers {
private Configuration createConfForJavaOptsTest() {
Configuration conf = new Configuration(false);
conf.set(MRJobConfig.MAPRED_MAP_ADMIN_JAVA_OPTS, "fooMapAdminOpts");
conf.set(MRJobConfig.MAP_JAVA_OPTS, "fooMapJavaOpts");
conf.set(MRJobConfig.MAP_LOG_LEVEL, "FATAL");
conf.set(MRJobConfig.MAPRED_REDUCE_ADMIN_JAVA_OPTS, "fooReduceAdminOpts");
conf.set(MRJobConfig.REDUCE_JAVA_OPTS, "fooReduceJavaOpts");
conf.set(MRJobConfig.REDUCE_LOG_LEVEL, "TRACE");
return conf;
}
@Test(timeout = 5000)
public void testMapJavaOptions() {
Configuration conf = createConfForJavaOptsTest();
String opts = MRHelpers.getJavaOptsForMRMapper(conf);
Assert.assertTrue(opts.contains("fooMapAdminOpts"));
Assert.assertTrue(opts.contains(" fooMapJavaOpts "));
Assert.assertFalse(opts.contains("fooReduceAdminOpts "));
Assert.assertFalse(opts.contains(" fooReduceJavaOpts "));
Assert.assertTrue(opts.indexOf("fooMapAdminOpts")
< opts.indexOf("fooMapJavaOpts"));
Assert.assertTrue(opts.contains(" -D"
+ TezConstants.TEZ_ROOT_LOGGER_NAME + "=FATAL"));
Assert.assertFalse(opts.contains(" -D"
+ TezConstants.TEZ_ROOT_LOGGER_NAME + "=TRACE"));
}
@Test(timeout = 5000)
public void testReduceJavaOptions() {
Configuration conf = createConfForJavaOptsTest();
String opts = MRHelpers.getJavaOptsForMRReducer(conf);
Assert.assertFalse(opts.contains("fooMapAdminOpts"));
Assert.assertFalse(opts.contains(" fooMapJavaOpts "));
Assert.assertTrue(opts.contains("fooReduceAdminOpts"));
Assert.assertTrue(opts.contains(" fooReduceJavaOpts "));
Assert.assertTrue(opts.indexOf("fooReduceAdminOpts")
< opts.indexOf("fooReduceJavaOpts"));
Assert.assertFalse(opts.contains(" -D"
+ TezConstants.TEZ_ROOT_LOGGER_NAME + "=FATAL"));
Assert.assertTrue(opts.contains(" -D"
+ TezConstants.TEZ_ROOT_LOGGER_NAME + "=TRACE"));
}
@Test(timeout = 5000)
public void testContainerResourceConstruction() {
JobConf conf = new JobConf(new Configuration());
Resource mapResource = MRHelpers.getResourceForMRMapper(conf);
Resource reduceResource = MRHelpers.getResourceForMRReducer(conf);
Assert.assertEquals(MRJobConfig.DEFAULT_MAP_CPU_VCORES,
mapResource.getVirtualCores());
Assert.assertEquals(MRJobConfig.DEFAULT_MAP_MEMORY_MB,
mapResource.getMemory());
Assert.assertEquals(MRJobConfig.DEFAULT_REDUCE_CPU_VCORES,
reduceResource.getVirtualCores());
Assert.assertEquals(MRJobConfig.DEFAULT_REDUCE_MEMORY_MB,
reduceResource.getMemory());
conf.setInt(MRJobConfig.MAP_CPU_VCORES, 2);
conf.setInt(MRJobConfig.MAP_MEMORY_MB, 123);
conf.setInt(MRJobConfig.REDUCE_CPU_VCORES, 20);
conf.setInt(MRJobConfig.REDUCE_MEMORY_MB, 1234);
mapResource = MRHelpers.getResourceForMRMapper(conf);
reduceResource = MRHelpers.getResourceForMRReducer(conf);
Assert.assertEquals(2, mapResource.getVirtualCores());
Assert.assertEquals(123, mapResource.getMemory());
Assert.assertEquals(20, reduceResource.getVirtualCores());
Assert.assertEquals(1234, reduceResource.getMemory());
}
private Configuration setupConfigForMREnvTest() {
JobConf conf = new JobConf(new Configuration());
conf.set(MRJobConfig.MAP_ENV, "foo=map1,bar=map2");
conf.set(MRJobConfig.REDUCE_ENV, "foo=red1,bar=red2");
conf.set(MRJobConfig.MAP_LOG_LEVEL, "TRACE");
conf.set(MRJobConfig.REDUCE_LOG_LEVEL, "FATAL");
final String mapredAdminUserEnv = Shell.WINDOWS ?
"PATH=%PATH%" + File.pathSeparator + "%TEZ_ADMIN_ENV%\\bin":
"LD_LIBRARY_PATH=$TEZ_ADMIN_ENV_TEST/lib/native";
conf.set(MRJobConfig.MAPRED_ADMIN_USER_ENV, mapredAdminUserEnv);
return conf;
}
private void testCommonEnvSettingsForMRTasks(Map<String, String> env) {
Assert.assertTrue(env.containsKey("foo"));
Assert.assertTrue(env.containsKey("bar"));
Assert.assertTrue(env.containsKey(Environment.LD_LIBRARY_PATH.name()));
Assert.assertTrue(env.containsKey(Environment.SHELL.name()));
Assert.assertTrue(env.containsKey("HADOOP_ROOT_LOGGER"));
/* On non-windows platform ensure that LD_LIBRARY_PATH is being set and PWD is present.
* on windows platform LD_LIBRARY_PATH is not applicable. check the PATH is being appended
* by the user setting (ex user may set HADOOP_HOME\\bin.
*/
if (!Shell.WINDOWS) {
Assert.assertEquals("$PWD:$TEZ_ADMIN_ENV_TEST/lib/native",
env.get(Environment.LD_LIBRARY_PATH.name()));
} else {
Assert.assertTrue(env.get(Environment.PATH.name()).contains(";%TEZ_ADMIN_ENV%\\bin"));
}
// TEZ-273 will reinstate this or similar.
// for (String val : YarnConfiguration.DEFAULT_YARN_APPLICATION_CLASSPATH) {
// Assert.assertTrue(env.get(Environment.CLASSPATH.name()).contains(val));
// }
// Assert.assertTrue(0 ==
// env.get(Environment.CLASSPATH.name()).indexOf(Environment.PWD.$()));
}
@Test(timeout = 5000)
public void testMREnvSetupForMap() {
Configuration conf = setupConfigForMREnvTest();
Map<String, String> env = new HashMap<String, String>();
MRHelpers.updateEnvBasedOnMRTaskEnv(conf, env, true);
testCommonEnvSettingsForMRTasks(env);
Assert.assertEquals("map1", env.get("foo"));
Assert.assertEquals("map2", env.get("bar"));
}
@Test(timeout = 5000)
public void testMREnvSetupForReduce() {
Configuration conf = setupConfigForMREnvTest();
Map<String, String> env = new HashMap<String, String>();
MRHelpers.updateEnvBasedOnMRTaskEnv(conf, env, false);
testCommonEnvSettingsForMRTasks(env);
Assert.assertEquals("red1", env.get("foo"));
Assert.assertEquals("red2", env.get("bar"));
}
@Test(timeout = 5000)
public void testMRAMJavaOpts() {
Configuration conf = new Configuration();
conf.set(MRJobConfig.MR_AM_ADMIN_COMMAND_OPTS, " -Dadminfoobar ");
conf.set(MRJobConfig.MR_AM_COMMAND_OPTS, " -Duserfoo ");
String opts = MRHelpers.getJavaOptsForMRAM(conf);
Assert.assertEquals("-Dadminfoobar -Duserfoo", opts);
}
@Test(timeout = 5000)
public void testMRAMEnvironmentSetup() {
Configuration conf = new Configuration();
conf.set(MRJobConfig.MR_AM_ADMIN_USER_ENV, "foo=bar,admin1=foo1");
conf.set(MRJobConfig.MR_AM_ENV, "foo=bar2,user=foo2");
Map<String, String> env =
new HashMap<String, String>();
MRHelpers.updateEnvBasedOnMRAMEnv(conf, env);
Assert.assertEquals("foo1", env.get("admin1"));
Assert.assertEquals("foo2", env.get("user"));
Assert.assertEquals(("bar" + File.pathSeparator + "bar2"), env.get("foo"));
}
@Test(timeout = 5000)
public void testTranslateMRConfToTez() {
Configuration conf = new Configuration(false);
conf.setLong(TezRuntimeConfiguration.TEZ_RUNTIME_IO_SORT_MB, 1000);
conf.setLong(org.apache.tez.mapreduce.hadoop.MRJobConfig.IO_SORT_MB, 500);
Configuration conf1 = new Configuration(conf);
MRHelpers.translateMRConfToTez(conf1);
Assert.assertNull(conf1.get(org.apache.tez.mapreduce.hadoop.MRJobConfig.IO_SORT_MB));
Assert.assertEquals(1000, conf1.getLong(TezRuntimeConfiguration.TEZ_RUNTIME_IO_SORT_MB, 0));
Configuration conf2 = new Configuration(conf);
MRHelpers.translateMRConfToTez(conf2, true);
Assert.assertNull(conf2.get(org.apache.tez.mapreduce.hadoop.MRJobConfig.IO_SORT_MB));
Assert.assertEquals(1000, conf2.getLong(TezRuntimeConfiguration.TEZ_RUNTIME_IO_SORT_MB, 0));
Configuration conf3 = new Configuration(conf);
MRHelpers.translateMRConfToTez(conf3, false);
Assert.assertNull(conf3.get(org.apache.tez.mapreduce.hadoop.MRJobConfig.IO_SORT_MB));
Assert.assertEquals(500, conf3.getLong(TezRuntimeConfiguration.TEZ_RUNTIME_IO_SORT_MB, 0));
}
}