【问题标题】:when need to set Block replication to 1何时需要将 Block replication 设置为 1
【发布时间】:2018-07-10 04:22:29
【问题描述】:

我们在 Spark 日志中得到以下信息:

java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try. (Nodes: current=[DatanodeInfoWithStorage DatanodeInfoWithStorage\
The current failed datanode replacement policy is DEFAULT, and a client may configure this via 'dfs.client.block.write.replace-datanode-on-failure.policy' in its configuration.
at org.apache.hadoop.hdfs

.DFSOutputStream$DataStreamer.findNewDatanode(DFSOutputStream.java:1036)

我的 Ambari 集群只有 3 台 worker 机器,每个 worker 只有一个数据盘。

我在 Google 上搜索,发现解决方案可能是关于块复制。 HDFS 中的块复制默认配置为 3,我发现建议将“块复制”设置为 1 而不是 3。

问题:这有意义吗?

此外,我的工作机器只有一个数据磁盘这一事实是否会成为问题的一部分?

块复制 = 文件系统中的文件总数将在 dfs.replication 因子设置中指定 dfs.replication=1,表示将文件中的文件只复制一份 系统。

完整日志:

java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try. (Nodes: current=[DatanodeInfoWithStorage[34.2.31.31:50010,DS-8234bb39-0fd4-49be-98ba-32080bc24fa9,DISK], DatanodeInfoWithStorage[34.2.31.33:50010,DS-b4758979-52a2-4238-99f0-1b5ec45a7e25,DISK]], original=[DatanodeInfoWithStorage[34.2.31.31:50010,DS-8234bb39-0fd4-49be-98ba-32080bc24fa9,DISK], DatanodeInfoWithStorage[34.2.31.33:50010,DS-b4758979-52a2-4238-99f0-1b5ec45a7e25,DISK]]). The current failed datanode replacement policy is DEFAULT, and a client may configure this via 'dfs.client.block.write.replace-datanode-on-failure.policy' in its configuration.
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.findNewDatanode(DFSOutputStream.java:1036)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.addDatanode2ExistingPipeline(DFSOutputStream.java:1110)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.setupPipelineForAppendOrRecovery(DFSOutputStream.java:1268)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.processDatanodeError(DFSOutputStream.java:993)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:500)
---2018-01-30T15:15:15.015 INFO  [][][] [dal.locations.LocationsDataFramesHandler] 

【问题讨论】:

  • 将 1 设置为复制,如果出现任何问题,可能无法恢复。你为什么要这样做?
  • 我认为设置它是因为我的问题中描述的日志中的错误,如果您认为“由于没有更多好的数据节点而无法替换现有管道上的坏数据节点”的其他解决方案可以尝试”我很高兴知道它
  • 我看到了其他一些关于我的问题的链接 - community.hortonworks.com/questions/27153/…
  • 他们建议设置以下内容:dfs.client.block.write.replace-datanode-on-failure.policy=ALWAYS dfs.client.block.write.replace-datanode-on-failure .best-effort=true ,但是在哪里设置这个值,在我的 ambari 集群中看不到它们

标签: linux hadoop apache-spark hdfs ambari


【解决方案1】:

我遇到了同样的问题。默认的块复制是 3。因此,所有文件都使用复制因子 3 创建,除非您另外指定。

如果任何数据节点不可访问(网络问题或磁盘没有剩余空间),则复制将失败。

使用以下命令检查数据节点状态:

hdfs dfsadmin -report

就我而言,我有 2 个正在开发中的节点,1 个是主节点,1 个是数据节点。因此,我将复制因子更改为 1。

您可以先从 hdfs cli 进行测试,如下所示:

    echo "test file line1" > copy1
    echo "test file line2" >  copy2
    hdfs dfs -Ddfs.replication=1 -touchz /tmp/appendtest.txt
    hdfs dfs -appendToFile copy1 /tmp/appendtest.txt
    hdfs dfs -appendToFile copy2 /tmp/appendtest.txt

如果在touchz命令中,你没有指定复制因子,当你尝试追加本地文件copy2时,你会得到同样的错误

hdfsConfig 对象的以下配置为我解决了这个问题:

  hdfsConfiguration.set("fs.defaultFS", configuration.getString("hdfs.uri"))
  hdfsConfiguration.set("fs.hdfs.impl", classOf[org.apache.hadoop.hdfs.DistributedFileSystem].getName)
  hdfsConfiguration.set("fs.file.impl", classOf[org.apache.hadoop.fs.LocalFileSystem].getName)
  hdfsConfiguration.set("dfs.support.append", "true")
  hdfsConfiguration.set("dfs.replication", "1")

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    相关资源
    最近更新 更多