1. 程式人生 > >java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more good d

java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more good d

    java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try

原因:

    無法寫入;我的環境中有3個datanode,備份數量設定的是3。在寫操作時,它會在pipeline中寫3個機器。預設replace-datanode-on-failure.policy是DEFAULT,如果系統中的datanode大於等於3,它會找另外一個datanode來拷貝。目前機器只有3臺,因此只要一臺datanode出問題,就一直無法寫入成功。

解決辦法:

    修改hdfs-site.xml檔案,新增或者修改如下兩項:

    <property>

        <name>dfs.client.block.write.replace-datanode-on-failure.enable</name>         <value>true</value>

    </property>

   

    <property>

    <name>dfs.client.block.write.replace-datanode-on-failure.policy</name>

        <value>NEVER</value>

    </property>

    對於dfs.client.block.write.replace-datanode-on-failure.enable,客戶端在寫失敗的時候,是否使用更換策略,預設是true沒有問題

    對於,dfs.client.block.write.replace-datanode-on-failure.policy,default在3個或以上備份的時候,是會嘗試更換結點嘗試寫入datanode。而在兩個備份的時候,不更換datanode,直接開始寫。對於3個datanode的叢集,只要一個節點沒響應寫入就會出問題,所以可以關掉。