文章大纲:
此篇章主要介绍Hadoop完全分布式模式的部署。完全分布式模式是利用多台服务器来进行部署Hadoop,是真正意义上的分布式部署模式。此模式下,Hadoop的守护进程分别运行在由多个主机节点搭建的服务器集群上,不同的节点担任不同的角色。该模式一般用于部署构建企业级Hadoop系统,实际的工作应用开发中也经常使用此模式。
01服务器功能规划
真正分布式部署由于涉及多台服务器,因此部署前应先做好各个服务器节点的功能规划。HDFS的NameNode、SecondaryNameNode和YARN的ResourceManager尽量部署在不同的节点上,避免影响集群的性能:
图1-1-1:Hadoop服务器功能规划
02环境准备
一、克隆虚拟机
使用VMware克隆《第一篇:Hadoop环境搭建及安装》中创建的虚拟机hadoop100:
图2-1-1:克隆虚拟机
选择“创建完整克隆”,创建虚拟机hadoop101,并选择虚拟机文件保存路径,开始进行克隆:
图2-1-2:创建完整克隆
规划需要三台服务器搭建集群,因此还需要再克隆一个虚拟机hadoop102.
二、配置网络
参考《第一篇:Hadoop环境搭建及安装》第二章-搭建系统的3.配置网络中的第3、4、5点对机器hadoop101、hadoop102进行网络配置。
IP地址设置:
hadoop101:192.168.100.11
hadoop102:192.168.100.12
三个机器的hosts文件记得都要将全部IP及hostname映射加上!
三、安装及配置Hadoop
为了和《第三篇:Hadoop部署配置及运行调试(上)》中伪分布式部署的Hadoop区分开来,需要将hadoop100上的Hadoop服务停止,并在新的目录 /opt/modules/app 下安装另一个Hadoop.
按照服务功能规划,参考《第三篇:Hadoop部署配置及运行调试(上)》第二章-伪分布式模式进行安装及配置。
需要注意以下配置文件的参数配置:
1. /etc/profile
修改Hadoop环境变量HADOOP_HOME:
代码语言:javascript复制##HADOOP_HOME
export HADOOP_HOME="/opt/modules/app/hadoop-2.10.1"
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
执行以下命令使配置生效:
代码语言:javascript复制source /etc/profile
2. hdfs-site.xml
(1) dfs.replication
此参数的默认值为3,由于我们配置的集群机器数量也只有3个,所以可不进行配置。
(2) dfs.namenode.secondary.http-address
此参数用以指定SecondaryNameNode的http访问地址和端口号(端口号为50090)。因为我们规划了hadoop102为SecondaryNameNode服务器,因此需要修改此参数。
添加以下内容修改此参数值,配置SecondaryNameNode服务器地址:
代码语言:javascript复制<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop102:50090</value>
</property>
图2-3-1:配置SecondaryNameNode服务器
3. yarn-site.xml
(1) yarn.resourcemanager.hostname
此参数用以指定ResourceManager的服务器地址。根据规划,hadoop101为ResourceManager服务器,因此需修改此参数,使ResourceManager服务器指向hadoop101.
添加以下内容修改此参数值,配置ResourceManager服务器地址:
代码语言:javascript复制<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop101</value>
</property>
图2-3-2:配置ResourceManager服务器
4. slaves
slaves文件同样位于Hadoop的 /etc/hadoop 目录下,用于指定HDFS上有哪些DataNode节点,需要将所有DataNode节点添加进此配置文件中。
根据规划,添加DataNode节点服务器至slaves配置文件中:
代码语言:javascript复制hadoop100
hadoop101
hadoop102
注意:该文件中添加的内容,结尾不允许有空格,且文件中不允许有空行。
四、配置SSH免密码登录
Hadoop集群中的各个机器之间会相互地通过SSH访问,用以进行分发、同步文件及集群群启动等,而SSH访问需要输入密码,可见每次访问都输入密码是不现实的,所以要配置各个机器间的SSH是免密码登录的。
1. SSH免密登录原理
图2-4-1:SSH免密登录原理
2. SSH免密登录配置步骤
(1) 使用hadoop用户在hadoop100上生成公钥和私钥
代码语言:javascript复制ssh-keygen -t rsa
执行命令后一路回车,均设置为默认值,然后在当前用户的home目录下(/home/hadoop)的.ssh文件夹中会生成公钥及私钥文件。
图2-4-2:生成公钥和私钥
(2) 在hadoop100上分发公钥到需要免密登录的机器上
代码语言:javascript复制ssh-copy-id hadoop100
ssh-copy-id hadoop101
ssh-copy-id hadoop102
执行后会在分发机器的.ssh目录下生成授权公钥文件。
注意:生成公私钥的机器自身也需要分发公钥,不然无法通过SSH免密登录自身机器。
图2-4-3:分发公钥文件
(3) 其他两台机器进行同样的操作
完成后在任一机器上通过SSH登录其他机器均无需再输入密码:
图2-4-4:SSH免密登录
(4) 在hadoop100上切换到root用户进行同样的操作
3. .ssh目录下的文件功能解析
设置ssh免密登录后,会在/home/${user}(如使用hadoop用户即/home/hadoop)的.ssh目录中生成以下文件:known_hosts, id_rsa.pub, id_rsa, authorized_keys.
各文件的功能如下:
图2-4-5:.ssh目录文件功能解析
03分发Hadoop文件
在hadoop100上安装并配置好hadoop后,需要通过分发文件的方式在另外两台机器上安装hadoop,以减轻工作量。
分发的方式有两种:一种是采用scp安全拷贝的方式,这种方式会将文件全部覆盖,因此效率较低,适用于新安装或大量文件改动后的拷贝分发;另一种是采用rsync增量同步方式,这种方式只对差异文件进行分发更新,效率较高,适用于修改了少量文件后的同步分发。
一、scp: 安全拷贝
scp(secure copy) 可实现服务器与服务器之间的文件数据拷贝,此方式会将源目录下的所有文件拷贝到目标目录。
1. 创建hadoop文件目录
在hadoop101及hadoop102两台服务器上创建存放hadoop文件的目录:
代码语言:javascript复制mkdir /opt/modules/app
2. 删除hadoop中的share/doc目录(可选)
Hadoop根目录下的share/doc目录用于存放hadoop的文档,文件量较大,且用处不大,建议在分发之前将这个目录删除掉,可以节省硬盘空间并能提高分发的速度。当然,保留下来也没有问题。
3. 使用scp进行文件分发
可以在本地把文件put到目标服务器,也可以在目标服务器将文件get过来。
(1) 在hadoop100上将hadoop100的hadoop文件拷贝到hadoop101上:
代码语言:javascript复制scp -r /opt/modules/app/hadoop-2.10.1/ hadoop@hadoop101:/opt/modules/app/
(2) 在hadoop102上将hadoop100的hadoop文件拷贝到hadoop102上:
代码语言:javascript复制scp -r hadoop@hadoop100:/opt/modules/app/hadoop-2.10.1/ hadoop@hadoop102:/opt/modules/app/
二、rsync: 增量同步
rsync(remote synchronize) 主要用于备份和镜像,具有速度快、避免复制相同内容和支持符号链接的优点。此方式只对源和目标有差异的文件进行同步更新,比scp的速度快。适合只修改了少量文件(如hadoop配置文件)后进行同步分发使用。
由于我们在hadoop100上修改了/etc/profile文件后没有同步到其他两台机器,正好可以使用这种方式将此文件从hadoop100上同步到hadoop101及hadoop102上:
代码语言:javascript复制rsync -rvl /etc/profile root@hadoop101:/etc/profile
rsync -rvl /etc/profile root@hadoop102:/etc/profile
图3-2-1:使用rsync同步/etc/profile
同步完后记得在hadoop101级hadoop102上执行以下命令使配置生效:
代码语言:javascript复制source /etc/profile
04格式化NameNode
由于我们规划了hadoop100为HDFS的NameNode服务器,因此只需要在hadoop100上进行NameNode的格式化。格式化是对HDFS中的DataNodes进行分块(一个块默认128M),再将分块后的初始文件元数据信息及块与块所在DataNode之间的地址映射关系存储在NameNode中。
若在安装hadoop后不是第一次进行格式化,记得在格式化前删除logs日志及data目录(我们在core-site.xml中设置的hadoop运行临时文件存储目录hadoop.tmp.dir)的数据。具体原因详见《第三篇:Hadoop部署配置及运行调试(上)》中的伪分布式模式部署3-(3)-(e).
在hadoop100上格式化NameNode:
代码语言:javascript复制hdfs namenode -format
格式化后,查看之前配置core-site.xml文件里hadoop.tmp.dir参数指定的文件存储目录下(这里设置的是 /opt/data/tmp)是否有dfs目录,如果有,说明格式化成功。
05集群启动与停止
集群启动及停止有两种方式:一种是各个服务组件单点进行启动与停止;一种是各个模块整体进行启动与停止。
一、单点启动与停止
1. 单点启动与停止HDFS各个服务组件
(1) 在hadoop100上启动NameNode
代码语言:javascript复制${HADOOP_HOME}/sbin/hadoop-daemon.sh start namenode
(2) 在hadoop100、hadoop101、hadoop102上启动DataNode
代码语言:javascript复制${HADOOP_HOME}/sbin/hadoop-daemon.sh start datanode
(3) 在hadoop102上启动SecondaryNameNode
代码语言:javascript复制${HADOOP_HOME}/sbin/hadoop-daemon.sh start secondarynamenode
(4) 停止服务将命令中的start替换成stop即可
2. 单点启动与停止YARN各个服务组件
(1) 在hadoop101上启动ResourceManager
代码语言:javascript复制${HADOOP_HOME}/sbin/yarn-daemon.sh start resourcemanager
(2) 在hadoop100、hadoop101、hadoop102上启动NodeManager
代码语言:javascript复制${HADOOP_HOME}/sbin/yarn-daemon.sh start nodemanager
(3) 停止服务将命令中的start替换成stop即可
3. 单点启动与停止历史服务
(1) 在hadoop100上启动HistoryServer
代码语言:javascript复制${HADOOP_HOME}/sbin/mr-jobhistory-daemon.sh start historyserver
(2) 停止服务将命令中的start替换成stop即可
启动/停止完成后使用jps命令查看启动/停止是否成功。
二、整体启动与停止
集群整体启动与停止的前提条件是需要配置SSH免密码登录。
1. 整体启动与停止HDFS
由于HDFS的NameNode部署在hadoop100上,因此整体启动与停止HDFS只需要且只能在hadoop100上操作,其他机器的HDFS相关服务组件会自动启动与停止:
代码语言:javascript复制${HADOOP_HOME}/sbin/start-dfs.sh
图5-2-1:整体启动HDFS
整体停止HDFS服务:
代码语言:javascript复制${HADOOP_HOME}/sbin/stop-dfs.sh
启动/停止完成后使用jps在各个机器上进行检查HDFS对应服务是否启动/停止成功。
2. 整体启动与停止YARN
由于YARN的ResourceManager部署在hadoop101上,因此整体启动与停止YARN只需要且只能在hadoop101上操作,其他机器的YARN相关服务组件会自动启动与停止:
代码语言:javascript复制${HADOOP_HOME}/sbin/start-yarn.sh
图5-2-2:整体启动YARN
整体停止YARN服务:
代码语言:javascript复制${HADOOP_HOME}/sbin/stop-yarn.sh
启动/停止完成后使用jps在各个机器上进行检查YARN对应服务是否启动/停止成功。
3. 启动与停止历史服务
由于HistoryServer部署在hadoop100上,且只需在此机器上启动与停止,因此历史服务的启动与停止跟单点的操作一样:
代码语言:javascript复制${HADOOP_HOME}/sbin/mr-jobhistory-daemon.sh start historyserver
停止历史服务:
代码语言:javascript复制${HADOOP_HOME}/sbin/mr-jobhistory-daemon.sh stop historyserver
启动/停止完成后使用jps在检查历史服务是否启动/停止成功。
4. 查看HDFS及YARN的Web页面
(1) 查看HDFS的Web页面
在浏览器中输入地址:http://hadoop100:50070/, 通过Web页面查看HDFS的信息,检查是否正常工作:
图5-2-3:HDFS信息及文件管理Web页面
(2) 查看YARN的Web页面
在浏览器中输入地址:http://hadoop101:8088/, 通过Web页面查看YARN的资源调度信息,检查是否正常工作:
图5-2-4:YARN的资源调度管理Web页面
06运行调试
一、运行WordCount案例调试
1. 创建输入数据文件wc.input 在 /opt/data 目录下创建输入数据文件wc.input(之前创建过的可直接使用):
代码语言:javascript复制vim /opt/data/wc.input
hadoop hdfs mapreduce
hadoop hbase hive
hadoop storm yarn
spark sparkstreaming sparksql
spark hdfs yarn
spark hdfs mapreduce
hadoop spark
hadoop spark
2. 在HDFS创建输入目录input
使用HDFS命令在HDFS上创建输入目录input:
代码语言:javascript复制hdfs dfs -mkdir /input
3. 上传本地文件wc.input到HDFS上
将输入数据文件wc.input上传到刚在HDFS上创建的输入目录input中:
代码语言:javascript复制hdfs dfs -put /opt/data/wc.input /input
可在HDFS的Web页面查看文件是否上传成功:
图6-1-1:通过HDFS的Web页面查看文件是否成功上传
4. 运行hadoop自带的WordCount案例
使用上传至HDFS的输入数据文件wc.input在YARN上执行hadoop自带的WordCount MR程序,并查看运行情况:
代码语言:javascript复制hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount /input/wc.input /outpu
图6-1-2:后台查看程序运行情况
同时也可以在YARN页面查看Job的运行情况:
图6-1-3:通过YARN的Web页面查看Job运行情况
5. 查看输出结果文件
可直接在后台查看输出的结果文件:
代码语言:javascript复制hdfs dfs -cat /output/part-r-00000
图6-1-4:后台查看输出结果文件
也可以在HDFS的Web页面中查看输出结果文件:
图6-1-5:在HDFS的Web页面查看输出结果文件
二、集群文件存储方式
在HDFS上存储的文件存放在我们在core-site.xml配置文件中设置的hadoop.tmp.dir参数路径下,此路径dfs目录下的name文件夹中存储了存放文件的位置等NameNode元数据信息,而data文件夹中则存储了真实的文件数据。
1. 查看HDFS文件存储路径
进入HDFS文件存储目录查看路径:
图6-2-1:查看HDFS文件存储目录
2. 查看HDFS在磁盘存储的文件内容
查看文件blk_1073741825、blk_1073741832,可以看到就是我们上传到HDFS的输入数据文件wc.input及wordcount输出结果文件:
图6-2-2:查看HDFS在本地存储的文件内容
由于我们在hdfs-stie.xml配置文件中设置dfs.replication参数值为3,因此这些文件会同时存储在另外随机两台DataNode机器上,这里只有三台机器做集群,因此hadoop101及hadoop102上同样的路径下也会存储这些文件:
图6-2-3:查看HDFS在其他DataNode上存储的文件内容
3. 查看HDFS中文件的存储块及节点信息
在HDFS的Web页面可以查看文件所在存储块(Block)及DataNode的信息:
图6-2-4:查看HDFS的文件存储块及节点信息
由于上传的wc.input文件大小没有超过一个block的大小(128M),因此只占用了一个block。若上传的文件大小超过128M, 则块信息会显示占用的所有block信息,大家可以进行尝试。