From c799c3b2e7ffdfd8f2533d1f9e009e76a2448c87 Mon Sep 17 00:00:00 2001 From: Amar Kamat Date: Tue, 15 Nov 2011 01:52:14 +0000 Subject: [PATCH] MAPREDUCE-3375. [Gridmix] Memory Emulation system tests. (Vinay Thota via amarrk) git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.23@1201999 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-mapreduce-project/CHANGES.txt | 2 + ...EmulForMapsAndReducesWithCustomIntrvl.java | 106 +++++++++++++++++ ...mulForMapsAndReducesWithDefaultIntrvl.java | 106 +++++++++++++++++ ...mEmulForMapsWithCustomHeapMemoryRatio.java | 108 +++++++++++++++++ .../TestMemEmulForMapsWithCustomIntrvl.java | 106 +++++++++++++++++ .../TestMemEmulForMapsWithDefaultIntrvl.java | 104 ++++++++++++++++ .../gridmix/test/system/GridMixConfig.java | 34 ++++++ .../test/system/GridmixJobVerification.java | 111 ++++++++++++++++++ .../system/resources/mem_emul_case1.json.gz | Bin 0 -> 33472 bytes .../system/resources/mem_emul_case2.json.gz | Bin 0 -> 29310 bytes 10 files changed, 677 insertions(+) create mode 100644 hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsAndReducesWithCustomIntrvl.java create mode 100644 hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsAndReducesWithDefaultIntrvl.java create mode 100644 hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsWithCustomHeapMemoryRatio.java create mode 100644 hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsWithCustomIntrvl.java create mode 100644 hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsWithDefaultIntrvl.java create mode 100644 hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/resources/mem_emul_case1.json.gz create mode 100644 hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/resources/mem_emul_case2.json.gz diff --git a/hadoop-mapreduce-project/CHANGES.txt b/hadoop-mapreduce-project/CHANGES.txt index 27ad4cf3bd5..e061c001972 100644 --- a/hadoop-mapreduce-project/CHANGES.txt +++ b/hadoop-mapreduce-project/CHANGES.txt @@ -7,6 +7,8 @@ Release 0.23.1 - Unreleased NEW FEATURES IMPROVEMENTS + MAPREDUCE-3375. [Gridmix] Memory Emulation system tests. + (Vinay Thota via amarrk) MAPREDUCE-2733. [Gridmix] Gridmix3 cpu emulation system tests. (Vinay Thota via amarrk) diff --git a/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsAndReducesWithCustomIntrvl.java b/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsAndReducesWithCustomIntrvl.java new file mode 100644 index 00000000000..a82e806059b --- /dev/null +++ b/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsAndReducesWithCustomIntrvl.java @@ -0,0 +1,106 @@ +/** + * 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.hadoop.mapred.gridmix; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.mapred.gridmix.test.system.GridMixConfig; +import org.apache.hadoop.mapred.gridmix.test.system.GridMixRunMode; +import org.apache.hadoop.mapred.gridmix.test.system.UtilsForGridmix; +import org.apache.hadoop.mapreduce.MRJobConfig; +import org.junit.Test; +import org.junit.Assert; + +/** + * Test the {@link Gridmix} memory emulation feature for the jobs with + * custom progress interval, different input data, submission policies + * and user resolver modes. Verify the total heap usage of map and reduce + * tasks of the jobs with corresponding original job in the trace. + */ +public class TestMemEmulForMapsAndReducesWithCustomIntrvl + extends GridmixSystemTestCase { + private static final Log LOG = + LogFactory.getLog("TestMemEmulForMapsAndReducesWithCustomIntrvl.class"); + /** + * Generate compressed input and run {@link Gridmix} by turning on the + * memory emulation with custom progress interval. The {@link Gridmix} + * should use the following runtime parameters while running the jobs. + * Submission Policy : STRESS, User Resolver Mode : SumitterUserResolver + * Verify maps and reduces total heap memory usage of {@link Gridmix} jobs + * with corresponding original job in the trace. + * @throws Exception - if an error occurs. + */ + @Test + public void testMemoryEmulationForReducesWithCompressedInputCase7() + throws Exception { + final long inputSizeInMB = 1024 * 7; + String tracePath = getTraceFile("mem_emul_case2"); + Assert.assertNotNull("Trace file not found!", tracePath); + String [] runtimeValues = + { "LOADJOB", + RoundRobinUserResolver.class.getName(), + "STRESS", + inputSizeInMB + "m", + "file://" + UtilsForGridmix.getProxyUsersFile(conf), + tracePath}; + + String [] otherArgs = { + "-D", GridMixConfig.GRIDMIX_MEMORY_EMULATON + "=" + + GridMixConfig.GRIDMIX_MEMORY_EMULATION_PLUGIN, + "-D", GridMixConfig.GRIDMIX_HEAP_MEMORY_CUSTOM_INTRVL + "=0.3F", + "-D", GridMixConfig.GRIDMIX_DISTCACHE_ENABLE + "=false", + "-D", MRJobConfig.JOB_CANCEL_DELEGATION_TOKEN + "=false"}; + + runGridmixAndVerify(runtimeValues, otherArgs, tracePath, + GridMixRunMode.DATA_GENERATION_AND_RUN_GRIDMIX.getValue()); + } + + /** + * Generate uncompressed input and run {@link Gridmix} by turning on the + * memory emulation with custom progress interval. The {@link Gridmix} + * should use the following runtime parameters while running the jobs. + * Submission Policy : STRESS, User Resolver Mode : SumitterUserResolver + * Verify maps and reduces total heap memory usage of {@link Gridmix} jobs + * with corresponding original job in the trace. + * @throws Exception - if an error occurs. + */ + @Test + public void testMemoryEmulationForReducesWithUncompressedInputCase8() + throws Exception { + final long inputSizeInMB = cSize * 300; + String tracePath = getTraceFile("mem_emul_case2"); + Assert.assertNotNull("Trace file not found!", tracePath); + String [] runtimeValues = + { "LOADJOB", + SubmitterUserResolver.class.getName(), + "REPLAY", + inputSizeInMB + "m", + tracePath}; + + String [] otherArgs = { + "-D", GridMixConfig.GRIDMIX_MEMORY_EMULATON + "=" + + GridMixConfig.GRIDMIX_MEMORY_EMULATION_PLUGIN, + "-D", GridMixConfig.GRIDMIX_HEAP_MEMORY_CUSTOM_INTRVL + "=0.2F", + "-D", GridMixConfig.GRIDMIX_DISTCACHE_ENABLE + "=false", + "-D", GridMixConfig.GRIDMIX_COMPRESSION_ENABLE + "=false", + "-D", MRJobConfig.JOB_CANCEL_DELEGATION_TOKEN + "=false"}; + + runGridmixAndVerify(runtimeValues, otherArgs, tracePath, + GridMixRunMode.DATA_GENERATION_AND_RUN_GRIDMIX.getValue()); + } +} diff --git a/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsAndReducesWithDefaultIntrvl.java b/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsAndReducesWithDefaultIntrvl.java new file mode 100644 index 00000000000..e1f211a11f3 --- /dev/null +++ b/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsAndReducesWithDefaultIntrvl.java @@ -0,0 +1,106 @@ +/** + * 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.hadoop.mapred.gridmix; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.mapred.gridmix.test.system.GridMixConfig; +import org.apache.hadoop.mapred.gridmix.test.system.GridMixRunMode; +import org.apache.hadoop.mapred.gridmix.test.system.UtilsForGridmix; +import org.apache.hadoop.mapreduce.MRJobConfig; +import org.junit.Test; +import org.junit.Assert; + +/** + * Test the {@link Gridmix} memory emulation feature for gridmix jobs + * with default progress interval, different input data, submission + * policies and user resolver modes. Verify the total heap usage of + * map and reduce tasks of the jobs with corresponding original + * job in the trace. + */ +public class TestMemEmulForMapsAndReducesWithDefaultIntrvl + extends GridmixSystemTestCase { + private static final Log LOG = + LogFactory.getLog("TestMemEmulForMapsAndReducesWithDefaultIntrvl.class"); + + /** + * Generate compressed input and run {@link Gridmix} by turning on the + * memory emulation with default progress interval. The {@link Gridmix} + * should use the following runtime parameters while running the jobs. + * Submission Policy : STRESS, User Resolver Mode : SumitterUserResolver + * Verify maps and reduces total heap memory usage of {@link Gridmix} jobs + * with corresponding original job in the trace. + * @throws Exception - if an error occurs. + */ + @Test + public void testMemoryEmulationForReducesWithCompressedInputCase5() + throws Exception { + final long inputSizeInMB = 1024 * 7; + String tracePath = getTraceFile("mem_emul_case2"); + Assert.assertNotNull("Trace file not found!", tracePath); + String [] runtimeValues = + { "LOADJOB", + RoundRobinUserResolver.class.getName(), + "STRESS", + inputSizeInMB + "m", + "file://" + UtilsForGridmix.getProxyUsersFile(conf), + tracePath}; + + String [] otherArgs = { + "-D", GridMixConfig.GRIDMIX_MEMORY_EMULATON + "=" + + GridMixConfig.GRIDMIX_MEMORY_EMULATION_PLUGIN, + "-D", GridMixConfig.GRIDMIX_DISTCACHE_ENABLE + "=false", + "-D", MRJobConfig.JOB_CANCEL_DELEGATION_TOKEN + "=false"}; + + runGridmixAndVerify(runtimeValues, otherArgs, tracePath, + GridMixRunMode.DATA_GENERATION_AND_RUN_GRIDMIX.getValue()); + } + + /** + * Generate uncompressed input and run {@link Gridmix} by turning on the + * memory emulation with default progress interval. The {@link Gridmix} + * should use the following runtime parameters while running the jobs. + * Submission Policy : STRESS, User Resolver Mode : SumitterUserResolver + * Verify maps and reduces total heap memory usage of {@link Gridmix} jobs + * with corresponding original job in the trace. + * @throws Exception - if an error occurs. + */ + @Test + public void testMemoryEmulationForReducesWithUncompressedInputCase6() + throws Exception { + final long inputSizeInMB = cSize * 300; + String tracePath = getTraceFile("mem_emul_case2"); + Assert.assertNotNull("Trace file not found!", tracePath); + String [] runtimeValues = + { "LOADJOB", + SubmitterUserResolver.class.getName(), + "REPLAY", + inputSizeInMB + "m", + tracePath}; + + String [] otherArgs = { + "-D", GridMixConfig.GRIDMIX_MEMORY_EMULATON + "=" + + GridMixConfig.GRIDMIX_MEMORY_EMULATION_PLUGIN, + "-D", GridMixConfig.GRIDMIX_DISTCACHE_ENABLE + "=false", + "-D", GridMixConfig.GRIDMIX_COMPRESSION_ENABLE + "=false", + "-D", MRJobConfig.JOB_CANCEL_DELEGATION_TOKEN + "=false"}; + + runGridmixAndVerify(runtimeValues, otherArgs, tracePath, + GridMixRunMode.DATA_GENERATION_AND_RUN_GRIDMIX.getValue()); + } +} diff --git a/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsWithCustomHeapMemoryRatio.java b/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsWithCustomHeapMemoryRatio.java new file mode 100644 index 00000000000..da48ad4538e --- /dev/null +++ b/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsWithCustomHeapMemoryRatio.java @@ -0,0 +1,108 @@ +/** + * 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.hadoop.mapred.gridmix; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.mapred.gridmix.test.system.GridMixConfig; +import org.apache.hadoop.mapred.gridmix.test.system.GridMixRunMode; +import org.apache.hadoop.mapred.gridmix.test.system.UtilsForGridmix; +import org.apache.hadoop.mapreduce.MRJobConfig; +import org.junit.Test; +import org.junit.Assert; + +/** + * Test the {@link Gridmix} memory emulation feature for {@link Gridmix} jobs + * with default progress interval, custom heap memory ratio, different input + * data, submission policies and user resolver modes. Verify the total heap + * usage of map and reduce tasks of the jobs with corresponding the original job + * in the trace. + */ +public class TestMemEmulForMapsWithCustomHeapMemoryRatio + extends GridmixSystemTestCase { + private static final Log LOG = + LogFactory.getLog("TestMemEmulForMapsWithCustomHeapMemoryRatio.class"); + + /** + * Generate compressed input and run {@link Gridmix} by turning on the + * memory emulation. The {@link Gridmix} should use the following runtime + * parameters while running the jobs. + * Submission Policy : STRESS, User Resolver Mode : SumitterUserResolver + * Verify total heap memory usage of the tasks of {@link Gridmix} jobs with + * corresponding original job in the trace. + * @throws Exception - if an error occurs. + */ + @Test + public void testMemoryEmulationForMapsWithCompressedInputCase1() + throws Exception { + final long inputSizeInMB = 1024 * 7; + String tracePath = getTraceFile("mem_emul_case2"); + Assert.assertNotNull("Trace file has not found.", tracePath); + String [] runtimeValues = + { "LOADJOB", + SubmitterUserResolver.class.getName(), + "STRESS", + inputSizeInMB + "m", + tracePath}; + + String [] otherArgs = { + "-D", GridMixConfig.GRIDMIX_MEMORY_EMULATON + "=" + + GridMixConfig.GRIDMIX_MEMORY_EMULATION_PLUGIN, + "-D", GridMixConfig.GRIDMIX_DISTCACHE_ENABLE + "=false", + "-D", MRJobConfig.JOB_CANCEL_DELEGATION_TOKEN + "=false", + "-D", GridMixConfig.GRIDMIX_HEAP_FREE_MEMORY_RATIO + "=0.5F"}; + + runGridmixAndVerify(runtimeValues, otherArgs, tracePath, + GridMixRunMode.DATA_GENERATION_AND_RUN_GRIDMIX.getValue()); + } + + /** + * Generate uncompressed input and run {@link Gridmix} by turning on the + * memory emulation. The {@link Gridmix} should use the following runtime + * parameters while running the jobs. + * Submission Policy : STRESS, User Resolver Mode : RoundRobinUserResolver + * Verify total heap memory usage of tasks of {@link Gridmix} jobs with + * corresponding original job in the trace. + * @throws Exception - if an error occurs. + */ + @Test + public void testMemoryEmulationForMapsWithUncompressedInputCase2() + throws Exception { + final long inputSizeInMB = cSize * 300; + String tracePath = getTraceFile("mem_emul_case2"); + Assert.assertNotNull("Trace file has not found.", tracePath); + String [] runtimeValues = + { "LOADJOB", + RoundRobinUserResolver.class.getName(), + "STRESS", + inputSizeInMB + "m", + "file://" + UtilsForGridmix.getProxyUsersFile(conf), + tracePath}; + + String [] otherArgs = { + "-D", GridMixConfig.GRIDMIX_MEMORY_EMULATON + "=" + + GridMixConfig.GRIDMIX_MEMORY_EMULATION_PLUGIN, + "-D", GridMixConfig.GRIDMIX_DISTCACHE_ENABLE + "=false", + "-D", GridMixConfig.GRIDMIX_COMPRESSION_ENABLE + "=false", + "-D", MRJobConfig.JOB_CANCEL_DELEGATION_TOKEN + "=false", + "-D", GridMixConfig.GRIDMIX_HEAP_FREE_MEMORY_RATIO + "=0.4F"}; + + runGridmixAndVerify(runtimeValues, otherArgs, tracePath, + GridMixRunMode.DATA_GENERATION_AND_RUN_GRIDMIX.getValue()); + } +} diff --git a/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsWithCustomIntrvl.java b/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsWithCustomIntrvl.java new file mode 100644 index 00000000000..5d1d452b8d6 --- /dev/null +++ b/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsWithCustomIntrvl.java @@ -0,0 +1,106 @@ +/** + * 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.hadoop.mapred.gridmix; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.mapred.gridmix.test.system.GridMixConfig; +import org.apache.hadoop.mapred.gridmix.test.system.GridMixRunMode; +import org.apache.hadoop.mapred.gridmix.test.system.UtilsForGridmix; +import org.apache.hadoop.mapreduce.MRJobConfig; +import org.junit.Test; +import org.junit.Assert; + +/** + * Test the {@link Gridmix} memory emulation feature for {@link Gridmix} jobs + * with custom progress interval, different input data, submission policies + * and user resolver modes. Verify the total heap usage of map tasks of + * the jobs with corresponding the original job in the trace. + */ +public class TestMemEmulForMapsWithCustomIntrvl extends GridmixSystemTestCase { + private static final Log LOG = + LogFactory.getLog("TestMemEmulForMapsWithCustomIntrvl.class"); + + /** + * Generate compressed input and run {@link Gridmix} by turning on the + * memory emulation with custom progress interval. The {@link Gridmix} + * should use the following runtime parameters while running the jobs. + * Submission Policy : STRESS, User Resolver Mode : SumitterUserResolver + * Verify maps total heap memory usage of {@link Gridmix} jobs with + * corresponding original job in the trace. + * @throws Exception - if an error occurs. + */ + @Test + public void testMemoryEmulationForMapsWithCompressedInputCase3() + throws Exception { + final long inputSizeInMB = 1024 * 7; + String tracePath = getTraceFile("mem_emul_case1"); + Assert.assertNotNull("Trace file not found!", tracePath); + String [] runtimeValues = + { "LOADJOB", + SubmitterUserResolver.class.getName(), + "STRESS", + inputSizeInMB + "m", + tracePath}; + + String [] otherArgs = { + "-D", GridMixConfig.GRIDMIX_MEMORY_EMULATON + "=" + + GridMixConfig.GRIDMIX_MEMORY_EMULATION_PLUGIN, + "-D", GridMixConfig.GRIDMIX_HEAP_MEMORY_CUSTOM_INTRVL + "=0.2F", + "-D", GridMixConfig.GRIDMIX_DISTCACHE_ENABLE + "=false", + "-D", MRJobConfig.JOB_CANCEL_DELEGATION_TOKEN + "=false"}; + + runGridmixAndVerify(runtimeValues, otherArgs, tracePath, + GridMixRunMode.DATA_GENERATION_AND_RUN_GRIDMIX.getValue()); + } + + /** + * Generate uncompressed input and run {@link Gridmix} by turning on the + * memory emulation with custom progress interval. The {@link Gridmix} + * should use the following runtime parameters while running the jobs. + * Submission Policy : STRESS, User Resolver Mode : RoundRobinUserResolver + * Verify maps total heap memory usage of {@link Gridmix} jobs with + * corresponding original job in the trace. + * @throws Exception - if an error occurs. + */ + @Test + public void testMemoryEmulationForMapsWithUncompressedInputCase4() + throws Exception { + final long inputSizeInMB = cSize * 300; + String tracePath = getTraceFile("mem_emul_case1"); + Assert.assertNotNull("Trace file not found!", tracePath); + String [] runtimeValues = + { "LOADJOB", + RoundRobinUserResolver.class.getName(), + "STRESS", + inputSizeInMB + "m", + "file://" + UtilsForGridmix.getProxyUsersFile(conf), + tracePath}; + + String [] otherArgs = { + "-D", GridMixConfig.GRIDMIX_MEMORY_EMULATON + "=" + + GridMixConfig.GRIDMIX_MEMORY_EMULATION_PLUGIN, + "-D", GridMixConfig.GRIDMIX_HEAP_MEMORY_CUSTOM_INTRVL + "=0.3F", + "-D", GridMixConfig.GRIDMIX_DISTCACHE_ENABLE + "=false", + "-D", GridMixConfig.GRIDMIX_COMPRESSION_ENABLE + "=false", + "-D", MRJobConfig.JOB_CANCEL_DELEGATION_TOKEN + "=false"}; + + runGridmixAndVerify(runtimeValues, otherArgs, tracePath, + GridMixRunMode.DATA_GENERATION_AND_RUN_GRIDMIX.getValue()); + } +} diff --git a/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsWithDefaultIntrvl.java b/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsWithDefaultIntrvl.java new file mode 100644 index 00000000000..ff136b89c7d --- /dev/null +++ b/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/TestMemEmulForMapsWithDefaultIntrvl.java @@ -0,0 +1,104 @@ +/** + * 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.hadoop.mapred.gridmix; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.mapred.gridmix.test.system.GridMixConfig; +import org.apache.hadoop.mapred.gridmix.test.system.GridMixRunMode; +import org.apache.hadoop.mapred.gridmix.test.system.UtilsForGridmix; +import org.apache.hadoop.mapreduce.MRJobConfig; +import org.junit.Test; +import org.junit.Assert; + +/** + * Test the {@link Gridmix} memory emulation feature for {@link Gridmix} jobs + * with default progress interval, different input data, submission policies + * and user resolver modes. Verify the total heap usage of map tasks of the + * jobs with corresponding original job in the trace. + */ +public class TestMemEmulForMapsWithDefaultIntrvl extends GridmixSystemTestCase { + private static final Log LOG = + LogFactory.getLog("TestMemEmulForMapsWithDefaultIntrvl.class"); + + /** + * Generate compressed input and run {@link Gridmix} by turning on the + * memory emulation with default progress interval. The {@link Gridmix} + * should use the following runtime parameters while running the jobs. + * Submission Policy : STRESS, User Resolver Mode : SumitterUserResolver + * Verify maps total heap memory usage of {@link Gridmix} jobs with + * corresponding original job in the trace. + * @throws Exception - if an error occurs. + */ + @Test + public void testMemoryEmulationForMapsWithCompressedInputCase1() + throws Exception { + final long inputSizeInMB = 1024 * 7; + String tracePath = getTraceFile("mem_emul_case1"); + Assert.assertNotNull("Trace file not found!", tracePath); + String [] runtimeValues = + { "LOADJOB", + SubmitterUserResolver.class.getName(), + "STRESS", + inputSizeInMB + "m", + tracePath}; + + String [] otherArgs = { + "-D", GridMixConfig.GRIDMIX_MEMORY_EMULATON + "=" + + GridMixConfig.GRIDMIX_MEMORY_EMULATION_PLUGIN, + "-D", GridMixConfig.GRIDMIX_DISTCACHE_ENABLE + "=false", + "-D", MRJobConfig.JOB_CANCEL_DELEGATION_TOKEN + "=false"}; + + runGridmixAndVerify(runtimeValues, otherArgs, tracePath, + GridMixRunMode.DATA_GENERATION_AND_RUN_GRIDMIX.getValue()); + } + + /** + * Generate uncompressed input and run {@link Gridmix} by turning on the + * memory emulation with default progress interval. The {@link Gridmix} + * should use the following runtime parameters while running the jobs. + * Submission Policy : STRESS, User Resolver Mode : RoundRobinUserResolver + * Verify maps total heap memory usage of {@link Gridmix} jobs with + * corresponding original job in the trace. + * @throws Exception - if an error occurs. + */ + @Test + public void testMemoryEmulationForMapsWithUncompressedInputCase2() + throws Exception { + final long inputSizeInMB = cSize * 300; + String tracePath = getTraceFile("mem_emul_case1"); + Assert.assertNotNull("Trace file not found!", tracePath); + String [] runtimeValues = + { "LOADJOB", + RoundRobinUserResolver.class.getName(), + "STRESS", + inputSizeInMB + "m", + "file://" + UtilsForGridmix.getProxyUsersFile(conf), + tracePath}; + + String [] otherArgs = { + "-D", GridMixConfig.GRIDMIX_MEMORY_EMULATON + "=" + + GridMixConfig.GRIDMIX_MEMORY_EMULATION_PLUGIN, + "-D", GridMixConfig.GRIDMIX_DISTCACHE_ENABLE + "=false", + "-D", GridMixConfig.GRIDMIX_COMPRESSION_ENABLE + "=false", + "-D", MRJobConfig.JOB_CANCEL_DELEGATION_TOKEN + "=false"}; + + runGridmixAndVerify(runtimeValues, otherArgs, tracePath, + GridMixRunMode.DATA_GENERATION_AND_RUN_GRIDMIX.getValue()); + } +} diff --git a/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/test/system/GridMixConfig.java b/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/test/system/GridMixConfig.java index ea0acc53d54..fc99162bd86 100644 --- a/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/test/system/GridMixConfig.java +++ b/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/test/system/GridMixConfig.java @@ -248,4 +248,38 @@ public class GridMixConfig { */ public static int GRIDMIX_CPU_EMULATION_UPPER_LIMIT = 130; + /** + * Gridmix heap memory custom interval + */ + public static final String GRIDMIX_HEAP_MEMORY_CUSTOM_INTRVL = + TotalHeapUsageEmulatorPlugin.HEAP_EMULATION_PROGRESS_INTERVAL; + + /** + * Gridmix heap free memory ratio + */ + public static final String GRIDMIX_HEAP_FREE_MEMORY_RATIO = + TotalHeapUsageEmulatorPlugin.MIN_HEAP_FREE_RATIO; + + /** + * Gridmix memory emulation plugin + */ + public static final String GRIDMIX_MEMORY_EMULATION_PLUGIN = + TotalHeapUsageEmulatorPlugin.class.getName(); + + /** + * Gridmix memory emulation + */ + public static final String GRIDMIX_MEMORY_EMULATON = + ResourceUsageMatcher.RESOURCE_USAGE_EMULATION_PLUGINS; + + /** + * Gridmix memory emulation lower limit. + */ + public static int GRIDMIX_MEMORY_EMULATION_LOWER_LIMIT = 55; + + /** + * Gridmix memory emulation upper limit. + */ + public static int GRIDMIX_MEMORY_EMULATION_UPPER_LIMIT = 130; + } diff --git a/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/test/system/GridmixJobVerification.java b/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/test/system/GridmixJobVerification.java index bef82338749..e448412a39f 100644 --- a/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/test/system/GridmixJobVerification.java +++ b/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/org/apache/hadoop/mapred/gridmix/test/system/GridmixJobVerification.java @@ -149,6 +149,7 @@ public class GridmixJobVerification { zombieJob.getJobConf()); verifyHighRamMemoryJobs(zombieJob, simuJobConf); verifyCPUEmulationOfJobs(zombieJob, jhInfo, simuJobConf); + verifyMemoryEmulationOfJobs(zombieJob, jhInfo, simuJobConf); LOG.info("Done."); } verifyDistributedCacheBetweenJobs(simuAndOrigJobsInfo); @@ -356,6 +357,109 @@ public class GridmixJobVerification { } } + /** + * It verifies the heap memory resource usage of gridmix jobs with + * corresponding original job in the trace. + * @param zombieJob - Original job history. + * @param jhInfo - Simulated job history. + * @param simuJobConf - simulated job configuration. + */ + public void verifyMemoryEmulationOfJobs(ZombieJob zombieJob, + JobHistoryParser.JobInfo jhInfo, + JobConf simuJobConf) throws Exception { + long origJobMapsTHU = 0; + long origJobReducesTHU = 0; + long simuJobMapsTHU = 0; + long simuJobReducesTHU = 0; + boolean isMemEmulOn = false; + if (simuJobConf.get(GridMixConfig.GRIDMIX_MEMORY_EMULATON) != null) { + isMemEmulOn = + simuJobConf.get(GridMixConfig.GRIDMIX_MEMORY_EMULATON). + contains(GridMixConfig.GRIDMIX_MEMORY_EMULATION_PLUGIN); + } + + if (isMemEmulOn) { + for (int index = 0; index < zombieJob.getNumberMaps(); index ++) { + TaskInfo mapTask = zombieJob.getTaskInfo(TaskType.MAP, index); + if (mapTask.getResourceUsageMetrics().getHeapUsage() > 0) { + origJobMapsTHU += + mapTask.getResourceUsageMetrics().getHeapUsage(); + } + } + LOG.info("Original Job Maps Total Heap Usage: " + origJobMapsTHU); + + for (int index = 0; index < zombieJob.getNumberReduces(); index ++) { + TaskInfo reduceTask = zombieJob.getTaskInfo(TaskType.REDUCE, index); + if (reduceTask.getResourceUsageMetrics().getHeapUsage() > 0) { + origJobReducesTHU += + reduceTask.getResourceUsageMetrics().getHeapUsage(); + } + } + LOG.info("Original Job Reduces Total Heap Usage: " + origJobReducesTHU); + + simuJobMapsTHU = + getCounterValue(jhInfo.getMapCounters(), + TaskCounter.COMMITTED_HEAP_BYTES.toString()); + LOG.info("Simulated Job Maps Total Heap Usage: " + simuJobMapsTHU); + + simuJobReducesTHU = + getCounterValue(jhInfo.getReduceCounters(), + TaskCounter.COMMITTED_HEAP_BYTES.toString()); + LOG.info("Simulated Jobs Reduces Total Heap Usage: " + simuJobReducesTHU); + + long mapCount = jhInfo.getTotalMaps(); + long reduceCount = jhInfo.getTotalReduces(); + + String strHeapRatio = + simuJobConf.get(GridMixConfig.GRIDMIX_HEAP_FREE_MEMORY_RATIO); + if (strHeapRatio == null) { + strHeapRatio = "0.3F"; + } + + if (mapCount > 0) { + double mapEmulFactor = (simuJobMapsTHU * 100) / origJobMapsTHU; + long mapEmulAccuracy = Math.round(mapEmulFactor); + LOG.info("Maps memory emulation accuracy of a job:" + + mapEmulAccuracy + "%"); + Assert.assertTrue("Map phase total memory emulation had crossed the " + + "configured max limit.", mapEmulAccuracy + <= GridMixConfig.GRIDMIX_MEMORY_EMULATION_UPPER_LIMIT); + Assert.assertTrue("Map phase total memory emulation had not crossed " + + "the configured min limit.", mapEmulAccuracy + >= GridMixConfig.GRIDMIX_MEMORY_EMULATION_LOWER_LIMIT); + double expHeapRatio = Double.parseDouble(strHeapRatio); + LOG.info("expHeapRatio for maps:" + expHeapRatio); + double actHeapRatio = + ((double)Math.abs(origJobMapsTHU - simuJobMapsTHU)) ; + actHeapRatio /= origJobMapsTHU; + LOG.info("actHeapRatio for maps:" + actHeapRatio); + Assert.assertTrue("Simulate job maps heap ratio not matched.", + actHeapRatio <= expHeapRatio); + } + + if (reduceCount >0) { + double reduceEmulFactor = (simuJobReducesTHU * 100) / origJobReducesTHU; + long reduceEmulAccuracy = Math.round(reduceEmulFactor); + LOG.info("Reduces memory emulation accuracy of a job:" + + reduceEmulAccuracy + "%"); + Assert.assertTrue("Reduce phase total memory emulation had crossed " + + "configured max limit.", reduceEmulAccuracy + <= GridMixConfig.GRIDMIX_MEMORY_EMULATION_UPPER_LIMIT); + Assert.assertTrue("Reduce phase total memory emulation had not " + + "crosssed configured min limit.", reduceEmulAccuracy + >= GridMixConfig.GRIDMIX_MEMORY_EMULATION_LOWER_LIMIT); + double expHeapRatio = Double.parseDouble(strHeapRatio); + LOG.info("expHeapRatio for reduces:" + expHeapRatio); + double actHeapRatio = + ((double)Math.abs(origJobReducesTHU - simuJobReducesTHU)); + actHeapRatio /= origJobReducesTHU; + LOG.info("actHeapRatio for reduces:" + actHeapRatio); + Assert.assertTrue("Simulate job reduces heap ratio not matched.", + actHeapRatio <= expHeapRatio); + } + } + } + /** * It verifies the cpu resource usage of a gridmix job against * their original job. @@ -367,7 +471,14 @@ public class GridmixJobVerification { JobHistoryParser.JobInfo simuJobHistoryInfo, JobConf simuJobConf) throws Exception { + boolean isCpuEmulOn = false; if (simuJobConf.get(GridMixConfig.GRIDMIX_CPU_EMULATON) != null) { + isCpuEmulOn = + simuJobConf.get(GridMixConfig.GRIDMIX_CPU_EMULATON). + contains(GridMixConfig.GRIDMIX_CPU_USAGE_PLUGIN); + } + + if (isCpuEmulOn) { Map origJobMetrics = getOriginalJobCPUMetrics(origJobHistory); Map simuJobMetrics = diff --git a/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/resources/mem_emul_case1.json.gz b/hadoop-mapreduce-project/src/contrib/gridmix/src/test/system/resources/mem_emul_case1.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..5f7fcab1d551ecdee810bd872e479ce3860d5e0c GIT binary patch literal 33472 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 z⪙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