经过本教程您能够学习到:html
为了接下来对一些内部机制有所了解,咱们先来了解一下网络拓扑的概念。java
在本地网络中,两个节点被称为“彼此近邻”是什么意思?node
在海量数据处理中,主要限制因素是节点之间数据的传输速率——带宽很稀缺。这里的想法是将两个节点间的带宽做为距离的衡量标准。web
咱们来了解一个概念:节点距离——两个节点到达最近的共同祖先的距离总和。这个概念,是否也能够理解为拓扑网络中两个节点的最短路径呢(只不过每条边的边长都为1)?(想起了大学时OJ题目中各类最短路径的算法题。)算法
例如,假设有数据中心d1机架r1中的节点n1。该节点能够表示为/d1/r1/n1。利用这种标记,这里给出四种距离描述。 Distance(/d1/r1/n1, /d1/r1/n1)=0(同一节点上的进程) Distance(/d1/r1/n1, /d1/r1/n2)=2(同一机架上的不一样节点) Distance(/d1/r1/n1, /d1/r3/n2)=4(同一数据中心不一样机架上的节点) Distance(/d1/r1/n1, /d2/r4/n2)=6(不一样数据中心的节点)shell
当咱们节点的数目比较多,而副本数比较少的状况下。例如多个DN,3个relication。集群对于选择节点存储的策略是什么样的呢?apache
一、参考文档数组
二、低版本Hadoop副本节点选择网络
咱们能够看到,这样作的目的就是为了使各个副本之间的节点距离尽量的短。app
三、Hadoop2.7.2副本节点选择
咱们能够看到,2.7版本在旧版本的基础上,再一次缩短了第一个副本和第二个副本节点之间的距离。而第三个副本存储在其余的机架上则是为了保证高可用,避免同个机架坏了致使文件不可用(否则都往一个机架里面存储)。
为了接下来读机架感知策略进行验证,咱们须要在原来3台机器的基础上,添加新的节点,也就是4个节点的集群。
192.168.102.132 h132 192.168.102.133 h133 192.168.102.134 h134 192.168.102.135 h135
在原来的基础上添加一台h132节点便可。
一、关闭全部服务
[root@h133 ~]# stop-dfs.sh [root@h134 ~]# stop-yarn.sh [root@h133 ~]# xcall $JAVA_HOME/bin/jps -------------localhost---------- ----------h133--------- 6253 Jps ----------h134--------- 4233 Jps ----------h135--------- 5140 Jps
h134执行
stop-yarn.sh
,h133上执行stop-dfs.sh
.
二、修改主机名、主机名文件、h133和h134到h132的ssh无密码登陆。
[root@h132 ~]# hostname h132 [root@h133 ~]# ssh-copy-id h132 [root@h134 ~]# ssh-copy-id h132
三、将h13三、h134以及h135的以前的集群信息所有删除。
xcall rm -rf /opt/module/hadoop-2.7.2/data /opt/module/hadoop-2.7.2/logs/
这是很暴力的作法,之后咱们会讲到如何增长服役节点,那种才是最合理的增长集群节点的方式——暴力方式只推荐测试使用。
四、将xcall以及xsync脚本复制到h132,使用xshell同步编辑全部机器,一次性编辑全部文档,使其兼容h132主机的存在。(修改循环的下限而已)
五、将h133的/opt/module/hadoop-2.7.3.tar.gz复制到h132节点的相同位置,这样全部的配置文件就保持一致了。
五、xshell所有会话工具设置服役节点配置文件{hadoop_home}/etc/hadoop/slaves,增长h132。
h132 h133 h134 h135
这样,全部的准备工做就完成了。
六、在namenode所在节点h133上格式化namenode:
[root@h133 hadoop]# hdfs namenode -format 19/01/03 15:00:18 INFO namenode.NameNode: STARTUP_MSG: ...
hadoop namenode -format已经被标注为要过期了。
七、在namenode所在节点h133上启动dfs相关守护进程
[root@h133 hadoop]# start-dfs.sh Starting namenodes on [h133] h133: starting namenode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-namenode-h133.out h134: starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-datanode-h134.out h132: starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-datanode-h132.out h135: starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-datanode-h135.out h133: starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-datanode-h133.out Starting secondary namenodes [h135] h135: starting secondarynamenode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-secondarynamenode-h135.out [root@h133 hadoop]# xcall $JAVA_HOME/bin/jps -------------localhost---------- ----------h132--------- 14979 Jps 14905 DataNode ----------h133--------- 8130 NameNode 8457 Jps 8252 DataNode ----------h134--------- 4786 Jps 4712 DataNode ----------h135--------- 5730 DataNode 5864 Jps 5820 SecondaryNameNode
能够看到,咱们已经拥有4个数据节点了。
八、在resourceManager所在节点h134上启动yarn相关守护进程
root@h134 hadoop]# start-yarn.sh starting yarn daemons starting resourcemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-resourcemanager-h134.out h132: starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-nodemanager-h132.out h133: starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-nodemanager-h133.out h135: starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-nodemanager-h135.out h134: starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-nodemanager-h134.out [root@h134 hadoop]# xcall $JAVA_HOME/bin/jps -------------localhost---------- ----------h132--------- 14905 DataNode 15017 NodeManager 15116 Jps ----------h133--------- 8496 NodeManager 8130 NameNode 8597 Jps 8252 DataNode ----------h134--------- 4835 ResourceManager 4934 NodeManager 4712 DataNode 5215 Jps ----------h135--------- 5730 DataNode 6007 Jps 5820 SecondaryNameNode 5903 NodeManager
九、测试一下集群是否稳定。
[root@h133 hadoop]# hadoop fs -mkdir -p /user/zhaoyi/input [root@h133 hadoop]# hadoop fs -ls -R /user drwxr-xr-x - root supergroup 0 2019-01-03 15:14 /user/zhaoyi drwxr-xr-x - root supergroup 0 2019-01-03 15:14 /user/zhaoyi/input
OK,咱们开始测试。
在以前的项目下,建立以下的类,实现接口DNSToSwitchMapping:
package com.zhaoyi; import org.apache.hadoop.net.DNSToSwitchMapping; import java.util.ArrayList; import java.util.List; public class MyRockMapping implements DNSToSwitchMapping { public List<String> resolve(List<String> names) { // rack list List<String> racks = new ArrayList<String>(); int ipNum = 0;// will be 132,133,134,135 // 获取机架IP if(names != null && names.size() > 0){ for (String name: names) { if(name.startsWith("h")){//host name ipNum = Integer.parseInt(name.substring(1)); }else{// ipv4 ipNum = Integer.parseInt(name.substring(1 + name.lastIndexOf("."))); } } if(ipNum <= 133){//132,133 racks.add("/dd/rack1" ); }else{//134,135 racks.add("/dd/rack2"); } } return racks; } public void reloadCachedMappings() { } public void reloadCachedMappings(List<String> names) { } }
咱们实现resolve方法,该方法的输入参数为集群中各台主机名(或者IP,咱们要作兼容),输出则为咱们自定义的机架名称数组,以此来覆盖Hadoop集群默认org.apache.hadoop.net.ScriptBasedMapping
进行机架设置行为。能够看到,咱们将132和133归为rack1,134和135归为rack2。
使用maven打包:
mvn package
将生成的jar包(我这里名为firsthadoop-1.0-SNAPSHOT.jar
(和项目名一致),没多大影响)拷贝到集群全部机器的/opt/module/hadoop-2.7.2/share/hadoop/common/lib下。
一、修改配置文件core-site.xml(/opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml),使HDFS使用咱们的Mapping。
<!-- Topology Configuration --> <property> <name>net.topology.node.switch.mapping.impl</name> <value>com.zhaoyi.MyRockMapping</value> </property>
com.zhaoyi.MyRockMappin是咱们实现类的namespace+classname,请注意和你的保持一致
net.topology.node.switch.mapping.impl的默认值为
org.apache.hadoop.net.ScriptBasedMapping
.
二、重启集群
#### 中止集群 [root@h134 hadoop]# stop-yarn.sh [root@h133 lib]# stop-dfs.sh [root@h133 hadoop]# xcall $JAVA_HOME/bin/jps -------------localhost---------- ----------h132--------- 15652 Jps ----------h133--------- 10277 Jps ----------h134--------- 6283 Jps ----------h135--------- 6807 Jps #### 启动集群 [root@h133 lib]# start-dfs.sh [root@h134 hadoop]# start-yarn.sh [root@h133 lib]# xcall $JAVA_HOME/bin/jps -------------localhost---------- ----------h132--------- 15794 NodeManager 15690 DataNode 15917 Jps ----------h133--------- 10392 NameNode 10520 DataNode 10684 NodeManager 10878 Jps ----------h134--------- 6322 DataNode 6437 ResourceManager 6854 Jps 6542 NodeManager ----------h135--------- 7010 NodeManager 7139 Jps 6845 DataNode 6943 SecondaryNameNode
注意中止、启动顺序,以及在不一样的机器上运行命令(注意个人copy代码前面对应的主机名)
三、查看机架信息
[root@h133 lib]# hdfs dfsadmin -printTopology Rack: /dd/rack1 192.168.102.132:50010 (h132) 192.168.102.133:50010 (h133) Rack: /dd/rack2 192.168.102.134:50010 (h134) 192.168.102.135:50010 (h135)
很明显,咱们的机架已经将分组成功的划分了。接下来,咱们开始测试上传文件。
目前,咱们将132和133归为rack1,134和135归为rack2。
根据咱们前面的分析,根据上传节点的不一样:
若咱们从h133上上传,则因为h132和h133位于同一机架。所以文件有两份副本确定分别存储在h132和133上,剩下的一份随即在h134和135上;
若是咱们在h134上上传文件,则其中2份在h134和h135上,剩下的一份随机存在h132或者h133上。
经过web界面点击上传的文件能够了解到上传文件副本所在的节点信息,你也能够经过查看namenode的日志查询文件上传过程当中的相关信息。
[root@h13xxxx ~]hadoop fs -put h13xxx.txt /user
一、在h132上传文件h132.txt,从web查看h132.txt文件的分组信息
二、在h133上传文件h133.txt,从web查看h133.txt文件的分组信息
三、在h134上传文件h134.txt,从web查看h134.txt文件的分组信息
四、在h135上传文件h135.txt,从web查看h135.txt文件的分组信息
彻底相反的结论,也就是说,2.7.2表现的结果是咱们以上的理论中,低版本的表现形式。
总结下来,咱们2.7.2目前的表现形式为:
这个问题,之后咱们回头再看看看是那里有问题。至少目前咱们懂得了一些颇有意思的东西,好比说机架、好比说HDFS文件处理的部分原理。