论坛首页 Java企业应用论坛

Hadoop FSDataset中,dfs.datanode.du.reserved 参数选项之BUG

浏览 2432 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-02-23   最后修改:2010-04-11
在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
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics