设为首页 收藏本站
查看: 599|回复: 0

[经验分享] Hadoop集群配置中如何写入和读取数据?

[复制链接]

尚未签到

发表于 2016-12-11 09:59:20 | 显示全部楼层 |阅读模式
转载--学习  原著地址  http://developer.iyunv.com/art/201006/204092.htm

本节和大家继续学习一下有关Hadoop集群性能优化中机架感知配置方面的内容,主要包括写入数据和读出数据两大部分,希望通过本节的介绍大家对Hadoop集群中机架感知配置有一定的认识。

Hadoop集群功能测试

以下是分别就配置了机架感知信息和没有配置机架感知信息的hadoopHDFS启动instance进行的数据上传时的测试结果。

写入数据

当没有配置机架信息时,所有的机器hadoop都默认在同一个默认的机架下,名为“/default-rack”,这种情况下,任何一台datanode机器,不管物理上是否属于同一个机架,都会被认为是在同一个机架下,此时,就很容易出现之前提到的增添机架间网络负载的情况。例如,对没有机架信息的hadoopHDFS启动instance上传一个文件,其block信息如下:
从上图可以看出,在没有机架信息的情况下,namenode默认将所有的slaves机器全部默认为在/default-rack下,根据hadoop代码的分析也能知道哦啊,此时在写block时,三个datanode机器的选择完全是随机的。

而当Hadoop集群中配置了机架感知信息以后,hadoop在选择三个datanode时,就会进行相应的判断:

1.如果上传本机不是一个datanode,而是一个客户端,那么就从所有slave机器中随机选择一台datanode作为第一个块的写入机器(datanode1)。
a)而此时如果上传机器本身就是一个datanode(例如mapreduce作业中task通过DFSClient向hdfs写入数据的时候),那么就将该datanode本身作为第一个块写入机器(datanode1)。

2.随后在datanode1所属的机架以外的另外的机架上,随机的选择一台,作为第二个block的写入datanode机器(datanode2)。

3.在写第三个block前,先判断是否前两个datanode是否是在同一个机架上,如果是在同一个机架,那么就尝试在另外一个机架上选择第三个datanode作为写入机器(datanode3)。而如果datanode1和datanode2没有在同一个机架上,则在datanode2所在的机架上选择一台datanode作为datanode3。

4.得到3个datanode的列表以后,从namenode返回该列表到DFSClient之前,会在namenode端首先根据该写入客户端跟datanode列表中每个datanode之间的“距离”由近到远进行一个排序。如果此时DFS写入端不是datanode,则选择datanode列表中的第一个排在第一位。客户端根据这个顺序有近到远的进行数据块的写入。在此,判断两个datanode之间“距离”的算法就比较关键,hadoop目前实现如下,以两个表示datanode的对象DatanodeInfo(node1,node2)为例:
a)首先根据node1和node2对象分别得出两个datanode在整个hdfs集群中所处的层次。这里的层次概念需要解释一下:每个datanode在hdfs集群中所处的层次结构字符串是这样描述的,假设hdfs的拓扑结构如下:

如上图所示,每个datanode都会对应自己在集群中的位置和层次,如node1的位置信息为“/rack1/datanode1”,那么它所处的层次就为2,其余类推。
b)得到两个node的层次后,会沿着每个node所处的拓朴树中的位置向上查找,如“/rack1/datanode1”的上一级就是“/rack1”,此时两个节点之间的距离加1,两个node分别同上向上查找,直到找到共同的祖先节点位置,此时所得的距离数就用来代表两个节点之间的距离。所以,如上图所示,node1和node2之间的距离就为4.
5.当根据“距离”排好序的datanode节点列表返回给DFSClient以后,DFSClient便会创建BlockOutputStream,并想这次block写入pipeline中的第一个节点(最近的节点)开始写入block数据。
6.写完第一个block以后,依次按照datanode列表中的次远的node进行写入,直到最后一个block写入成功,DFSClient返回成功,该block写入操作结束。
通过以上策略,namenode在选择数据块的写入datanode列表时,就充分考虑到了将block副本分散在不同机架下,并同时尽量的避免了之前描述的网络多于开销。
对配置了机架信息的hadoopHDFS启动instance上传一个文件,其block信息如下:
从上图可以看出,在配置了机架信息的情况下,为了减少机架间的网络流量,namenode会将其中两个副本写在同一个机架上,并且为了尽量做到容错,会将第三个block写道另一个机架上的datanode上。

读取数据

我们看一下Hadoop集群配置中如何读取数据。当对某个文件的某个block进行读取的时候,hadoop采取的策略也是一样:

1.首先得到这个block所在的datanode的列表,有几个副本数该列表就有几个datanode。

2.根据列表中datanode距离读取端的距离进行从小到大的排序:
a)首先查找本地是否存在该block的副本,如果存在,则将本地datanode作为第一个读取该block的datanode
b)然后查找本地的同一个rack下是否有保存了该block副本的datanode
c)最后如果都没有找到,或者读取数据的node本身不是datanode节点,则返回datanode列表的一个随机顺序。本节关于Hadoop集群相关内容介绍完毕。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-312654-1-1.html 上篇帖子: 【转】分析Hadoop自带WordCount例子的执行过程(1) 下篇帖子: Hadoop中小规模集群的并行计算缺陷
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表