|
@@ -24,10 +24,13 @@ import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_AVAILABLE_SPACE_
|
|
|
import java.util.Collection;
|
|
|
import java.util.Random;
|
|
|
|
|
|
+import com.google.common.base.Preconditions;
|
|
|
import org.apache.commons.logging.Log;
|
|
|
import org.apache.commons.logging.LogFactory;
|
|
|
import org.apache.hadoop.conf.Configuration;
|
|
|
+import org.apache.hadoop.fs.StorageType;
|
|
|
import org.apache.hadoop.hdfs.DFSConfigKeys;
|
|
|
+import org.apache.hadoop.hdfs.net.DFSNetworkTopology;
|
|
|
import org.apache.hadoop.net.NetworkTopology;
|
|
|
import org.apache.hadoop.net.Node;
|
|
|
|
|
@@ -69,6 +72,19 @@ public class AvailableSpaceBlockPlacementPolicy extends
|
|
|
balancedPreference = (int) (100 * balancedPreferencePercent);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ protected DatanodeDescriptor chooseDataNode(final String scope,
|
|
|
+ final Collection<Node> excludedNode, StorageType type) {
|
|
|
+ // only the code that uses DFSNetworkTopology should trigger this code path.
|
|
|
+ Preconditions.checkArgument(clusterMap instanceof DFSNetworkTopology);
|
|
|
+ DFSNetworkTopology dfsClusterMap = (DFSNetworkTopology)clusterMap;
|
|
|
+ DatanodeDescriptor a = (DatanodeDescriptor) dfsClusterMap
|
|
|
+ .chooseRandomWithStorageType(scope, excludedNode, type);
|
|
|
+ DatanodeDescriptor b = (DatanodeDescriptor) dfsClusterMap
|
|
|
+ .chooseRandomWithStorageType(scope, excludedNode, type);
|
|
|
+ return select(a, b);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
protected DatanodeDescriptor chooseDataNode(final String scope,
|
|
|
final Collection<Node> excludedNode) {
|
|
@@ -76,6 +92,11 @@ public class AvailableSpaceBlockPlacementPolicy extends
|
|
|
(DatanodeDescriptor) clusterMap.chooseRandom(scope, excludedNode);
|
|
|
DatanodeDescriptor b =
|
|
|
(DatanodeDescriptor) clusterMap.chooseRandom(scope, excludedNode);
|
|
|
+ return select(a, b);
|
|
|
+ }
|
|
|
+
|
|
|
+ private DatanodeDescriptor select(
|
|
|
+ DatanodeDescriptor a, DatanodeDescriptor b) {
|
|
|
if (a != null && b != null){
|
|
|
int ret = compareDataNode(a, b);
|
|
|
if (ret == 0) {
|