Hadoop之集群搭建

准备环境

三台linux服务器:系统:双核CPU,CentOS6.8、内存:4G、硬盘:50G+

服务器对应的hostname和IP地址

hostname ip
linux101 192.168.1.101
linux102 192.168.1.102
linux103 192.168.1.103

集群规划:

linux101 linux102 linux103
DataNode DataNode DataNode
NodeManager NodeManager NodeManager
NameNode
ResourceManager
JobHistoryServer
hadoop使用2.7.2版本,下载地址, 安装包名为hadoop-2.7.2.tar.gz
JDK使用jdk8_144版本,下载地址, 安装包名为jdk-8u144-linux-x64.tar.gz
使用root用户登录linux101
依次配置三台服务器的/etc/hosts
vim /etc/hosts
1
2
3
192.168.1.101   linux101
192.168.1.102 linux102
192.168.1.103 linux103

创建用户

在三台服务器各创建一个普通用户mapan,并配置密码
useradd mapan
passwd 123456

配置这个用户为sudoers
vim /etc/sudoers
root ALL=(ALL) ALL一行下面
添加mapan ALL=(ALL) NOPASSWD:ALL
保存时wq!强制保存

在/opt目录下创建两个文件夹module和software,并把所有权赋给mapan

1
2
mkdir /opt/module /opt/software
chown mapan:mapan /opt/module /opt/software

创建分发脚本

以下使用mapan用户登录

1
sudo vim /bin/xsync

内容如下:

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
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi

#2. 遍历所有目录,挨个发送
for file in $@
do
#4.5 判断文件是否存在
if [ -e $file ]
then
#3. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)

#4. 获取当前文件的名称
fname=$(basename $file)

#5. 遍历集群所有机器,拷贝
for host in linux101 linux102 linux103
do
echo ==================== $host ====================
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $USER@$host:$pdir
done
else
echo $file does not exists!
fi
done

创建群呼脚本

1
sudo vim /bin/xcall

输入下面内容并保存

1
2
3
4
5
6
7
8
#! /bin/bash 
for i in linux101 linux102 linux103
do
echo ---------$i---------
ssh $i "$*"
echo " "
echo " "
done

赋执行权限,分发上面的脚本

1
2
sudo chmod +x /bin/xsync /bin/xcall
sudo xsync /bin/xsync /bin/xcall

配置免密登陆

  1. 生成密钥对
    ssh-keygen -t rsa 三次回车
  2. 发送公钥到本机
    ssh-copy-id linux001 输入一次密码
  3. 分别ssh登陆一下所有虚拟机
    1
    2
    3
    4
    ssh linux102
    exit
    ssh linux103
    exit
  4. 把~/.ssh 文件夹发送到集群所有服务器
    xsync ~/.ssh

关闭防火墙

关闭四台服务器的防火墙和SELINUX

查看防火墙状态

1
service iptables status

关闭防火墙

1
2
service iptables stop 
chkconfig iptables off

关闭SELINUX

sudo vim /etc/selinux/config

修改SELINUX的属性为disable

1
SELINUX=disabled

分发config文件

sudo xsync /etc/selinux/config

重启三台服务器

安装jdk和hadoop

先在一台机器上安装Java和Hadoop,并配置环境变量,并分发到集群其他机器
准备安装文件
jdk-8u144-linux-x64.tar.gz
hadoop-2.7.2.tar.gz

  1. 拷贝安装文件到/opt/software,两个tar包

  2. tar -zxvf /opt/software/hadoop-2.7.2.tar.gz -C /opt/module

  3. tar -zxvf /opt/software/jdk-8u144-linux-x64.tar.gz -C /opt/module

  4. sudo vim /etc/profile.d/jdk.sh
    输入下面内容并保存

    1
    2
    3
    4
    #JAVA_HOME
    export JAVA_HOME=/opt/module/jdk1.8.0_144
    export PATH=$PATH:$JAVA_HOME/bin
    # 注: jdk1.7及之前需要配置classpath变量,1.7之后不需要
  5. sudo vim /etc/profile.d/hadoop.sh
    输入下面内容并保存

    1
    2
    3
    #HADOOP_HOME
    export HADOOP_HOME=/opt/module/hadoop-2.7.2
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  6. 同步JDK和hadoop的安装文件
    xsync /opt/module

  7. 同步环境变量的配置文件
    sudo xsync /etc/profile.d/jdk.sh /etc/profile.d/hadoop.sh

  8. 使三台服务器的环境变量生效
    xcall source /etc/profile

配置hadoop

所有配置文件都在$HADOOP_HOME/etc/hadoop
一共有8个文件需要配置:

*-env.sh *-site.xml
hadoop-env.sh hdfs-site.xml
yarn-env.sh yarn-site.xml
mapred-env.sh mapred-site.xml
core-site.xml

最后一个是slaves文件。

  1. 首先配置hadoop-env.sh,yarn-env.sh,mapred-env.sh文件,配置JAVA_HOME
    在每个文件第二行添加 export JAVA_HOME=/opt/module/jdk1.8.0_144

  2. 配置Core-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!-- 指定HDFS中NameNode的地址 -->
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://linux101:9000</value>
    </property>

    <!-- 指定Hadoop运行时产生文件的存储目录 -->
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/module/hadoop-2.7.2/data/tmp</value>
    </property>
  3. 配置hdfs-site.xml

1
2
3
4
5
<!-- 数据的副本数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
  1. 配置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
<!-- Site specific YARN configuration properties -->
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>linux102</value>
</property>
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>

<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
  1. 配置mapred-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>linux101:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>linux101:19888</value>
</property>

启动历史服务器的命令:mr-jobhistory-daemon.sh start historyserver

  1. 配置slaves文件
    注意slaves文件不要有空格,不要有空行。

    1
    2
    3
    linux101
    linux102
    linux103
  2. 分发配置文件
    xsync /opt/module/hadoop-2.7.2/etc

  3. 在linux001上格式化Namenode
    hdfs namenode -format

  4. 启动hdfs
    start-dfs.sh

  5. 在配置了Resourcemanager机器linux002上启动yarn
    start-yarn.sh

编写hadoop脚本

每次开集群都需要单个执行上面脚本,于是可以编写一个集群启动/停止脚本

1
2
3
4
cd ~/
mkdir bin
cd bin
vim hdp

输入下面内容并保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#! /bin/bash

case $1 in
"start"){
ssh linux101 "/opt/module/hadoop-2.7.2/sbin/start-dfs.sh"

ssh linux102 "/opt/module/hadoop-2.7.2/sbin/start-yarn.sh"

ssh linux101 "/opt/module/hadoop-2.7.2/sbin/mr-jobhistory-daemon.sh start historyserver"
};;

"stop"){

ssh linux101 "/opt/module/hadoop-2.7.2/sbin/mr-jobhistory-daemon.sh stop historyserver"

ssh linux102 "/opt/module/hadoop-2.7.2/sbin/stop-yarn.sh"

ssh linux101 "/opt/module/hadoop-2.7.2/sbin/stop-dfs.sh"
};;
esac

给予执行权限
chmod +x hdp
以后每次开启集群只需要 执行 hdp start
关闭集群只需要hdp stop