分享

关于hadoop的一些疑问

hdfs   get  或者put的时候是blocks的读写并行还是串行的?写得时候文件是切分成几个block文件还是通过index来方式,读的时候文件怎么合并的,调试源码太费劲了,mapreduce肯定是并行读写
mapreduce在client提交任务的后,applicationMaster申请资源,这时是为map和reduce都申请了资源吗,reduce是什么时候获得资源的,reduce任务需要等map执行完才开始任务吗?



已有(5)人评论

跳转到指定楼层
nextuser 发表于 2018-5-9 17:56:44
hdfs   get  或者put的时候是blocks的读写并行还是串行的?
hdfs的读写应该都是串行的。

写得时候文件是切分成几个block文件还是通过index来方式
写的是时候是切分block,当然block还会在切分为packet

读的时候文件怎么合并的,
读取的时候,通过FileSystem对象的open方法来打开文件,通过DFSInputStream对象的read()方法来读取文件。当然合并应该也是这个对象。读取完毕,FSDataInputStream调用close()方法关闭文件读取。
调试源码太费劲了,mapreduce肯定是并行读写
mapreduce在client提交任务的后,applicationMaster申请资源,这时是为map和reduce都申请了资源吗,reduce是什么时候获得资源的,reduce任务需要等map执行完才开始任务吗?
任务执行的时候,不分map和reduce,会统一计算资源,如果不够会预留。

详细看下图
1.png
   MapReduce的执行过程如上图。首先,client向ResourceManager发出任务请求。Resource Manager指定一个NodeManager启动其ApplicationMaster。ApplicationMaster将计算任务反馈给Resource Manager。ApplicationMaster将任务分割分发到不同的NodeManager。NodeManager启动Task执行work。

reduce任务的请求直到至少5%的map任务完成才会被提出。同时这个是可以被配置的。



回复

使用道具 举报

恋枫缩影 发表于 2018-5-9 09:03:04
建议你去了解下namenode、datenode工作原理!
回复

使用道具 举报

nextuser 发表于 2018-5-9 17:59:00
这里补充下关于hdfs的读取写原理:

HDFS读原理

20170211232834518.png


  • 客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说,这个对象时分布文件系统的一个实例;
  • DistributedFileSystem通过使用RPC来调用NameNode以确定文件起始块的位置,同一Block按照重复数会返回多个位置,这些位置按照Hadoop集群拓扑结构排序,距离客户端近的排在前面 (详见第三章)
  • 前两步会返回一个FSDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流,客户端对这个输入流调用read()方法
  • 存储着文件起始块的DataNode地址的DFSInputStream随即连接距离最近的DataNode,通过对数据流反复调用read()方法,将数据从DataNode传输到客户端
  • 到达块的末端时,DFSInputStream会关闭与该DataNode的连接,然后寻找下一个块的最佳DataNode,这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流
  • 一旦客户端完成读取,就对FSDataInputStream调用close()方法关闭文件读取


HDFS写原理


2.X版本默认block的大小是 128M。


20170211004630661.png


1. Client将FileA按64M分块。分成两块,block1和Block2;
2. Client向nameNode发送写数据请求,如图蓝色虚线①——>
3. NameNode节点,记录block信息。并返回可用的DataNode,如粉色虚线②———>
Block1: host2,host1,host3
Block2: host7,host8,host4
4. client向DataNode发送block1;发送过程是以流式写入,流式写入过程如下:
- 将64M的block1按64k的packet划分
- 然后将第一个packet发送给host2
- host2接收完后,将第一个packet发送给host1,同时client向host2发送第二个packet
- host1接收完第一个packet后,发送给host3,同时接收host2发来的第二个packet
- 以此类推,如图红线实线所示,直到将block1发送完毕
- host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。如图粉红颜色实线所示
- client收到host2发来的消息后,向namenode发送消息,说我写完了。这样就真完成了。如图黄色粗实线
- 发送完block1后,再向host7,host8,host4发送block2,如图蓝色实线所示。


参考:
https://blog.csdn.net/liuguangrong/article/details/52906933
回复

使用道具 举报

jinwensc 发表于 2018-5-9 18:30:08
nextuser 发表于 2018-5-9 17:59
这里补充下关于hdfs的读取写原理:

HDFS读原理

你讲的好详细,我以前没见过这样的版本,谢谢
回复

使用道具 举报

nextuser 发表于 2018-5-9 18:49:26
jinwensc 发表于 2018-5-9 18:30
你讲的好详细,我以前没见过这样的版本,谢谢

相互帮助
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条