Author: hairong
Date: Thu Mar 5 18:31:23 2009
New Revision: 750541
URL: http://svn.apache.org/viewvc?rev=750541&view=rev
Log:
Merge -r 750532:750533 from trunk to move the change of hadoop-5145 into branch
0.20.
Modified:
hadoop/core/branches/branch-0.20/ (props changed)
hadoop/core/branches/branch-0.20/CHANGES.txt (contents, props changed)
hadoop/core/branches/branch-0.20/src/hdfs/org/apache/hadoop/hdfs/server/balancer/Balancer.java
hadoop/core/branches/branch-0.20/src/test/org/apache/hadoop/hdfs/server/balancer/TestBalancer.java
Propchange: hadoop/core/branches/branch-0.20/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Mar 5 18:31:23 2009
@@ -1,2 +1,2 @@
/hadoop/core/branches/branch-0.19:713112
-/hadoop/core/trunk:727001,727117,727191,727212,727217,727228,727255,727869,728187,729052,729987,732385,732572,732613,732777,732838,732869,733887,734870,734916,736426,738328,738697,740077,740157,741703,741762,743745,743816,743892,744894,745180,746010,746206,746227,746233,746274,746902-746903,746944,746968,746970,747279,747802,748084,748090,748783,749262,749318,749863
+/hadoop/core/trunk:727001,727117,727191,727212,727217,727228,727255,727869,728187,729052,729987,732385,732572,732613,732777,732838,732869,733887,734870,734916,736426,738328,738697,740077,740157,741703,741762,743745,743816,743892,744894,745180,746010,746206,746227,746233,746274,746902-746903,746944,746968,746970,747279,747802,748084,748090,748783,749262,749318,749863,750533
Modified: hadoop/core/branches/branch-0.20/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hadoop/core/branches/branch-0.20/CHANGES.txt?rev=750541&r1=750540&r2=750541&view=diff
==============================================================================
--- hadoop/core/branches/branch-0.20/CHANGES.txt (original)
+++ hadoop/core/branches/branch-0.20/CHANGES.txt Thu Mar 5 18:31:23 2009
@@ -678,6 +678,9 @@
HADOOP-5274. Fix gridmix2 dependency on wordcount example. (cdouglas)
+ HADOOP-5145. Balancer sometimes runs out of memory after running days or
weeks.
+ (hairong)
+
Release 0.19.2 - Unreleased
BUG FIXES
Propchange: hadoop/core/branches/branch-0.20/CHANGES.txt
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Mar 5 18:31:23 2009
@@ -1,3 +1,3 @@
/hadoop/core/branches/branch-0.18/CHANGES.txt:727226
/hadoop/core/branches/branch-0.19/CHANGES.txt:713112
-/hadoop/core/trunk/CHANGES.txt:727001,727117,727191,727212,727228,727255,727869,728187,729052,729987,732385,732572,732613,732777,732838,732869,733887,734870,734916,735082,736426,738602,738697,739416,740077,740157,741703,741762,743296,743745,743816,743892,744894,745180,745268,746010,746193,746206,746227,746233,746274,746902-746903,746944,746968,746970,747279,747802,748084,748090,748783,749262,749318,749863
+/hadoop/core/trunk/CHANGES.txt:727001,727117,727191,727212,727228,727255,727869,728187,729052,729987,732385,732572,732613,732777,732838,732869,733887,734870,734916,735082,736426,738602,738697,739416,740077,740157,741703,741762,743296,743745,743816,743892,744894,745180,745268,746010,746193,746206,746227,746233,746274,746902-746903,746944,746968,746970,747279,747802,748084,748090,748783,749262,749318,749863,750533
Modified:
hadoop/core/branches/branch-0.20/src/hdfs/org/apache/hadoop/hdfs/server/balancer/Balancer.java
URL:
http://svn.apache.org/viewvc/hadoop/core/branches/branch-0.20/src/hdfs/org/apache/hadoop/hdfs/server/balancer/Balancer.java?rev=750541&r1=750540&r2=750541&view=diff
==============================================================================
---
hadoop/core/branches/branch-0.20/src/hdfs/org/apache/hadoop/hdfs/server/balancer/Balancer.java
(original)
+++
hadoop/core/branches/branch-0.20/src/hdfs/org/apache/hadoop/hdfs/server/balancer/Balancer.java
Thu Mar 5 18:31:23 2009
@@ -208,8 +208,7 @@
private Map<Block, BalancerBlock> globalBlockList
= new HashMap<Block, BalancerBlock>();
- private Map<Block, BalancerBlock> movedBlocks
- = new HashMap<Block, BalancerBlock>();
+ private MovedBlocks movedBlocks = new MovedBlocks();
private Map<String, BalancerDatanode> datanodes
= new HashMap<String, BalancerDatanode>();
@@ -264,7 +263,7 @@
if (isGoodBlockCandidate(source, target, block)) {
this.block = block;
if ( chooseProxySource() ) {
- addToMoved(block);
+ movedBlocks.add(block);
if (LOG.isDebugEnabled()) {
LOG.debug("Decided to move block "+ block.getBlockId()
+" with a length of
"+StringUtils.byteDesc(block.getNumBytes())
@@ -697,7 +696,7 @@
private void filterMovedBlocks() {
for (Iterator<BalancerBlock> blocks=getBlockIterator();
blocks.hasNext();) {
- if (isMoved(blocks.next())) {
+ if (movedBlocks.contains(blocks.next())) {
blocks.remove();
}
}
@@ -1244,20 +1243,63 @@
} while (shouldWait);
}
- /* mark a block to be moved */
- private void addToMoved(BalancerBlock block) {
- synchronized(movedBlocks) {
- movedBlocks.put(block.getBlock(), block);
- }
- }
-
- /* check if a block is marked as moved */
- private boolean isMoved(BalancerBlock block) {
- synchronized(movedBlocks) {
- return movedBlocks.containsKey(block.getBlock());
+ /** This window makes sure to keep blocks that have been moved within 1.5
hour.
+ * Old window has blocks that are older;
+ * Current window has blocks that are more recent;
+ * Cleanup method triggers the check if blocks in the old window are
+ * more than 1.5 hour old. If yes, purge the old window and then
+ * move blocks in current window to old window.
+ */
+ private static class MovedBlocks {
+ private long lastCleanupTime = System.currentTimeMillis();
+ private static long winWidth = 5400*1000L; // 1.5 hour
+ final private static int CUR_WIN = 0;
+ final private static int OLD_WIN = 1;
+ final private static int NUM_WINS = 2;
+ final private List<HashMap<Block, BalancerBlock>> movedBlocks =
+ new ArrayList<HashMap<Block, BalancerBlock>>(NUM_WINS);
+
+ /* initialize the moved blocks collection */
+ private MovedBlocks() {
+ movedBlocks.add(new HashMap<Block,BalancerBlock>());
+ movedBlocks.add(new HashMap<Block,BalancerBlock>());
+ }
+
+ /* set the win width */
+ private void setWinWidth(Configuration conf) {
+ winWidth = conf.getLong(
+ "dfs.balancer.movedWinWidth", 5400*1000L);
+ }
+
+ /* add a block thus marking a block to be moved */
+ synchronized private void add(BalancerBlock block) {
+ movedBlocks.get(CUR_WIN).put(block.getBlock(), block);
+ }
+
+ /* check if a block is marked as moved */
+ synchronized private boolean contains(BalancerBlock block) {
+ return contains(block.getBlock());
+ }
+
+ /* check if a block is marked as moved */
+ synchronized private boolean contains(Block block) {
+ return movedBlocks.get(CUR_WIN).containsKey(block) ||
+ movedBlocks.get(OLD_WIN).containsKey(block);
+ }
+
+ /* remove old blocks */
+ synchronized private void cleanup() {
+ long curTime = System.currentTimeMillis();
+ // check if old win is older than winWidth
+ if (lastCleanupTime + winWidth <= curTime) {
+ // purge the old window
+ movedBlocks.set(OLD_WIN, movedBlocks.get(CUR_WIN));
+ movedBlocks.set(CUR_WIN, new HashMap<Block, BalancerBlock>());
+ lastCleanupTime = curTime;
+ }
}
}
-
+
/* Decide if it is OK to move the given block from source to target
* A block is a good candidate if
* 1. the block is not in the process of being moved/has not been moved;
@@ -1267,7 +1309,7 @@
private boolean isGoodBlockCandidate(Source source,
BalancerDatanode target, BalancerBlock block) {
// check if the block is moved or not
- if (isMoved(block)) {
+ if (movedBlocks.contains(block)) {
return false;
}
if (block.isLocatedOnDatanode(target)) {
@@ -1317,6 +1359,7 @@
this.targets.clear();
this.avgUtilization = 0.0D;
cleanGlobalBlockList();
+ this.movedBlocks.cleanup();
}
/* Remove all blocks from the global block list except for the ones in the
@@ -1326,7 +1369,7 @@
for (Iterator<Block>
globalBlockListIterator=globalBlockList.keySet().iterator();
globalBlockListIterator.hasNext();) {
Block block = globalBlockListIterator.next();
- if(!movedBlocks.containsKey(block)) {
+ if(!movedBlocks.contains(block)) {
globalBlockListIterator.remove();
}
}
@@ -1461,9 +1504,11 @@
// close the output file
IOUtils.closeStream(out);
- try {
- fs.delete(BALANCER_ID_PATH, true);
- } catch(IOException ignored) {
+ if (fs != null) {
+ try {
+ fs.delete(BALANCER_ID_PATH, true);
+ } catch(IOException ignored) {
+ }
}
System.out.println("Balancing took " +
time2Str(Util.now()-startTime));
@@ -1528,6 +1573,7 @@
/** set this balancer's configuration */
public void setConf(Configuration conf) {
this.conf = conf;
+ movedBlocks.setWinWidth(conf);
}
}
Modified:
hadoop/core/branches/branch-0.20/src/test/org/apache/hadoop/hdfs/server/balancer/TestBalancer.java
URL:
http://svn.apache.org/viewvc/hadoop/core/branches/branch-0.20/src/test/org/apache/hadoop/hdfs/server/balancer/TestBalancer.java?rev=750541&r1=750540&r2=750541&view=diff
==============================================================================
---
hadoop/core/branches/branch-0.20/src/test/org/apache/hadoop/hdfs/server/balancer/TestBalancer.java
(original)
+++
hadoop/core/branches/branch-0.20/src/test/org/apache/hadoop/hdfs/server/balancer/TestBalancer.java
Thu Mar 5 18:31:23 2009
@@ -60,6 +60,7 @@
CONF.setInt("io.bytes.per.checksum", DEFAULT_BLOCK_SIZE);
CONF.setLong("dfs.heartbeat.interval", 1L);
CONF.setBoolean(SimulatedFSDataset.CONFIG_PROPERTY_SIMULATED, true);
+ CONF.setLong("dfs.balancer.movedWinWidth", 2000L);
Balancer.setBlockMoveWaitTime(1000L) ;
}