搜索
搜 索
本版
文章
帖子
用户
图文精华
hadoop-2.6.0+zookeeper-3.4.6+hbase-1.0.0+hive-1.1.0完全分布 ...
首页
Portal
专题
BBS
面试
办公|编程助手
更多
登录
注册
用户组:游客
主题
帖子
云币
我的帖子
我的收藏
我的好友
我的勋章
设置
退出
导读
淘贴
博客
群组
社区VIP
APP下载
今日排行
本周排行
本周热帖
本月排行
本月热帖
会员排行
About云-梭伦科技
»
专题
›
交流区
›
技术交流
›
各位大侠帮忙分析个问题数据切块
0
3
0
分享
各位大侠帮忙分析个问题数据切块
kaka100
发表于 2015-5-20 17:46:21
[显示全部楼层]
阅读模式
关闭右栏
3
16176
About云VIP帮助找工作和提升
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
回复
使用道具
举报
显身卡
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
发表新帖
kaka100
新手上路
关注
6
主题
116
帖子
3
粉丝
TA的主题
cdh 4.1.2 不能格式化想了很多方法都不行,各位帮忙看看
2015-9-15
hive 安装出现问题,各位帮忙看看
2015-8-11
mr 如何实现 网站连续几日uv量统计
2015-8-6
大侠位帮帮忙内存出错了
2015-5-22
各位大侠帮忙分析个问题数据切块
2015-5-20
24小时热文
Flink CDC:新一代实时数据集成框架
蚂蚁面试就是不一样
如何高效学习
人情世故速查速用大全集
框架思维
关闭
推荐
/2
中文版ChatGPT
1.无需魔法 2.提高编程效率 3.提高文档能力
查看 »
新手帮助
新手帮助:注册遇到问题,领取资源,加入铁粉群,不会使用搜索,如何获取积分等
查看 »
意见
反馈