diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerId.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerId.java index d03a439..de2f959 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerId.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerId.java @@ -37,6 +37,7 @@ public abstract class ContainerId implements Comparable{ private static final Splitter _SPLITTER = Splitter.on('_').trimResults(); private static final String CONTAINER_PREFIX = "container"; + private static final String EPOCH_PREFIX = "e"; @Private @Unstable @@ -158,10 +159,16 @@ public int compareTo(ContainerId other) { } } + /** + * @return A string representation of containerId. The format is + * container_*attemptId*_*clusterTimestamp*_*appId*_*containerId*_e*epoch* + * (e.g. container_1410901177871_0001_01_000005_e17). + * *epoch* is increased when RM restarts or fails over. + */ @Override public String toString() { StringBuilder sb = new StringBuilder(); - sb.append("container_"); + sb.append(CONTAINER_PREFIX + "_"); ApplicationId appId = getApplicationAttemptId().getApplicationId(); sb.append(appId.getClusterTimestamp()).append("_"); sb.append(ApplicationId.appIdFormat.get().format(appId.getId())) @@ -172,7 +179,8 @@ public String toString() { sb.append(containerIdFormat.get().format(0xffffffffffL & getContainerId())); long epoch = getContainerId() >> 40; if (epoch > 0) { - sb.append("_").append(appAttemptIdAndEpochFormat.get().format(epoch)); + sb.append("_" + EPOCH_PREFIX) + .append(appAttemptIdAndEpochFormat.get().format(epoch)); } return sb.toString(); } @@ -190,7 +198,12 @@ public static ContainerId fromString(String containerIdStr) { long id = Long.parseLong(it.next()); long epoch = 0; if (it.hasNext()) { - epoch = Integer.parseInt(it.next()); + String epochStr = it.next(); + if (!epochStr.startsWith(EPOCH_PREFIX)) { + throw new IllegalArgumentException("Invalid ContainerId prefix: " + + containerIdStr); + } + epoch = Integer.parseInt(epochStr.substring(EPOCH_PREFIX.length())); } long cid = (epoch << 40) | id; ContainerId containerId = ContainerId.newInstance(appAttemptID, cid); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestContainerId.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestContainerId.java index c11fd96..8fe5ae5 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestContainerId.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestContainerId.java @@ -63,13 +63,15 @@ public void testContainerId() { Assert.assertEquals(999799999997L, 0xffffffffffL & c7.getContainerId()); Assert.assertEquals(3, c7.getContainerId() >> 40); Assert.assertEquals( - "container_" + ts + "_36473_4365472_999799999997_03", c7.toString()); + "container_" + ts + "_36473_4365472_999799999997_e03", + c7.toString()); ContainerId c8 = newContainerId(36473, 4365472, ts, 844424930131965L); Assert.assertEquals(1099511627773L, 0xffffffffffL & c8.getContainerId()); Assert.assertEquals(767, c8.getContainerId() >> 40); Assert.assertEquals( - "container_" + ts + "_36473_4365472_1099511627773_767", c8.toString()); + "container_" + ts + "_36473_4365472_1099511627773_e767", + c8.toString()); } public static ContainerId newContainerId(int appId, int appAttemptId, diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/TestConverterUtils.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/TestConverterUtils.java index f7e7fe4..9123dbb 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/TestConverterUtils.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/TestConverterUtils.java @@ -67,14 +67,16 @@ public void testContainerIdWithEpoch() throws URISyntaxException { ContainerId id2 = TestContainerId.newContainerId(36473, 4365472, ts, 4298334883325L); String cid2 = ConverterUtils.toString(id2); - assertEquals("container_" + ts + "_36473_4365472_999799999997_03", cid2); + assertEquals( + "container_" + ts + "_36473_4365472_999799999997_e03", cid2); ContainerId gen2 = ConverterUtils.toContainerId(cid2); assertEquals(gen2.toString(), id2.toString()); ContainerId id3 = TestContainerId.newContainerId(36473, 4365472, ts, 844424930131965L); String cid3 = ConverterUtils.toString(id3); - assertEquals("container_" + ts + "_36473_4365472_1099511627773_767", cid3); + assertEquals( + "container_" + ts + "_36473_4365472_1099511627773_e767", cid3); ContainerId gen3 = ConverterUtils.toContainerId(cid3); assertEquals(gen3.toString(), id3.toString()); }