Hadoop 集群搭建
1. Hadoop 运行环境准备
1.1 模板虚拟机环境准备
安装模板虚拟机,IP 地址为 192.168.50.100,主机名称 hadoop 100、内存 4G、硬盘 50G。
1)安装以下工具(有则跳过):
[root@hadoop100 ~]# yum install -y net-tools
[root@hadoop100 ~]# yum install -y vim
[root@hadoop100 ~]# yum install -y epel-release
- 工具说明
- net-tools:网络工具,如 ifconfig
- vim:文本编辑工具
- epel-release:Extra Packages for Enterprise Linux 是为“红帽系”的操作系统提供额外的软件包,适用于 RHEL、CentOS 和 Scientific Linux。相当于是一个软件仓库,大多数 rpm 包在官方repository 中是找不到的。
2)设置静态 ip 与主机名
- 静态 ip vmware 和 windows 上相关修改参考:Vmware 网络配置
- 配置 ip:vim /etc/sysconfig/network-scripts/ifcfg-ens33
# ...
BOOTPROTO="static"
IPADDR=192.168.50.102
GATEWAY=192.168.50.2
DNS1=192.168.50.2
DNS2=8.8.8.8
注:保证 Linux 系统 ifcfg-ens33 文件中 GATEWAY、DNS 地址 与 虚拟网络编辑器 和 Windows 系统 VM8 相同。
- 修改主机名
[root@hadoop100 ~]# vim /etc/hostname
hadoop100
- 配置 Linux 主机名称映射 hosts 文件(包括将要克隆的机器),使用 vim /etc/hosts 添加以下内容
192.168.50.100 hadoop100
192.168.50.101 hadoop101
192.168.50.102 hadoop102
192.168.50.103 hadoop103
192.168.50.104 hadoop104
192.168.50.105 hadoop105
192.168.50.106 hadoop106
192.168.50.107 hadoop107
192.168.50.108 hadoop108
注:同时需要将这些映射加到 windows 的 hosts 中
3)关闭防火墙,关闭防火墙开机自启(必须以 root 用户)
[root@hadoop100 ~]# systemctl stop firewalld
[root@hadoop100 ~]# systemctl disable firewalld.service
注:在企业开发时,通常单个服务器的防火墙时关闭的。公司整体对外会设置非常安全的防火墙。
4)创建普通用户,并修改密码
[root@hadoop100 ~]# useradd zhy
[root@hadoop100 ~]# passwd zhy
平时操作时,使用 zhy 账户,不必使用 root 账户。
5)配置 zhy 账户具有 root 权限,方便后期加 sudo 执行 root 权限命令
[root@hadoop100 ~]# vim /etc/sudoers
修改/etc/sudoers 文件,在%wheel ALL=(ALL) ALL这行下面添加一行,如下所示:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
zhy ALL=(ALL) NOPASSWD:ALL
注:添加的这一行不要直接放到 root 行下面,因为所有用户都属于 wheel 组,你先配置了 zhy 具有免密功能,但是程序执行到%wheel 行时,该功能又被覆盖回需要密码。所以 添加的行要放到%wheel 这行下面。
6)准备软件存放目录以及安装目录,并修改所属主和所属组
- 在/opt 目录下创建 module、software 文件夹
[root@hadoop100 ~]# mkdir /opt/module
[root@hadoop100 ~]# mkdir /opt/software
- 修改 module、software 文件夹的所有者和所属组均为 zhy 用户
[root@hadoop100 ~]# chown zhy:zhy /opt/module
[root@hadoop100 ~]# chown zhy:zhy /opt/software
完成上述两步后,可以使用 ll 命令查看。
7)如果机器中有自带的 jdk ,则卸载
[root@hadoop100 ~]# rpm -qa | grep -i java | xargs -n1 rpm -e
--nodeps
- rpm -qa:查询所安装的所有 rpm 软件包
- grep -i:忽略大小写
- xargs -n1:表示每次只传递一个参数
- rpm -e –nodeps:强制卸载软件
8)可以在这里安装 jdk 和 hadoop 后再克隆,也可以先克隆后使用分发工具将 jdk 和 hadoop 分发给其他机器,这里先克隆。
1.2 克隆虚拟机
1)利用模板机 hadoop100,克隆三台虚拟机:hadoop102 hadoop103 hadoop104
注:克隆时,需要管理模板虚拟机 hadoop100
2)修改克隆机 IP,以下以 hadoop102 举例说明
- 修改克隆虚拟机的静态 IP:vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.50.102
- 修改克隆机主机名:vim /etc/hostname
[root@hadoop100 ~]# vim /etc/hostname
hadoop102
- 重启
[root@hadoop100 ~]# reboot
2. 集群的安装
2.1 hadoop102 中 JDK 与 hadoop 的安装
1)安装包准备:用 XShell 传输工具将 JDK 与 hadoop 导入到 /opt/software
2)解压 JDK 与 hadoop 到/opt/module 目录下
[zhy@hadoop102 software]$ tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module
[zhy@hadoop102 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module
3)配置环境变量:
- 新建/etc/profile.d/my_env.sh 文件
[zhy@hadoop102 ~]$ sudo vim /etc/profile.d/my_env.sh
注意:不直接修改 /etc/profile 的原因是 /etc/profile.d/比/etc/profile好维护
- 添加以下内容:
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
- 使新的环境变量 PATH 生效:
[zhy@hadoop102 ~]$ source /etc/profile
注:可以使用 java 与 hadoop(的 version )命令验证;如果不能用,尝试重启
2.2 Hadoop 目录结构
2.3 Hadoop 运行模式
Hadoop 官方网站:http://hadoop.apache.org/
Hadoop 运行模式包括:本地模式、伪分布式模式以及完全分布式模式。
- 本地模式:单机运行,只是用来演示一下官方案例。生产环境不用。
- 伪分布式模式:也是单机运行,但是具备 Hadoop 集群的所有功能,一台服务器模拟一个分布式的环境。个别缺钱的公司用来测试,生产环境不用。
- 完全分布式模式:多台服务器组成分布式环境。生产环境使用。
2.4 SSH 无密登录配置(方便 使用 xsync 分发等):
可以先不配置ssh无密登录,使用下面的 xsync 分发——需要输入很多次密码。
1)原理
2)在 hadoop102 生产公钥和私钥:
[zhy@hadoop102 .ssh]$ ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件 id_rsa(私钥)、id_rsa.pub(公钥)
3)将公钥拷贝到要免密登录的目标机器上
[zhy@hadoop102 .ssh]$ ssh-copy-id hadoop102
[zhy@hadoop102 .ssh]$ ssh-copy-id hadoop103
[zhy@hadoop102 .ssh]$ ssh-copy-id hadoop104
4)在 hadoop103、hadoop104 上重复 2)、3)步骤
5)如果需要 root 无密登录,可以切换到 root 重复 2)、3)、4)
2.5 编写集群分发脚本 xsync
1)命令介绍
- scp(secure copy)安全拷贝
- scp 可以实现服务器与服务器之间的数据拷贝
- scp -r fname host:fname
- rsync 远程同步工具
- rsync 主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
- rsync -av fname host:fname
- -a 归档拷贝
- -v 显示复制过程
注意:rsync 和 scp 区别:用 rsync 做文件的复制要比 scp 的速度快,rsync 只对差异文件做更新。scp 是把所有文件都复制过去。
2)xsync 集群分发脚本
- 在/home/zhy/bin 目录下创建 xsync 文件
[zhy@hadoop102 opt]$ cd /home/zhy
[zhy@hadoop102 ~]$ mkdir bin
[zhy@hadoop102 ~]$ cd bin
[zhy@hadoop102 bin]$ vim xsync
- 在该文件中编写如下代码:
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
- 修改脚本 xsync 具有执行权限
[zhy@hadoop102 bin]$ chmod +x xsync
- 使用脚本分发(使用 zhy 账户测试):
[zhy@hadoop102 ~]$ xsync /home/atguigu/bin
- 将脚本复制到/bin 中,以便全局调用
[zhy@hadoop102 bin]$ sudo cp xsync /bin/
- 同步环境变量配置(使用 root 测试):
[zhy@hadoop102 ~]$ sudo ./bin/xsync /etc/profile.d/my_env.sh
注意:如果用了 sudo,那么 xsync 一定要给它的路径补全。
在 hadoop103 和 hadoop 104让环境生效:
[zhy@hadoop103 bin]$ source /etc/profile
[zhy@hadoop104 opt]$ source /etc/profile
3. 集群配置
3.1 集群部署规划:
NameNode、SecondaryNameNode、ResourceManager 尽量不要装在同一台机器上;因为都比较耗内存。
- HDFS
- hadoop102:NameNode、DataNode
- hadoop103:DataNode
- hadoop104:SecondaryName、DataNode
- YARN
- hadoop102:NodeManager
- hadoop103:ResourceManager、NodeManager
- hadoop104:NodeManager
3.2 配置文件说明
Hadoop 配置文件分两类:默认配置文件和自定义配置文件,用户想修改某一默认配置值时,只需要修改自定义配置文件,更改相应属性值。
1)默认配置文件(及文件存放在 Hadoop 的 jar 包):
- core-default.xml: hadoop-common-3.1.3.ja
- hdfs-default.xml:hadoop-hdfs-3.1.3.jar/hdfs-default.xml
- yarn-default.xml:hadoop-yarn-common-3.1.3.jar
- mapred-default.xml:hadoop-mapreduce-client-core-3.1.3.jar
2)自定义配置文件:
- core-site.xml
- hdfs-site.xml
- yarn-site.xml
- mapred-site.xml
四个配置文件存放在$HADOOP_HOME/etc/hadoop 这个路径上,用户可以根据项目需求重新进行修改配置。
3.3 集群配置
1)核心配置文件: core-site.xml
[zhy@hadoop102 ~]$ cd $HADOOP_HOME/etc/hadoop
内容:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<!-- 指定 hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置 HDFS网页登录使用的静态用户为 atguigu -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>zhy</value>
</property>
</configuration>
2)HDFS配置文件
[zhy@hadoop102 hadoop]$ vim hdfs-site.xml
内容:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>
3)YARN 配置文件
[zhy@hadoop102 hadoop]$ vim yarn-site.xml
内容:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 MR走 shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
4)MapReduce 配置文件
[zhy@hadoop102 hadoop]$ vim mapred-site.xml
内容
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 MapReduce程序运行在 Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
5)配置历史服务器:后面配置,先用起来
6)配置日志的聚集:后面配置,先用起来
最后,使用 xsync 分发:
[zhy@hadoop102 hadoop]$ xsync /opt/module/hadoop-3.1.3/etc/hadoop/
3.4 启动集群
1)配置 workers
[zhy@hadoop102 hadoop]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
hadoop102
hadoop103
hadoop104
同步所有节点配置文件
[zhy@hadoop102 hadoop]$ xsync /opt/module/hadoop-3.1.3/etc
2)启动集群
- 如果集群是第一次启动,需要在 hadoop102 节点格式化 NameNode(注意:格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化。)
[zhy@hadoop102 hadoop-3.1.3]$ hdfs namenode -format
- 在 hadoop102 启动 HDFS
[zhy@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh
- 在配置了 ResourceManager 的节点(hadoop103)启动 YARN
[zhy@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
- 验证:
- 可以使用 jps
- 游览器
- http://hadoop102:9870 查看 HDFS 上存储的数据信息
- http://hadoop103:8088 查看 YARN 上运行的 Job 信息
3)集群基本测试
- 上传 word.txt (若没有,先创建)到集群
[zhy@hadoop102 ~]$ hadoop fs -mkdir /input
[zhy@hadoop102 ~]$ hadoop fs -put $HADOOP_HOME/wcinput/word.txt /wcinput
- 执行 wordcount 程序
[zhy@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput
注:可以在 http://hadoop103:8088 查看job信息,在 http://hadoop102:9870 查看结果数据。
3.5 集群其他服务配置:历史服务
1) 配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
- 配置 mapred-site.xml
[zhy@hadoop102 hadoop]$ vim mapred-site.xml
在该文件里面增加如下配置。
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器 web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
- 分发配置
[zhy@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
- 在 hadoop102 启动历史服务器
[zhy@hadoop102 hadoop]$ mapred --daemon start historyserver
- 查看历史服务器是否启动
[zhy@hadoop102 ~]$ jps
2240 NodeManager
2416 JobHistoryServer
3249 Jps
1794 NameNode
1950 DataNode
- 查看 JobHistory
http://hadoop102:19888/jobhistory
2)配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到 HDFS 系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注 意 : 开 启 日 志 聚 集 功 能 , 需 要 重 新 启 动 NodeManager 、ResourceManager 和 HistoryServer。
开启日志聚集功能具体步骤如下:
- 配置 yarn-site.xml
[zhy@hadoop102 hadoop]$ vim yarn-site.xml
在该文件里面增加如下配置。
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为 7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
- 分发配置
[zhy@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
- 关闭 NodeManager 、ResourceManager 和 HistoryServer
[zhy@hadoop102 hadoop-3.1.3]$ mapred --daemon stop historyserver
[zhy@hadoop103 hadoop-3.1.3]$ sbin/stop-yarn.sh
[zhy@hadoop102 hadoop-3.1.3]$ sbin/stop-dfs.sh
- 启动 NodeManager 、ResourceManage 和 HistoryServer
[zhy@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh
[zhy@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
[zhy@hadoop102 hadoop-3.1.3]$ mapred --daemon start historyserver
- 删除 HDFS 上已经存在的输出文件
[zhy@hadoop102 ~]$ hadoop fs -rm -r /wcoutput
- 执行 WordCount 程序
[zhy@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput
- 查看日志
- 历史服务器地址 http://hadoop102:19888/jobhistory
- 点击 Job ID 下的数据历史任务列表
- 点击 logs 查看任务运行日志
3.6 编写 Hadoop 集群常用脚本
1)Hadoop 集群启停脚本(包含 HDFS,Yarn,Historyserver):myhadoop.sh
[zhy@hadoop102 ~]$ cd /home/zhy/bin
[zhy@hadoop102 bin]$ vim myhadoop.sh
输入如下内容:
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
保存后退出,然后赋予脚本执行权限
[zhy@hadoop102 bin]$ chmod +x myhadoop.sh
2)查看三台服务器 Java 进程脚本:jpsall
[zhy@hadoop102 ~]$ cd /home/zhy/bin
[zhy@hadoop102 bin]$ vim jpsall
输入如下内容
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
保存后退出,然后赋予脚本执行权限
[zhy@hadoop102 bin]$ chmod +x jpsall
3)分发/home/zhy/bin 目录,保证自定义脚本在三台机器上都可以使用
[zhy@hadoop102 ~]$ xsync /home/zhy/bin/
4. 集群时间同步
- 如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期和公网时间进行校准;
- 如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行任务时间不同步。
1)查看所有节点 ntpd 服务状态和开机自启动状态
[zhy@hadoop102 ~]$ sudo systemctl status ntpd
[zhy@hadoop102 ~]$ sudo systemctl start ntpd
[zhy@hadoop102 ~]$ sudo systemctl is-enabled ntpd
2)修改 hadoop102 配置文件(必须 root 用户)
修改 ntp.conf 配置文件:
[zhy@hadoop102 ~]$ sudo vim /etc/ntp.conf
修改内容如下:
(a)修改 1(授权 192.168.1.0-192.168.10.255 网段上的所有机器可以从这台机器上查询和同步时间)
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
为:
restrict 192.168.1.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)修改 hadoop102 的/etc/sysconfig/ntpd 文件
[zhy@hadoop102 ~]$ sudo vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
(4)重新启动 ntpd 服务,并设置开机自启动
[zhy@hadoop102 ~]$ sudo systemctl start ntpd
[zhy@hadoop102 ~]$ sudo systemctl enable ntpd
3)其他机器配置(必须 root 用户)
(1)关闭所有节点上 ntp 服务和自启动
[zhy@hadoop103 ~]$ sudo systemctl stop ntpd
[zhy@hadoop103 ~]$ sudo systemctl disable ntpd
[zhy@hadoop104 ~]$ sudo systemctl stop ntpd
[zhy@hadoop104 ~]$ sudo systemctl disable ntpd
(2)在其他机器配置 1 分钟与时间服务器同步一次
[zhy@hadoop103 ~]$ sudo crontab -e
编写定时任务如下:
*/1 * * * * /usr/sbin/ntpdate hadoop102
(3)修改任意机器时间
[zhy@hadoop103 ~]$ sudo date -s "2018-8-22 18:30:10"
(4)1 分钟后查看机器是否与时间服务器同步
[zhy@hadoop103 ~]$ sudo date