Hadoop爬坑记——HDFS文件因Hadoop版本原因导致的追加问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop爬坑记——HDFS文件因Hadoop版本原因导致的追加问题相关的知识,希望对你有一定的参考价值。

参考技术A 今日在练习HDFS文件的读取输出,写入,追加写入时,
读取输出,写入都没问题,在追加写入时出现了问题。
报错如下:

2017-07-14 10:50:00,046 WARN [org.apache.hadoop.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[192.168.153.138:50010,DS-1757abd0-ffc8-4320-a277-3dfb1022533e,DISK], DatanodeInfoWithStorage[192.168.153.137:50010,DS-ddd9a357-58d6-4c2a-921e-c16087974edb,DISK]], original=[DatanodeInfoWithStorage[192.168.153.138:50010,DS-1757abd0-ffc8-4320-a277-3dfb1022533e,DISK], DatanodeInfoWithStorage[192.168.153.137:50010,DS-ddd9a357-58d6-4c2a-921e-c16087974edb,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)
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[192.168.153.138:50010,DS-1757abd0-ffc8-4320-a277-3dfb1022533e,DISK], DatanodeInfoWithStorage[192.168.153.137:50010,DS-ddd9a357-58d6-4c2a-921e-c16087974edb,DISK]], original=[DatanodeInfoWithStorage[192.168.153.138:50010,DS-1757abd0-ffc8-4320-a277-3dfb1022533e,DISK], DatanodeInfoWithStorage[192.168.153.137:50010,DS-ddd9a357-58d6-4c2a-921e-c16087974edb,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)
2017-07-14 10:50:00,052 ERROR [org.apache.hadoop.hdfs.DFSClient] - Failed to close inode 16762
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[192.168.153.138:50010,DS-1757abd0-ffc8-4320-a277-3dfb1022533e,DISK], DatanodeInfoWithStorage[192.168.153.137:50010,DS-ddd9a357-58d6-4c2a-921e-c16087974edb,DISK]], original=[DatanodeInfoWithStorage[192.168.153.138:50010,DS-1757abd0-ffc8-4320-a277-3dfb1022533e,DISK], DatanodeInfoWithStorage[192.168.153.137:50010,DS-ddd9a357-58d6-4c2a-921e-c16087974edb,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)

添加上

之后报错如下:
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.protocol.AlreadyBeingCreatedException): Failed to APPEND_FILE /weather/output/abc.txt for DFSClient_NONMAPREDUCE_1964095166_1 on 192.168.153.1 because this file lease is currently owned by DFSClient_NONMAPREDUCE_-590151867_1 on 192.168.153.1

然后再添加

完事就没问题了。

Hadoop核心--HDFS

什么是HDFS?

  HDFS(Hadoop Distributed File System),分布式文件存储系统。源自于Google的GFS论文,是GFS的克隆版。与其他分布式文件系统相比,它具有很高的容错能力,适合部署在廉价的机器上;另外它能提供高吞吐量的数据访问,适合海量数据的存储。

HDFS特点

  易于扩展

  运行在普通廉价的机器上,提供容错机制

  为大量用户提供高性能的海量数据存储服务

HDFS架构体系

HDFS架构主要包括一个NameNode、多个DataNode、Block等。   

一、数据块 Block

   HDFS上的文件被切分成块进行存储,每个块的默认大小为64M,它是文件存储处理的逻辑单元。每个块有多个副本存储在不同的机器上,这是Hadoop的容错机制。

 二、节点

  1、NameNode

    HDFS也是一种主从架构,而NameNode就属于主节点,主要负责管理文件系统的命名空间以及客户端对文件的访问。

  2、DataNode

    属于从节点,主要负责处理文件内容的读写请求。数据块在DataNode上是以文件形式存储在磁盘上,包括数据本身和元数据两部分。 

  3、SecondaryNameNode

    辅助NameNode工作,它可以节省NameNode读取FsImage的时间(后面会介绍)

三、数据管理

  NameNode中存储的是元数据,记录了数据所在DataNode的Block。当向HDFS写入数据时,首先是NameNode记录元数据,并告知要写入的DataNode节点地址,然后真正进行数据写入的是DataNode节点。而写入DataNode节点的block,也会复制备份到邻近DataNode节点上,这也是数据安全性的一个重要保障。

四、数据容错

  读取数据时,即DataNode读取Block,首先会计算checksum,如果此时的checksum与初始建立的值不一致时,则认为该Block已损坏。此时会重新从最近的备份DataNode上读取Block,同时NameNode也会标记该Block已损坏,并从其他DataNode节点将数据进行修复,然后还需要继续验证其checksum。

五、启动流程

  1、NameNode格式化,然后在持久化fsimage(镜像)和edits(日志)

  2、启动NameNode,并且加载fsimage和edits文件

  3、启动DataNode,并向NameNode进行注册,发送Block report

  4、创建目录,此时会伴随fsimage和edits文件的更新

  5、存放文件,也会伴随fsimage和edits文件的更新

  以上就是HDFS启动的基本流程,在这个过程中,还有一个概念是安全模式。这是HDFS在启动过程中的一个文件保护模式,具体流程是,当NameNode启动时,需要加载fsimage和edits文件信息,其实就是更新NameNode元数据的过程。此时HDFS就进入了安全模式,在该模式下,只能从HDFS读取文件,但是无法写入,目的就是防止对NameNode载入产生影响。当NameNode加载fsimage和edits文件完成后,30s后会自动退出安全模式。

  在介绍HDFS节点时,还提到了一个SecondaryNameNode节点,它的作用是辅助NameNode,具体的流程是:在NameNode启动时,需要加载fsimage和edits文件,那么如何缩短读取时间呢?SecondaryNameNode就起作用了,它会定期(默认1h)对fsimage和edits文件进行合并,这样当再次启动NameNode时,读取的是合并后的fsimage和edits文件,效率就提高了,读取时间相对缩短。具体流程如下:

以上是关于Hadoop爬坑记——HDFS文件因Hadoop版本原因导致的追加问题的主要内容,如果未能解决你的问题,请参考以下文章

KVM主机在线增加硬盘爬坑记

hadoop:hdfs:为什么不适合大量小文件的存储

hadoop 之Hadoop生态系统

hadoop 的组建概述

Hadoop十大核心组件

怎样使用命令行将hdfs上面的目录删除