Hadoop运行模式包括:本地模式、伪分布式模式,以及完全分布式模式。
1、本地模式
安装简单,在一台机器上运行服务,几乎不用做任何配置,但仅限于调试用途。没有分布式文件系统,直接读写本地操作系统的文件系统。
2、伪分布式模式
在单节点上同时启动namenode、datanode、jobtracker、tasktracker、secondary namenode等进程,模拟分布式运行的各个节点。配置已经很接近完全分布式。
3、完全分布式模式
正常的Hadoop集群,由多个各司其职的节点构成。
完全分布式运行模式
需求
- 准备3台客户机(关闭防火墙、静态ip、主机名称)
- 3台客户机都已经配置java环境
- 3台客户机都已经配置hadoop环境
- 3台客户机配置有映射关系
- 其中有一台客户机需已部署伪分布式模式
P.s.:本文准备的三台客户机为:hadoop102、hadoop103、hadoop104,其中hadoop102已经部署了伪分布式模式。
一、编写集群分发脚本xsync
1.目的
为了把第一台客户上的hadoop相关配置文件同步发送给其他两台客户机。
2.需求
循环复制文件到所有节点的相同目录下。
3.需求分析
(1)rsync命令原始拷贝:
rsync -rvl 要拷贝的文件路径 目的用户名@目标主机:目的路径[/新名称]
(2)期望脚本:
xsync要同步的文件名称。
(3)说明
在/home/nanfeng(普通用户名)/bin这个目录下存放的脚本,nanfeng用户可以在系统任何地方直接执行。
3.脚本实现
(1)切换到用户家目录(/home/nanfeng)
cd ~
(2)创建bin目录
mkdir bin
(3)编辑bin目录下的xsync文件
vim bin/xsync
在该文件中编写如下代码:
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 发送文件给另外两台客户机
echo ------------------- hadoop$host --------------
rsync -rvl $pdir/$fname $user@hadoop103(第二台客户机主机名):$pdir
rsync -rvl $pdir/$fname $user@hadoop104(第三台客户机主机名):$pdir
如果你另外两台客户机的名字为hadoop103和hadoop104,也可以编辑为以下内容:
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for((host=103; host<105; host++)); do
echo ------------------- hadoop$host --------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
(4)修改脚本 xsync 具有执行权限
chmod 777 bin/xsync
(5)调用脚本形式
xsync 文件名称
,这样就可以发送文件到对应客户机的对应目录下。
注意:如果将xsync文件放到/home/nanfeng目录下仍然不能实现全局使用,可以将xsync文件移动到/usr/local/bin目录下。
二、SSH免密登录配置
1.目的
为了客户机之间互通更方便,无需目标客户机密码就可和目标客户机互通信息。
2.步骤
在3台客户机上分别做如下操作:
(1)生成公钥和私钥
执行ssh-keygen -t rsa
命令,然后敲三个回车,就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)。
(2)将公钥拷贝到要免密登录的目标机器上
ssh-copy-id hadoop102(本机主机名)
ssh-copy-id hadoop103(第二台客户机主机名)
ssh-copy-id hadoop104(第三台客户机主机名)
P.s.:具体可参考SSH免密登录配置
三、集群配置
1. 集群部署规划
为了防止某台客户机的任务量太大,所以要把NameNode、ResourceManager、SecondaryNameNode平均分配给3台客户机。
2.配置集群
以下操作的配置文件在:$HADOOP_HOME/etc/hadoop目录下
(1)核心配置文件
配置core-site.xml
vim core-site.xml
在该文件中编写如下配置:
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
(2)HDFS配置文件
配置hadoop-env.sh
Linux系统中获取JDK的安装路径并复制:echo $JAVA_HOME
。
vim hadoop-env.sh
修改配置文件中的JAVA_HOME 路径:export JAVA_HOME=/opt/module/jdk1.8.0_144
。
配置hdfs-site.xml
vim hdfs-site.xml
在该文件中编写如下配置:
<!-- 指定HDFS的副本数量,不配置则默认为3 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:50090</value>
</property>
(3)YARN配置文件
配置yarn-env.sh
vim yarn-env.sh
修改配置文件JAVA_HOME 路径:export JAVA_HOME=/opt/module/jdk1.8.0_144
。
配置yarn-site.xml
vim yarn-site.xml
在该文件中增加如下配置:
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
(4)MapReduce配置文件
配置mapred-env.sh
vim mapred-env.sh
修改配置文件JAVA_HOME 路径:export JAVA_HOME=/opt/module/jdk1.8.0_144
。
配置mapred-site.xml(若配置过伪分布式则跳过此步)
cp mapred-site.xml.template mapred-site.xml
,将mapred-site.xml.template复制为mapred-site.xml。
编辑配置文件:
<!-- 指定MR运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
3.删除$HADOOP_HOME下的data和logs文件夹
cd $HADOOP_HOME
rm -rf logs/ data/
原因:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。所以,格式NameNode时,一定要先删除data数据和log日志,然后再格式化NameNode。
4.在集群上分发配置好的Hadoop配置文件
xsync $HADOOP_HOME
P.s.:如果不能成功发送到另外两台客户机,你也可以使用scp或者rsync命令。
四、集群单点启动
1.如果集群是第一次启动,需要格式化NameNode
因为给hadoop102配置的NameNode,所以在hadoop102上执行hadoop namenode -format
命令。
2.在hadoop102上启动NameNode
在hadoop102上执行hadoop-daemon.sh start namenode
命令,然后执行jps
命令看是否启动成功。
3.在hadoop102、hadoop103以及hadoop104上分别启动DataNode
在hadoop102、hadoop103以及hadoop104上分别执行hadoop-daemon.sh start datanode
命令,然后执行jps
命令看是否启动成功。
hadoop102:
hadoop103:
hadoop104:
4.web端查看
hadoop102上的NameNode和hadoop102、hadoop103、hadoop104上的DataNode启动成功后,在浏览器地址栏输入hadoop102:50070
后即可进入HDFS的web界面。点击Datanodes即可看到启动的3个DataNode。
P.s.:若NameNode显示数量不对,可试试在hadoop102(NameNode所在的客户机)上删除$HADOOP_HOME下的data和logs文件夹,并重新格式化一下NameNode。
5.思考:每次都一个一个节点启动,如果节点数增加到1000个怎么办?
早上来了开始一个一个节点启动,到晚上下班刚好完成,下班? 所以接下来我们会讲到群起集群。
五、群起集群
1. 配置slaves
在$HADOOP_HOME/etc/hadoop目录下,执行vim slaves
命令,在slaves文件中增加如下内容:
#三台客户机的主机名
hadoop102
hadoop103
hadoop104
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
2.同步所有节点的slaves配置文件:
在$HADOOP_HOME/etc/hadoop目录下,执行xsync slaves
命令。
P.s.:如果不能成功发送到另外两台客户机,你也可以使用scp或者rsync命令。
3.启动集群
(1)如果集群是第一次启动,需要格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除所有节点上的data和logs数据)
在hadoop102(NameNode所在的主机)上执行hadoop namenode -format
命令。
P.s.:因为上面集群单点启动时格式化过NameNode,所有跳过此步。
(2)启动HDFS
在hadoop102上执行start-dfs.sh
命令,启动HDFS,然后在各节点执行jps
命令看是否启动成功。
hadoop102:
hadoop103:
hadoop104:
P.s.:因为上面集群单点启动时已经启动了HDFS,所以需要先关闭。在hadoop102(NameNode所在的主机)上执行hadoop-daemon.sh stop namenode
,然后分别在hadoop102、hadoop103以及hadoop104上分别执行hadoop-daemon.sh stop datanode
命令。
(3)启动YARN
在hadoop103(ResourceManager所在主机)上执行start-yarn.sh
命令,启动YARN,然后在各节点执行jps
命令看是否启动成功。
hadoop102:
hadoop103:
hadoop104:
注意:NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN。
(4)Web端查看
在浏览器地址栏输入hadoop102(NameNode所在主机):50070
,查看HDFS。
在浏览器地址栏输入hadoop104(SecondaryNameNode所在主机):50090
,查看SecondaryNameNode。
在浏览器地址栏输入hadoop103(ResourceManager所在主机):8088
,查看YARN。
六、集群启动/停止方式总结
1. 各个服务组件逐一启动/停止
(1)分别启动/停止HDFS组件
hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode
(2)启动/停止YARN
yarn-daemon.sh start / stop resourcemanager / nodemanager
2. 各个模块分开启动/停止
(1)整体启动/停止HDFS
start-dfs.sh / stop-dfs.sh
(2)整体启动/停止YARN
start-yarn.sh / stop-yarn.sh
P.s.:如果NameNode和ResourceManager在一个节点上,则可在那个节点上使用start-all.sh / stop-all.sh
启动/停止HDFS和YARN。
七、集群时间同步
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
配置时间同步具体实操:
1. 时间服务器配置(必须root用户)
P.s.:下面是在hadoop102上操作的。
(1)检查ntp是否安装
rpm -qa|grep ntp
(2)修改ntp配置文件
vim /etc/ntp.conf
修改内容如下:
a)修改1(授权192.168.20.0-192.168.20.255网段上的所有机器可以从这台机器上查询和同步时间)
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
改为restrict 192.168.20.0 mask 255.255.255.0 nomodify notrap
。
b)修改2(集群在局域网中,不使用其他互联网上的时间)
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
改为
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
在配置文件末尾添加:
server 127.127.1.0
fudge 127.127.1.0 stratum 10
(3)修改/etc/sysconfig/ntpd 文件
vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步):
SYNC_HWCLOCK=yes
(4)重新启动ntpd服务
service ntpd restart
(5)设置ntpd服务开机启动
chkconfig ntpd on
2. 其他机器配置(必须root用户)
(1)在其他机器配置10分钟与时间服务器同步一次
crontab -e
编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate hadoop102
P.s.:Linux中crontab是用来定期执行程序的命令。
(2)修改时间服务器时间
在hadoop102(时间服务器的主机)上执行date -s "时间的字符串"
命令。
(3)十分钟后查看机器是否与时间服务器同步
date
命令可查看本机时间。
说明:测试的时候可以将10分钟调整为1分钟,节省时间。改为一分钟同步即把第一步编写定时任务改为:* * * * * /usr/sbin/ntpdate hadoop102
。