大数据 Hadoop-3.2.1 分布式集群部署

一. 服务器准备

VMware 里安装四台 CentOS 7,需要配置如下内容

  1. 服务器开启开机自动联网和设置静态IP
  2. 修改主机名且配置 hosts 映射
  3. 关闭防火墙和 selinux
  4. 设置 4 台机器相互之间的 ssh 互信免密登陆

服务器开机自动联网和静态IP

编辑网卡设备 vi /etc/sysconfig/network-scripts/ifcfg-ens33

1
2
3
4
5
6
7
8
9
10
11
# 将 ONBOOT 设置为YES
ONBOOT=YES
# 设置 Linux 静态 ip
BOOTPROTO=static
IPADDR=192.168.44.129
GATEWAY=192.168.44.2
NETMASK=255.255.255.0
DNS1=192.168.44.2
DNS2=114.114.114.114
# 重启网卡
systemctl restart network

注:xshell 建立完连接后可能会卡在 [To escape to local shell, press 'Ctrl+Alt+]'] 无法操作,通过以下方式可解决此问题:vi /etc/ssh/sshd_config,找到 UseDNS yes 修改为 UseDNS no

1
2
# 重启sshd
systemctl restart sshd

修改主机名、配置 Hosts

  • 修改主机名
1
2
3
4
# 设置主机名称,四台服务器依次为 hadoop01、hadoop02、hadoop03、hadoop04
hostnamectl set-hostname hadoop01、02、03、04
# 查看主机名
hostname
  • hosts 域名 IP 映射配置
    vi /etc/hosts 添加如下配置:
1
2
3
4
192.168.44.129 hadoop01
192.168.44.130 hadoop02
192.168.44.131 hadoop03
192.168.44.132 hadoop04

关闭防火墙和selinux

  • 防火墙
1
2
3
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld.service
  • selinux
1
2
vi /etc/selinux/config
将 SELINUX=enforcing 改为 SELINUX=disabled,保存退出,重启生效

设置 ssh 互信免密登陆

参考其他文章 -> Linux SSH免密登陆

二. Hadoop 安装

Hadoop 是基于 Java 平台实现的,首先需要有 JDK 环境,然后再去搭建 Hadoop 集群,需要做如下配置:

  1. 配置 JDK
  2. 下载安装 Hadoop
  3. 修改 Hadoop 集群配置文件
  4. scp 同步每台机器的 Hadoop 环境变量配置和软件目录
  5. 初始化 Hadoop 的 NameNode
  6. 启动 Hadoop
  7. 验证 Hadoop

安装JDK

需要每台服务器都装上 JDK,具体 JDK 如何安装可参考此文章 -> Linux下JDK、Eclipse安装与配置简记

安装 hadoop

Hadoop 官网 下载 Haoop 软件包,然后使用 xftp 上传至服务器 hadoop01 中(hadoop02-04 在修改完集群配置文件后使用 scp 命令从 hadoop01 拷贝过去即可),解压软件至 /opt ,然后配置环境变量,新增 vim /etc/profile.d/myself_env.sh 文件,添加如下内容:

1
2
3
4
export JAVA_HOME=/opt/jdk1.8.0_261   # 需要配置自己的JDK目录
export HADOOP_HOME=/opt/hadoop-3.2.1
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

更新环境变量后使用 hadoop version 查看是否安装成功,现实如下图则说明安装成功。

Hadoop 安装成功

Hadoop 集群配置文件修改

进入 Hadoop 软件目录 /opt/hadoop-3.2.1/etc/hadoop 下,修改如下几个配置文件

  • hadoop-env.sh
1
2
3
4
5
6
7
8
9
10
11
12
export JAVA_HOME=/usr/java/jdk1.8.0_111
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=hadoop
JAVA_HOME:指定JDK路径
HDFS_NAMENODE_USER:指定操作NameNode进程的用户
HDFS_DATANODE_USER:指定操作DataNode进程的用户
HDFS_SECONDARYNAMENODE_USER:指定操作 Secondary NameNode进程的用户,我们这里指定的用户是 root ,具体应用时,据实际情况而定。
这三个配置是hadoop3.x 为了提升安全性而引入的。
日志信息默认在 ${HADOOP_HOME}/logs 中,也可以自行配置目录。
  • core-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<configuration>
<!-- 指定NameNode的地址 -->
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://hadoop01:9820</value>
</property>

<!-- 指定hadoop数据的存储目录 -->
<property>
  <name>hadoop.tmp.dir</name>
  <value>/opt/hadoop-3.2.1/data_file</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为chify -->
<!--
<property>
<name>hadoop.http.staticuser.user</name>
<value>chify</value>
</property>
-->
</configuration>
  • hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<configuration>
<property>
  <name>dfs.replication</name>
  <value>3</value>
