Skip to content

Commit 2fa540d

Browse files
authored
HDFS-16858. Dynamically adjust max slow disks to exclude. (#5180)
Reviewed-by: Chris Nauroth <cnauroth@apache.org> Reviewed-by: slfan1989 <55643692+slfan1989@users.noreply.github.com> Signed-off-by: Tao Li <tomscut@apache.org>
1 parent ee7d178 commit 2fa540d

4 files changed

Lines changed: 28 additions & 3 deletions

File tree

hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@
7272
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_OUTLIERS_REPORT_INTERVAL_KEY;
7373
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_SLOWDISK_LOW_THRESHOLD_MS_DEFAULT;
7474
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_SLOWDISK_LOW_THRESHOLD_MS_KEY;
75+
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_MAX_SLOWDISKS_TO_EXCLUDE_DEFAULT;
76+
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_MAX_SLOWDISKS_TO_EXCLUDE_KEY;
7577
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_STARTUP_KEY;
7678
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_BALANCE_MAX_NUM_CONCURRENT_MOVES_KEY;
7779
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_BALANCE_MAX_NUM_CONCURRENT_MOVES_DEFAULT;
@@ -353,6 +355,7 @@ public class DataNode extends ReconfigurableBase
353355
DFS_DATANODE_OUTLIERS_REPORT_INTERVAL_KEY,
354356
DFS_DATANODE_MIN_OUTLIER_DETECTION_DISKS_KEY,
355357
DFS_DATANODE_SLOWDISK_LOW_THRESHOLD_MS_KEY,
358+
DFS_DATANODE_MAX_SLOWDISKS_TO_EXCLUDE_KEY,
356359
FS_DU_INTERVAL_KEY,
357360
FS_GETSPACEUSED_JITTER_KEY,
358361
FS_GETSPACEUSED_CLASSNAME));
@@ -699,6 +702,7 @@ public String reconfigurePropertyImpl(String property, String newVal)
699702
case DFS_DATANODE_OUTLIERS_REPORT_INTERVAL_KEY:
700703
case DFS_DATANODE_MIN_OUTLIER_DETECTION_DISKS_KEY:
701704
case DFS_DATANODE_SLOWDISK_LOW_THRESHOLD_MS_KEY:
705+
case DFS_DATANODE_MAX_SLOWDISKS_TO_EXCLUDE_KEY:
702706
return reconfSlowDiskParameters(property, newVal);
703707
case FS_DU_INTERVAL_KEY:
704708
case FS_GETSPACEUSED_JITTER_KEY:
@@ -877,6 +881,12 @@ private String reconfSlowDiskParameters(String property, String newVal)
877881
Long.parseLong(newVal));
878882
result = Long.toString(threshold);
879883
diskMetrics.setLowThresholdMs(threshold);
884+
} else if (property.equals(DFS_DATANODE_MAX_SLOWDISKS_TO_EXCLUDE_KEY)) {
885+
checkNotNull(diskMetrics, "DataNode disk stats may be disabled.");
886+
int maxSlowDisksToExclude = (newVal == null ?
887+
DFS_DATANODE_MAX_SLOWDISKS_TO_EXCLUDE_DEFAULT : Integer.parseInt(newVal));
888+
result = Integer.toString(maxSlowDisksToExclude);
889+
diskMetrics.setMaxSlowDisksToExclude(maxSlowDisksToExclude);
880890
}
881891
LOG.info("RECONFIGURE* changed {} to {}", property, newVal);
882892
return result;

hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/metrics/DataNodeDiskMetrics.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public class DataNodeDiskMetrics {
8080
/**
8181
* The number of slow disks that needs to be excluded.
8282
*/
83-
private int maxSlowDisksToExclude;
83+
private volatile int maxSlowDisksToExclude;
8484
/**
8585
* List of slow disks that need to be excluded.
8686
*/
@@ -274,6 +274,14 @@ public List<String> getSlowDisksToExclude() {
274274
return slowDisksToExclude;
275275
}
276276

277+
public int getMaxSlowDisksToExclude() {
278+
return maxSlowDisksToExclude;
279+
}
280+
281+
public void setMaxSlowDisksToExclude(int maxSlowDisksToExclude) {
282+
this.maxSlowDisksToExclude = maxSlowDisksToExclude;
283+
}
284+
277285
public void setLowThresholdMs(long thresholdMs) {
278286
Preconditions.checkArgument(thresholdMs > 0,
279287
DFS_DATANODE_SLOWDISK_LOW_THRESHOLD_MS_KEY + " should be larger than 0");

hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeReconfiguration.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_MIN_OUTLIER_DETECTION_DISKS_KEY;
4646
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_OUTLIERS_REPORT_INTERVAL_KEY;
4747
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_SLOWDISK_LOW_THRESHOLD_MS_KEY;
48+
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_MAX_SLOWDISKS_TO_EXCLUDE_KEY;
4849
import static org.junit.Assert.assertEquals;
4950
import static org.junit.Assert.assertFalse;
5051
import static org.junit.Assert.assertNull;
@@ -636,13 +637,15 @@ public void testSlowDiskParameters() throws ReconfigurationException, IOExceptio
636637
String[] slowDisksParameters2 = {
637638
DFS_DATANODE_FILEIO_PROFILING_SAMPLING_PERCENTAGE_KEY,
638639
DFS_DATANODE_MIN_OUTLIER_DETECTION_DISKS_KEY,
639-
DFS_DATANODE_SLOWDISK_LOW_THRESHOLD_MS_KEY};
640+
DFS_DATANODE_SLOWDISK_LOW_THRESHOLD_MS_KEY,
641+
DFS_DATANODE_MAX_SLOWDISKS_TO_EXCLUDE_KEY};
640642
for (String parameter : slowDisksParameters2) {
641643
dn.reconfigureProperty(parameter, "99");
642644
}
643645
// Assert diskMetrics.
644646
assertEquals(99, dn.getDiskMetrics().getMinOutlierDetectionDisks());
645647
assertEquals(99, dn.getDiskMetrics().getLowThresholdMs());
648+
assertEquals(99, dn.getDiskMetrics().getMaxSlowDisksToExclude());
646649
// Assert dnConf.
647650
assertTrue(dn.getDnConf().diskStatsEnabled);
648651
// Assert profilingEventHook.
@@ -673,12 +676,16 @@ public void testSlowDiskParameters() throws ReconfigurationException, IOExceptio
673676
dn.reconfigureProperty(DFS_DATANODE_FILEIO_PROFILING_SAMPLING_PERCENTAGE_KEY, "1");
674677
dn.reconfigureProperty(DFS_DATANODE_MIN_OUTLIER_DETECTION_DISKS_KEY, null);
675678
dn.reconfigureProperty(DFS_DATANODE_SLOWDISK_LOW_THRESHOLD_MS_KEY, null);
679+
dn.reconfigureProperty(DFS_DATANODE_MAX_SLOWDISKS_TO_EXCLUDE_KEY, null);
676680
assertEquals(String.format("expect %s is not configured",
677681
DFS_DATANODE_MIN_OUTLIER_DETECTION_DISKS_KEY), null,
678682
dn.getConf().get(DFS_DATANODE_MIN_OUTLIER_DETECTION_DISKS_KEY));
679683
assertEquals(String.format("expect %s is not configured",
680684
DFS_DATANODE_SLOWDISK_LOW_THRESHOLD_MS_KEY), null,
681685
dn.getConf().get(DFS_DATANODE_SLOWDISK_LOW_THRESHOLD_MS_KEY));
686+
assertEquals(String.format("expect %s is not configured",
687+
DFS_DATANODE_MAX_SLOWDISKS_TO_EXCLUDE_KEY), null,
688+
dn.getConf().get(DFS_DATANODE_MAX_SLOWDISKS_TO_EXCLUDE_KEY));
682689
assertEquals(DFS_DATANODE_MIN_OUTLIER_DETECTION_DISKS_DEFAULT,
683690
dn.getDiskMetrics().getSlowDiskDetector().getMinOutlierDetectionNodes());
684691
assertEquals(DFS_DATANODE_SLOWDISK_LOW_THRESHOLD_MS_DEFAULT,

hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/TestDFSAdmin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ public void testDataNodeGetReconfigurableProperties() throws IOException, Interr
345345
final List<String> outs = Lists.newArrayList();
346346
final List<String> errs = Lists.newArrayList();
347347
getReconfigurableProperties("datanode", address, outs, errs);
348-
assertEquals(19, outs.size());
348+
assertEquals(20, outs.size());
349349
assertEquals(DFSConfigKeys.DFS_DATANODE_DATA_DIR_KEY, outs.get(1));
350350
}
351351

0 commit comments

Comments
 (0)