分享

各位大侠帮忙分析个问题数据切块

kaka100 发表于 2015-5-20 17:46:21 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 16176


hadoop中数据块以128M保存,当用户上传数据时是哪个程序切割数据;
是client端的程序
还是datanode程序

我想是client程序切割,是哪个类的哪个方法实现的呢??

谢谢

已有(3)人评论

跳转到指定楼层
yuwenge 发表于 2015-5-20 19:23:54


应该是划分好,放到datanode

写入文件的过程比读取较为复杂:
  • 使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;
  • Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;
  • 当客户端开始写入文件的时候,开发库会将文件切分成多个packets,并在内部以数据队列"data queue"的形式管理这些packets,并向Namenode申请新的blocks,获取用来存储replicas的合适的datanodes列表,列表的大小根据在Namenode中对replication的设置而定。
  • 开始以pipeline(管道)的形式将packet写入所有的replicas中。开发库把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此pipeline中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式。
  • 最后一个datanode成功存储之后会返回一个ack packet,在pipeline里传递至客户端,在客户端的开发库内部维护着"ack queue",成功收到datanode返回的ack packet后会从"ack queue"移除相应的packet。
  • 如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除,剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持replicas设定的数量。


############################
更详细解释:

创建一个新文件的过程:
第一步:客户端通过DistributedFilesystem 对象中的creat()方法来创建文件,此时,RPC会 通过一个RPC链接协议来调用namenode,并在命名空间中创建一个新文件,namenode执行各种权限以及文件isexist 的检查,dfs返回一个输出流,否则抛出 IOEXCEPTION。输出流控制一个DFSoutPutstream,负责处理数据节点和名称节点之间的通信
第二步:客户端开始通过输出流写入数据,DFSoutPutstream将客户端写入的数据分成一个个的数据包包,然后写入到dfs中的一个queue,这些queue中的数据包被dfs中的数据流管理,数据流通过一定的分发机制,将这些数据包形成副本并存放在datanode上,当前例如我们设置的dfs.replication=3,则需要将副本放在三个datanode上,这三个datanode会通过一个管线连接,数据流将包分流给管线中第一个的datanode,这个节点会存储包并且发送给管线中的第二个datanode。同样地,第二个数据节点存储包并且传给管线中第三个datanode

第三步:其实第三步应该归属到第二步里面,上一步中所提到的DFSoutPutstream有一个内部等待确认queue,专门用来存放datanode收到的数据包,只有管线中所有的datanode收到副本并且存储成功返回成功标识后等待确认queue才会移除所有的数据包。大家此时可能要问了,如果在复制过程中管线中的某一个datanode 发生了故障,hadoop是如何处理的呢?这就是hadoop的容错的强大之处了;
首先、管线会关闭,等待确认队列中的所有数据包都会被添加回到数据队列,由此可以保证数据包的完整性和顺序性
其次、当前块中取一个正常的数据节点,使其联系namenode,将故障节点告知namenode、由此下次故障节点恢复后能将里面残留的不完整的副本文件清空。
第四、故障节点被删除,余下的数据包继续写入到剩下的节点中。namenode注意到当前的副本不足(dfs.replication=3),则会在另外一个datanode上安排创建新的副本。
此时问题就来了(挖掘技术哪家强??  ),如果在写入期间,datanode大规模的发生故障怎么办眤??
其实这种情况很少发生但林子大了什么鸟都有是不是,我们在部署hadoop 有一个配置选项:dfs.replication.min  一般默认是1 ,意思就是说只要有一个节点成功,则hdfs就认为本次写入时成功的,后续的它本身会自己去意识到副本数的不足而去进行复制冗余。
最后、书接上文,客户端写入完成后就会通过DistributedFilesystem 调用close()方法,该方法有一个神奇的作用,它会将数据队列剩下的所有包包都放在等待确认queue中,并等待确认,namenode中已经记录下来了所有副本存放的datanode。

回复

使用道具 举报

yuwenge 发表于 2015-5-20 19:28:21
代码分析看看这个

HDFS一个文件由多个block构成。HDFS在进行block读写的时候是以packet(默认每个packet为64K)为单位进行的。每一个packet由若干个chunk(默认512Byte)组成。Chunk是进行数据校验的基本单位,对每一个chunk生成一个校验和(默认4Byte)并将校验和进行存储。

HDFS写入文件的重要概念




回复

使用道具 举报

kaka100 发表于 2015-5-21 08:57:23
非常感谢yuwenge  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条