[
https://issues.apache.org/jira/browse/MAPREDUCE-6724?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15384827#comment-15384827
]
Gera Shegalov commented on MAPREDUCE-6724:
------------------------------------------
As for test I was thinking of a smaller change to the existing test along the
lines:
{code}
diff --git
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/test/java/org/apache/hadoop/mapreduce/task/reduce/TestMergeManager.java
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/test/java/org/apache/hadoop/mapreduce/task/reduce/TestMergeManager.java
index 1c0d25b..f4e6680 100644
---
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/test/java/org/apache/hadoop/mapreduce/task/reduce/TestMergeManager.java
+++
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/test/java/org/apache/hadoop/mapreduce/task/reduce/TestMergeManager.java
@@ -289,6 +289,20 @@ public void testLargeMemoryLimits() throws Exception {
final long maxInMemReduce = mgr.getMaxInMemReduceLimit();
assertTrue("Large in-memory reduce area unusable: " + maxInMemReduce,
maxInMemReduce > Integer.MAX_VALUE);
+
+ verifyReserveLargeMapOutput(mgr, Integer.MAX_VALUE);
+ verifyReserveLargeMapOutput(mgr, Integer.MAX_VALUE + 1);
+
+ }
+
+ private void verifyReserveLargeMapOutput(MergeManagerImpl<Text, Text> mgr,
+ long size) throws IOException {
+ final TaskAttemptID mapId = TaskAttemptID.forName("attempt_0_1_m_1_1");
+ final MapOutput<Text, Text> mapOutput = mgr.reserve(mapId, size, 1);
+ assertEquals("Shuffled bytes: " + size,
+ size <= Integer.MAX_VALUE ? "MEMORY" : "DISK",
+ mapOutput.getDescription());
+ mgr.unreserve(size);
}
{code}
In terms of the production code, testing this I noticed that
{code}mapreduce.task.reduce.MergeManagerImpl#canShuffleToMemory{code}
having '<' does not look right, and should be '<='. I suggest we fix it in this
JIRA as well. Probably a good idea to inline this simple private one-liner.
> Unsafe conversion from long to int in MergeManagerImpl.unconditionalReserve()
> -----------------------------------------------------------------------------
>
> Key: MAPREDUCE-6724
> URL: https://issues.apache.org/jira/browse/MAPREDUCE-6724
> Project: Hadoop Map/Reduce
> Issue Type: Bug
> Components: mrv2
> Reporter: Haibo Chen
> Assignee: Haibo Chen
> Attachments: mapreduce6724.001.patch, mapreduce6724.002.patch,
> mapreduce6724.003.patch, mapreduce6724.004.patch, mapreduce6724.005.patch
>
>
> When shuffle is done in memory, MergeManagerImpl converts the requested size
> to an int to allocate an instance of InMemoryMapOutput. This results in an
> overflow if the requested size is bigger than Integer.MAX_VALUE and
> eventually causes the reducer to fail.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]