完全分布式模式介绍
完全分布式,指的是在真实环境下,使⽤多台机器,共同配合,来构建⼀个完整的分布式⽂件系统。
在真实环境中,hdfs中的相关守护进程也会分布在不同的机器中,⽐如:
-1. namenode守护进程尽可能的单独部署在⼀台硬件性能相对来说⽐较好的机器中。
-2. 其他的每台机器上都会部署⼀个datanode守护进程,⼀般的硬件环境即可。
-3. secondarynamenode守护进程最好不要和namenode在同⼀台机器上。
守护进程布局
我们搭建hdfs的完全分布式,顺便搭建⼀下yarn。hdfs和yarn的相关守护进程的布局如下:
qianfeng01: namenode,datanode,ResourceManager,nodemanager
qianfeng02: datanode,nodemanager,secondarynamenode
qianfeng03: datanode,nodemanager
完全分布式搭建环境准备
- 总纲
-1. 三台机器的防⽕墙必须是关闭的.
-2. 确保三台机器的⽹络配置畅通(NAT模式,静态IP,主机名的配置)
-3. 确保/etc/hosts⽂件配置了ip和hostname的映射关系
-4. 确保配置了三台机器的免密登陆认证(克隆会更加⽅便)
-5. 确保所有机器时间同步
-6. jdk和hadoop的环境变量配置
部分步骤省略
配置/etc/hosts⽂件
root@qianfeng01 ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4localhost4.localdomain4
::1 localhost localhost.localdomain localhost6localhost6.localdomain6
192.168.10.101 qianfeng01 #添加本机的静态IP和本机的主机名之间的映射关系
192.168.10.102 qianfeng02
192.168.10.103 qianfeng03
Hadoop的配置⽂件
- 在完全分布式集群的配置中,需要配置的是4个配置⽂件
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
- 这⼏个配置⽂件有默认的配置,命名为default
core-default.xml
hdfs-default.xml
mapred-default.xml
yarn-default.xml
- 我们可以将默认的配置⽂件找出来,看看默认的配置
[root@qianfeng01 share]# cd /usr/local/hadoop/share
[root@qianfeng01 share]# find -name "*-default.xml" -exec cp {} ~/defaultXml \;
- 属性的优先级
代码中配置的属性 > *-site.xml > *-default.xml
完全分布式配置
- 配置core-site.xml
<configuration>
<!-- hdfs的地址名称:schame,ip,port-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://qianfeng01:8020</value>
</property>
<!-- hdfs的基础路径,被其他属性所依赖的⼀个基础路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop2.7/tmp</value>
</property>
</configuration>
- 配置hdfs-site.xml
<configuration>
<!-- namenode守护进程管理的元数据⽂件fsimage存储的位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name</value>
</property>
<!-- 确定DFS数据节点应该将其块存储在本地⽂件系统的何处-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop2.7.tmp.dir}/dfs/data</value>
</property>
<!-- 块的副本数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 块的⼤⼩(128M),下⾯的单位是字节-->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<!-- secondarynamenode守护进程的http地址:主机名和端⼝号。参考守护进程布局-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>qianfeng02:50090</value>
</property>
<!-- namenode守护进程的http地址:主机名和端⼝号。参考守护进程布局-->
<property>
<name>dfs.namenode.http-address</name>
<value>qianfeng01:50070</value>
</property>
</configuration>
-
配置mapred-site.xml
如果只是搭建hdfs,只需要配置core-site.xml和hdfs-site.xml⽂件就可以了,但是我们过两天要学习的MapReduce是需要YARN资源管理器的,因此,在这⾥,我们提前配置⼀下相关⽂件。
<configuration>
<!-- 指定mapreduce使⽤yarn资源管理器-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 配置作业历史服务器的地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>qianfeng01:10020</value>
</property>
<!-- 配置作业历史服务器的http地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>qianfeng01:19888</value>
</property>
</configuration>
- 配置yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 指定yarn的shuffle技术-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定resourcemanager的主机名-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>qianfeng01</value>
</property>
<!--下⾯的可选-->
<!--指定shuffle对应的类 -->
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<!--配置resourcemanager的内部通讯地址-->
<property>
<name>yarn.resourcemanager.address</name>
<value>qianfeng01:8032</value>
</property>
<!--配置resourcemanager的scheduler的内部通讯地址-->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>qianfeng01:8030</value>
</property>
<!--配置resoucemanager的资源调度的内部通讯地址-->
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>qianfeng01:8031</value>
</property>
<!--配置resourcemanager的管理员的内部通讯地址-->
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>qianfeng01:8033</value>
</property>
<!--配置resourcemanager的web ui 的监控⻚⾯-->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>qianfeng01:8088</value>
</property>
</configuration>
- 配置hadoop-env.sh
.........
# The java implementation to use.
export JAVA_HOME=/usr/local/jdk
.........
- 配置slaves⽂件
qianfeng01
qianfeng02
qianfeng03
- 配置yarn-env.sh⽂件
.........
# some Java parameters
export JAVA_HOME=/usr/local/jdk
if [ "$JAVA_HOME" != "" ]; then
#echo "run java in $JAVA_HOME"
JAVA_HOME=$JAVA_HOME
fi
.........
另外两台机器配置说明
当把qianfeng01机器上的hadoop的相关⽂件配置完毕后,我们有以下两种⽅式来选择配置另外⼏台机器的hadoop.
⽅式⼀: “scp”进⾏同步
提示:本⽅法适⽤于多台虚拟机已经提前搭建出来的场景。
--1. 同步hadoop到slave节点上
[root@qianfeng01 ~]# cd /usr/local
[root@qianfeng01 local]# scp -r ./hadoop qianfeng02:/usr/local/
[root@qianfeng01 local]# scp -r ./hadoop qianfeng03:/usr/local/
--2. 同步/etc/profile到slave节点上
[root@qianfeng01 local]# scp /etc/profile qianfeng02:/etc/
[root@qianfeng01 local]# scp /etc/profile qianfeng03:/etc/
--3. 如果slave节点上的jdk也没有安装,别忘记同步jdk。
--4. 检查是否同步了/etc/hosts⽂件
⽅式⼆: 克隆qianfeng01虚拟机
提示:本⽅法适⽤于还没有安装slave虚拟机的场景。通过克隆qianfeng01节点的⽅式,来克隆⼀个qianfeng02和qianfeng03机器节点,这种⽅式就不⽤重复安装环境和配置⽂件了,效率⾮常⾼,节省了⼤部分时间(免密认证的秘钥对都是相同的⼀套)。
--1. 打开⼀个新克隆出来的虚拟机,修改主机名
[root@qianfeng01 ~]# hostnamectl set-hostname qianfeng02
--2. 修改ip地址
[root@qianfeng01 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
.........省略.........
IPADDR=192.168.10.102 <==修改为qianfeng02对应的ip地址
.........省略........
--3. 重启⽹络服务
[root@qianfeng01 ~]# systemctl restart network
--4. 其他新克隆的虚拟机重复以上1~3步
--5. 免密登陆的验证
从qianfeng01机器上,连接其他的每⼀个节点,验证免密是否好使,同时去掉第⼀次的询问步骤
--6. 建议:每台机器在重启⽹络服务后,最好reboot⼀下。
格式化NameNode
- 注意事项
格式化完成NameNode后,会在core-site.xml中的配置hadoop.tmp.dir的路径下⽣成集群相关的⽂件。如果之前在伪分布式的时候已经格式化完成,并且这个路径已经⽣成了,需要先将这个⽬录⼿动删除掉,然后再格式化集群,否则会导致集群启动失败,NameNode和DataNode⽆法建⽴连接。
- 在qianfeng01机器上运⾏命令
[root@qianfeng01 ~]# hdfs namenode -format
- 格式化的相关信息解读
--1. ⽣成⼀个集群唯⼀标识符:clusterid
--2. ⽣成⼀个块池唯⼀标识符:blockPoolId
--3. ⽣成namenode进程管理内容(fsimage)的存储路径:
默认配置⽂件属性hadoop.tmp.dir指定的路径下⽣成dfs/name⽬录
--4. ⽣成镜像⽂件fsimage,记录分布式⽂件系统根路径的元数据
--5. 其他信息都可以查看⼀下,⽐如块的副本数,集群的fsOwner等。
- ⽬录⾥的内容查看
启动集群
- 启动脚本和关闭脚本介绍
1. 启动脚本
-- start-dfs.sh :⽤于启动hdfs集群的脚本
-- start-yarn.sh :⽤于启动yarn守护进程
-- start-all.sh :⽤于启动hdfs和yarn
2. 关闭脚本
-- stop-dfs.sh :⽤于关闭hdfs集群的脚本
-- stop-yarn.sh :⽤于关闭yarn守护进程
-- stop-all.sh :⽤于关闭hdfs和yarn
3. 单个守护进程脚本
-- hadoop-daemons.sh :⽤于单独启动或关闭hdfs的某⼀个守护进程的脚本
-- hadoop-daemon.sh :⽤于单独启动或关闭hdfs的某⼀个守护进程的脚本
reg:
hadoop-daemon.sh [start|stop]
[namenode|datanode|secondarynamenode]
-- yarn-daemons.sh :⽤于单独启动或关闭hdfs的某⼀个守护进程的脚本
-- yarn-daemon.sh :⽤于单独启动或关闭hdfs的某⼀个守护进程的脚本
reg:
yarn-daemon.sh [start|stop]
[resourcemanager|nodemanager]
-
启动hdfs
1.使⽤start-dfs.sh,启动 hdfs。参考图⽚
2. 启动过程解析
- 启动集群中的各个机器节点上的分布式⽂件系统的守护进程
⼀个namenode和resourcemanager以及secondarynamenode
多个datanode和nodemanager
- 在namenode守护进程管理内容的⽬录下⽣成edit⽇志⽂件
- 在每个datanode所在节点下⽣成${hadoop.tmp.dir}/dfs/data⽬录,
参考下图:
3. jps查看进程
--1. 在qianfeng01上运⾏jps指令,会有如下进程
namenode
datanode
--2. 在qianfeng02上运⾏jps指令,会有如下进程
secondarynamenode
datanode
--3. 在qianfeng03上运⾏jps指令,会有如下进程
datanode
注意
如果哪台机器的相关守护进程没有开启,那么,就查看哪台机器上的守护进程对应的⽇志log⽂件,注意,启动脚本运⾏时提醒的⽇志后缀是*.out,⽽我们查看的是*.log⽂件。此⽂件的位置:${HADOOP_HOME}/logs/⾥
-
WebUI查看
http://192.168.10.101:50070
-
启动yarn
1.使⽤start-yarn.sh脚本,参考图⽚
- jps查看
--1. 在qianfeng01上运⾏jps指令,会多出有如下进程
resoucemanager
nodemanager
--2. 在qianfeng02上运⾏jps指令,会多出有如下进程
nodemanager
--3. 在qianfeng03上运⾏jps指令,会多出有如下进程
nodemanager
3. webui查看
http://192.168.10.101:8088
集群守护进程不能开启的情况
1. 格式化集群时,报错原因
- 当前⽤户使⽤不当
- /etc/hosts⾥的映射关系填写错误
- 免密登录认证异常
- jdk环境变量配置错误
- 防⽕墙没有关闭
2. namenode进程没有启动的原因:
- 当前⽤户使⽤不当
- 重新格式化时,忘记删除${hadoop.tmp.dir}⽬录下的内容
- ⽹络震荡,造成edit⽇志⽂件的事务ID序号不连续
3. datanode出现问题的原因
- /etc/hosts⾥的映射关系填写错误
- 免密登录异常
- 重新格式化时,忘记删除${hadoop.tmp.dir}⽬录下的内容,造成
datanode的唯⼀标识符不在新集群中。
4. 上述问题暴⼒解决办法:重新格式化
如果想重新格式化,那么需要先删除每台机器上的${hadoop.tmp.dir}指定路径下的所有内容,然后再格式化:最好也把logs⽬录下的内容也清空,因为⽇志内容已经是前⼀个废弃集群的⽇志信息了,留着也⽆⽤。
/hosts⾥的映射关系填写错误
- 免密登录认证异常
- jdk环境变量配置错误
- 防⽕墙没有关闭
2. namenode进程没有启动的原因:
- 当前⽤户使⽤不当
- 重新格式化时,忘记删除
h
a
d
o
o
p
.
t
m
p
.
d
i
r
⽬
录
下
的
内
容
−
⽹
络
震
荡
,
造
成
e
d
i
t
⽇
志
⽂
件
的
事
务
I
D
序
号
不
连
续
3.
d
a
t
a
n
o
d
e
出
现
问
题
的
原
因
−
/
e
t
c
/
h
o
s
t
s
⾥
的
映
射
关
系
填
写
错
误
−
免
密
登
录
异
常
−
重
新
格
式
化
时
,
忘
记
删
除
{hadoop.tmp.dir}⽬录下的内容 - ⽹络震荡,造成edit⽇志⽂件的事务ID序号不连续 3. datanode出现问题的原因 - /etc/hosts⾥的映射关系填写错误 - 免密登录异常 - 重新格式化时,忘记删除
hadoop.tmp.dir⽬录下的内容−⽹络震荡,造成edit⽇志⽂件的事务ID序号不连续3.datanode出现问题的原因−/etc/hosts⾥的映射关系填写错误−免密登录异常−重新格式化时,忘记删除{hadoop.tmp.dir}⽬录下的内容,造成
datanode的唯⼀标识符不在新集群中。