一 初始

群起hdfs 集群-start-hdfs.sh
在这里插入图片描述

hadoop fs -appendToFile 3 /2

20/07/15 09:29:18 INFO hdfs.DFSClient: Exception in createBlockOutputStream
java.io.IOException: Got error, status message , ack with firstBadLink as 172.21.0.7:50010
	at org.apache.hadoop.hdfs.protocol.datatransfer.DataTransferProtoUtil.checkBlockOpStatus(DataTransferProtoUtil.java:140)
	at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1363)
	at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.setupPipelineForAppendOrRecovery(DFSOutputStream.java:1188)
	at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:455)
20/07/15 09:29:18 WARN hdfs.DFSClient: Error Recovery for block BP-31621113-127.0.0.1-1594741021462:blk_1073741841_1021 in pipeline DatanodeInfoWithStorage[106.55.63.155:50010,DS-37f9b2de-2d14-4193-9767-e247b6058ae9,DISK], DatanodeInfoWithStorage[120.53.240.85:50010,DS-53d8f2de-e259-4361-b878-1a1a96225ef7,DISK], DatanodeInfoWithStorage[172.21.0.7:50010,DS-4f026c85-cdc7-446e-9664-478aac9a5d0f,DISK]: bad datanode DatanodeInfoWithStorage[172.21.0.7:50010,DS-4f026c85-cdc7-446e-9664-478aac9a5d0f,DISK]
20/07/15 09:29:19 WARN hdfs.DFSClient: DataStreamer Exception
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[106.55.63.155:50010,DS-37f9b2de-2d14-4193-9767-e247b6058ae9,DISK], DatanodeInfoWithStorage[120.53.240.85:50010,DS-53d8f2de-e259-4361-b878-1a1a96225ef7,DISK]], original=[DatanodeInfoWithStorage[106.55.63.155:50010,DS-37f9b2de-2d14-4193-9767-e247b6058ae9,DISK], DatanodeInfoWithStorage[120.53.240.85:50010,DS-53d8f2de-e259-4361-b878-1a1a96225ef7,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:918)
	at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.addDatanode2ExistingPipeline(DFSOutputStream.java:992)
	at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.setupPipelineForAppendOrRecovery(DFSOutputStream.java:1160)
	at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:455)
20/07/15 09:29:19 ERROR hdfs.DFSClient: Failed to close inode 16424
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[106.55.63.155:50010,DS-37f9b2de-2d14-4193-9767-e247b6058ae9,DISK], DatanodeInfoWithStorage[120.53.240.85:50010,DS-53d8f2de-e259-4361-b878-1a1a96225ef7,DISK]], original=[DatanodeInfoWithStorage[106.55.63.155:50010,DS-37f9b2de-2d14-4193-9767-e247b6058ae9,DISK], DatanodeInfoWithStorage[120.53.240.85:50010,DS-53d8f2de-e259-4361-b878-1a1a96225ef7,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:918)
	at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.addDatanode2ExistingPipeline(DFSOutputStream.java:992)
	at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.setupPipelineForAppendOrRecovery(DFSOutputStream.java:1160)
	at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:455)

关闭防火墙 这是百分99% 人说的话 ,我这里也跟风说一下 (不过我这里是云服务器 默认是关闭的 因为之前关过 告诉我 未启动)

终止集群 stop-dfs.sh

解决办法:修改hdfs-site.xml文件,添加或者修改如下两项:

<!-- appendToFile追加 -->
<property>
       <name>dfs.support.append</name>
       <value>true</value>
</property>

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

<property>
       <name>dfs.client.block.write.replace-datanode-on-failure.enable</name>
       <value>true</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的集群,只要一个节点没响应写入就会出问题,所以可以关掉,并且加上 即使有节点写入失败 也可以继续写入 而不抛出异常

xsync 分开一下修改hdfs 文件
然后重启集群

错误2

hadoop fs -appendToFile 3 /2

appendToFile: Failed to APPEND_FILE /2 for DFSClient_NONMAPREDUCE_-1712095260_1 on 172.21.0.7 because lease recovery is in progress. Try again later.

在网上找了一上午
发现就这篇博客还是说的很有道理
https://blog.csdn.net/PTtaoge/article/details/85259327
在这里插入图片描述

Lease 的机制:
hdfs支持write-once-read-many,也就是说不支持并行写,那么对读写的互斥同步就是靠Lease实现的。Lease说白了就是一个有时间约束的锁。客户端写文件时需要先申请一个Lease,对应到namenode中的LeaseManager,客户端的client name就作为一个lease的holder,即租约持有者。LeaseManager维护了文件的path与lease的对应关系,还有clientname->lease的对应关系。LeaseManager中有两个时间限制:softLimitand hardLimit。

软限制就是写文件时规定的租约超时时间,硬限制则是考虑到文件close时未来得及释放lease的情况强制回收租约。
LeaseManager中还有一个Monitor线程来检测Lease是否超过hardLimit。而软租约的超时检测则在DFSClient的LeaseChecker中进行。
当客户端(DFSClient)create一个文件的时候,会通过RPC 调用 namenode 的createFile方法来创建文件。进而又调用FSNameSystem的startFile方法,又调用 LeaseManager 的addLease方法为新创建的文件添加一个lease。如果lease已存在,则更新该lease的lastUpdate (最近更新时间)值,并将该文件的path对应该lease上。之后DFSClient 将该文件的path 添加 LeaseChecker中。文件创建成功后,守护线程LeaseChecker会每隔一定时间间隔renew该DFSClient所拥有的lease。

LeaseManagement是HDFS中的一个同步机制,用于保证同一时刻只有一个client对一个文件进行写或创建操作。如当 新建一个文件f时,client向NameNode发起一个create请求,那么leaseManager会想该client分配一个f文件的 lease。client凭借该lease完成文件的创建操作。此时其他client无法获得f的当client长时间(默认为超过1min)不进行操作 时,发放的lease将被收回。

如果有想了解hadoop租约锁(lease)等概念 可以百度一下哈 这里我就不多说了

–感觉自己找对了 但是根据对方博客写的 对于初入大数据的我 真心不会搞~

另起炉灶-不明所以就OK 了

我不顶着我hadoop 50070 上已传的文件进行追加 --既然锁没有释放&回收(不清楚怎么设置),我重新在本地创建一个文件 然后上传~,再追加
就成功了
在这里插入图片描述

个人自省 --大概率 跟网卡配置/网络,有一定关系 (我这服务器 有两台 同地域 另一台是别的地域 …而且用的 是 “基础网络”)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