HDFS的写

HDFS的写文件的流程:

写入数据的流程

1:客户端向远程的NameNode 发送一个RPC请求

2:NameNode 会检查所要创建的文件是否存在,操作的用户是否具有操作的权限,成功的话,会给文件创建一个

记录,失败的话,会抛出异常

3:客户端开始写入文件,首先会将文件分成是多个data packet,并在内部以 data queue的形式进行管理,

向namenode 申请新的blocks ,并且获取datanode列表,

4:然后是以pipline的形式来进行数据的写入,当在一个datanode 的上面写入完成之后,

然后继续写入下一个datanode,依次写完之后,

然后返回给客户端一个ack

5:然后客户端将这些返回的进行移除。

6:如果在写入的时候,有一个datanode的写入出现了错误的话,

当前的datanode 会从pipline之中移除,然后就是建立新的pipline。

将新的datanode 传入到队列之中。

另外的一种理解:

写入的时候 首先是写入本地的缓存之中的,如果写入的数据的长度小于本地缓存的话,

那么数据是保存在缓存之中的,输出流关闭的话,本地缓存之中的数据就是会写入到datanode的上面,同时数据是会加上一个校验和的。

如果写入的数据大于缓存的现有的空余的话,那么就是会将数据进行一个校验和,

然后将数据发送出去。

(注意 这里的本地缓存指的是客户端缓存)

本地缓存的大小是可以设置的。

然后就是在写入的过程之中,到底选择哪一个datanode作为写入的副本节点:

这个就是涉及到了机架感知策略。换一种方式来说,就是hdfs副本的写入策略,

对于集群来说,如果文件的存储总是集中在同一个机器上面的,那么就是会出现负载不均衡的情况。

所以了解机架感知策略,就是十分必要的:

hdfs写入副本的时候,首先是在本地节点写入文件的块的副本,然后就是

在相同机架上的不同节点上面写入副本,在然后就是在不同机架上的节点上面写入。


一般来说,默认的搭建的hadoop集群的机架的名字都是default-rack

如果不去做调节的话,即使机器所处于不同的节点,那么表现出来的也是处于同一个机架。


启动集群之后 ,可以在namenode节点上面的日志之中发现 机架的名称是default-rack


启动hadoop集群,机架的表示

配置机架感知策略:

core-site.xml 之中配置机架感知策略

value 的值 后面写的是 自己书写的java的类的名字。

给出自己所写的机架感知的类:





然后把类所属的jar包放置到hadoop集群的目录之中,



这个路径是我将我的jar包在hadoop目录上存放的位置。


hdfs 写入数据的时候,会有一个小的概念:

数据的校验

就是用户在往hdfs上面写入数据的时候,为512个字节生成一个校验码,

然后将校验码和数据一同发送到数据节点,一共写入多个datanode,

是在最后的datanode上面进行校验和的校验。

然后读取文件的时候 同样也是会将校验和发送到客户端 然后进行校验的。

校验成功之后 会发送消息给datanode

然后data回更新校验和的日志文件。

同时在datanode的后台是会有daemon线程 来以三周为一个周期,来扫描

存储的块的文件,防止放置的文件发生损坏。


校验和的长度是32位 4个字节。

可以通过在core-site.xml文件之中配置参数,

可以调整生成校验和的字节的长度。

设置io.bytes.per.checksum 可以调整生成checkSum的字节的长度。

但是不能大于io.file.buffer.zise 。

你可能感兴趣的:(HDFS的写)