</property>
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop01:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop02:9868</value>
</property>
</configuration>
  • mapred-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<configuration>
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop04:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop04:19888</value>
</property>
</configuration>
  • yarn-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<configuration>
<!-- 指定MR走shuffle -->
<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</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>
<!-- 指定ResourceManager的地址(2NN)-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop03</value>
</property>
<!-- 开启日志聚集功能,新设置的话需要重新启动NodeManager 、ResourceManager和HistoryServer。-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop04:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
  • workers
1
2
3
4
hadoop01
hadoop02
hadoop03
hadoop04

scp 拷贝数据至 hadoop02-04 服务器

注:需要上面的集群配置文件修改完后才可再进行拷贝,

1
2
3
4
5
6
7
8
# 拷贝环境变量文件
scp -rv /etc/profile.d/myself_env.sh root@hadoop02:/etc/profile.d/myself_env.sh
scp -rv /etc/profile.d/myself_env.sh root@hadoop02:/etc/profile.d/myself_env.sh
scp -rv /etc/profile.d/myself_env.sh root@hadoop02:/etc/profile.d/myself_env.sh
# 拷贝 hadoop 软件目录
scp -rv $HADOOP_HOME root@hadoop02:$HADOOP_HOME
scp -rv $HADOOP_HOME root@hadoop03:$HADOOP_HOME
scp -rv $HADOOP_HOME root@hadoop04:$HADOOP_HOME

初始化 namenode

初始化目录
bin/hdfs namenode -format

注:首次启动要 format, 如果想重新 format 的话,所有机器的 data_file 目录都需要删除,否则会出问题。

启动 Hadoop

  • 启动/关闭 HDFS
    /opt/hadoop-3.2.1/sbin/start-dfs.sh or stop-dfs.sh

  • 启动 YARN
    /opt/hadoop-3.2.1/sbin/start-yarn.sh or stop-yarn.sh

  • 启动/关闭历史服务
    mapred --daemon start/stop historyserver

验证 Hadoop

  • NameNode 页面
    http://hadoop01:9870/

  • SecondaryNamenode 页面
    http://hadoop02:9868/

  • YARN 页面
    http://hadoop03:8088/

  • JobHistory 页面
    http://hadoop04:19888/

  • 日志聚集页面
    http://hadoop04:19888/jobhistory/logs

注:宿主机电脑的 hosts 文件也需要加上 hadoop01-04 的映射配置

三. 时间同步

如果服务器可以连接互联网且本身会自动同步时间,则可以不用配置。但是如果是内网无法连接互联网或者无法同步时间的时候,则需要配置下 Hadoop01-04 这几台服务器之间的时间同步,否则时间久了就会导致时间偏差,导致集群执行任务时时间不同步。尤其是如果后面还需要部署 Hbase 的话,时间同步时必须要做的,否则一旦时间出现误差,将会出现大问题。

首先先设置好 hadoop01-04 所有机器的时区:timedatectl set-timezone Asia/Shanghai

可以连接互联网时的配置

可以连接互联网,但是服务器默认没有去同步时间时,可以先 yum 安装 ntpd 服务,然后配置所有机器与互联网上的时间服务器进行时间同步。

1
2
3
4
5
6
7
8
# 安装 ntpd 时间同步服务
yum -y install ntp
# 开启时间同步服务
systemctrl start ntpd
# 查看时间同步服务状态
systemctrl status ntpd
# 时间同步服务开机自启动
systemctrl enable ntpd

内网配置 hadoop01-04 同步时间

以 hadoop01 为时间同步服务器,其他服务器以 hadoop01 时间为准进行同步,修改 hadoop01 的 /etc/ntp.conf 文件(vim),修改如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
# 授权 hadoop01所在网段上的所有机器可以从 hadoop01 查询和同步时间
restrict 192.168.44.0 mask 255.255.255.0 nomodify notrap

# 注释掉以下内容,hadoop01不从服务器上同步时间
#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

# 添加如下配置,当该 hadoop01 连接不上互联网时,依然可以采用本地时间作为时间服务器为其他服务器提供时间同步
server 127.127.1.0
fudge 127.127.1.0 stratum 10

修改 hadoop01 下 /etc/sysconfig/ntpd 文件(vim),设置硬件与系统时间进行同步,添加一行:SYNC_HWCLOCK=yes 保存,systemctl restart ntpd 重启时间服务。

进入 hadoop02-04 服务器,添加定时任务,每隔一段时间去同步 hadoop01 时间,如下:

1
2
3
4
5
6
7
8
# 编辑定时任务
crontab -e

# 设置每分钟定时一次,因为时虚拟机,这里设置一分钟
*/1 * * * * /usr/sbin/ntpdate hadoop01

# 也可以设置 每个月1号,或者其他时间更新一次
* * 1 * * /usr/sbin/ntpdate hadoop01

至此,hadoop02-04 服务器就会按规定的时间定期去同步 hadoop01 的时间,大功告成。