Hadoop FSDataset中,dfs.datanode.du.reserved 参数选项之BUG
在DN的hadoop-site.xml中配置了选项:<property>
<name>dfs.datanode.du.reserved</name>
<value>1024</value>
</property>
这样是为了保证每个磁盘写入点能预留1K的空间来,而不是让DN将每个磁盘写入点写满,以导致M/R写local文件是发生磁盘空间不够而失败,甚至启动DN时也有可能失败(DN在启动时会初使化本地临时目录)。但是最近发现,这个配置选项并没有生效,还是有很多DN上的磁盘被写满了。究其代码,就发现了问题:
long getCapacity() throws IOException {
- if (reserved > usage.getCapacity()) {
- return 0;
- }
-
- return usage.getCapacity()-reserved;
+ long remaining = usage.getCapacity() - reserved;
+ return remaining > 0 ? remaining : 0;
}
long getAvailable() throws IOException {
long remaining = getCapacity()-getDfsUsed();
- long available = usage.getAvailable();
+ long available = usage.getAvailable() - reserved;
if (remaining>available) {
remaining = available;
}
return (remaining > 0) ? remaining : 0;
}
前一个修改是为了避免getCapacity() 被调用两次,该bug也是hadoop jira的一个close掉的bug。
后一个修改就是该bug所在。在比较remaining和available这两个变量的时候,remaining其实是减过reserved的,但available却没有,这样就导致计算磁盘剩余空间的时候出现问题,所以让available也减一下,这样就合理了。
-HADOOP-0.19.2
页:
[1]