クラスタdatanodeノードの失敗によるhdfs書き込みの失敗

3561 ワード

ここ数日杭州クラスタはアップグレードの過度な時期にあるため、任務量が大きく、クラスタノードが少ない(4つのDN)、クラスタは絶えず問題が発生し、flume収集データに誤りが発生し、データが失われた.
データの紛失が発生したら、最初にナイフを持ってきたのはデータ収集です.いいですか.flumeのエラーログを見てみましょう.
Caused by: java.io.IOException: Failed to add a datanode.  User may turn off this feature by setting dfs.client.block.write.replace-datanode-on-failure.policy in configuration, where the current policy is DEFAULT.  (Nodes: current=[10.0.2.163:50010, 10.0.2.164:50010], original=[10.0.2.163:50010, 10.0.2.164:50010])
  at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.findNewDatanode(DFSOutputStream.java:817)
  at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.addDatanode2ExistingPipeline(DFSOutputStream.java:877)
  at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.setupPipelineForAppendOrRecovery(DFSOutputStream.java:983)
  at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.processDatanodeError(DFSOutputStream.java:780)
  at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:449)

エラー:
Failed to add a datanode. User may turn off this feature by setting dfs.client.block.write.replace-datanode-on-failure.policy in configuration, where the current policy is DEFAULT
ログではDNの追加に失敗し、dfs.client.block.write.replace-datanode-on-failure.policyプロパティを閉じる必要があります.しかし、ノードを追加していませんか?問題はそんなに簡単ではないようだ.
上記のパラメータ構成について、公式構成ドキュメントを表示します.
パラメータ
デフォルト
説明
dfs.client.block.write.replace-datanode-on-failure.enable
true
If there is a datanode/network failure in the write pipeline, DFSClient will try to remove the failed datanode from the pipeline and then continue writing with the remaining datanodes. As a result, the number of datanodes in the pipeline is decreased. The feature is to add new datanodes to the pipeline. This is a site-wide property to enable/disable the feature. When the cluster size is extremely small, e.g. 3 nodes or less, cluster administrators may want to set the policy to NEVER in the default configuration file or disable this feature. Otherwise, users may experience an unusually high rate of pipeline failures since it is impossible to find new datanodes for replacement. See also dfs.client.block.write.replace-datanode-on-failure.policy
 dfs.client.block.write.replace-datanode-on-failure.policy
 DEFAULT
 This property is used only if the value of dfs.client.block.write.replace-datanode-on-failure.enable is true. ALWAYS: always add a new datanode when an existing datanode is removed. NEVER: never add a new datanode. DEFAULT: Let r be the replication number. Let n be the number of existing datanodes. Add a new datanode only if r is greater than or equal to 3 and either (1) floor(r/2) is greater than or equal to n; or (2) r is greater than n and the block is hflushed/appended.
ソース:https://hadoop.apache.org/docs/current2/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
次にソースコードの位置を探してdfsclientの中で、クライアントがpipelineでデータブロックを書く時の問題であることを発見して、2つの関連するパラメータも見つけました:dfs.client.block.write.replace-datanode-on-failure.enable dfs.client.block.write.replace-datanode-on-failure.policyの前者は,クライアントが書き込みに失敗したときに交換ポリシーを使用するかどうかであり,デフォルトではtrueで問題ない.後者は、交換ポリシーの詳細で、デフォルトはdefaultです.defaultが3つ以上バックアップした場合、ノードを交換しようとした回数は?次datanode.2つのバックアップの場合、datanodeを交換せずに、直接書き始めます.
私のノードは4つしかないので、クラスタ負荷が高すぎると、同時に2台以上のDNが応答しないと、HDFS書き込みの問題が発生します.クラスタが比較的小さい場合、この特性を閉じることができます.
参照先:
hadoopのdatanodeのエラー追跡を記録します
Where can I set dfs.client.block.write.replace-datanode-on-failure.enable?
cdh 4 vs cdh 3 client処理DataNode異常の違い