Hadoop集群搭建过程记录

Posted by Hazuki on 2019-02-23

之前在服务器上搭建Hadoop的记录,因为对这方面了解不深,有些问题还待解决……

安装过程

环境

  • 三台浪潮服务器
  • CentOs 6.8
  • Hadoop 2.8.5
  • JDK1.8.0_181

配置hadoop账户及ip映射

每个主机建立新账户

1
2
$ useradd hadoop
$ passwd hadoop

设置账户密码
为 hadoop 账户设置管理员权限

1
$ sudo visudo

1
2
## Allow root to run any commands anywhere
root ALL=(ALL) ALL

后添加

1
hadoop	ALL=(ALL)	ALL

中间为tab

修改主机名

1
$ sudo vim /etc/sysconfig/network

将主机名分别修改为 Master、Slave1、Slave2
每一台主机在下面的文件中添加所用节点的ip映射

1
2
3
4
5
$ sudo vim /etc/hosts

172.172.172.29 Master
172.172.172.181 Slave1
172.172.172.160 Slave2

检查各个节点之间是否能连通
Master:

1
2
$ ping Slave1 -c 3
$ ping Slave2 -c 3

Slave1:

1
$ ping Slave2 -c 3

设置SSH无密码登陆节点

生成 Master 节点的公钥,在 Master 节点的终端执行

1
2
$ cd ~/.ssh
$ ssh-keygen -t rsa

所有选项直接回车即可
让 Master 节点能够无密码登陆本机,在 Master 节点上执行

1
$ cat ./id_rsa.pub>>./authorized_keys

在 Master 节点上将公钥传输到其他节点

1
2
$ scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/
$ scp ~/.ssh/id_rsa.pub hadoop@Slave2:/home/hadoop/

在 Slave1 和 Slave2 中将 Master 的公钥添加到~/.ssh/authorized_keys文件的末尾
在 Slave1 和 Slave2 上执行相同操作,每个节点的authorized_keys文件中都保存所有节点的公钥
在 Master 上使用 ssh 命令分别登陆其他两个节点,首次可能需要输入密码,之后不再需要
若不能成功则修改权限

1
2
$ sudo chmod 600 ~/.ssh/authorized_keys
$ sudo chmod 700 ~/.ssh

.ssh的父目录(即/home/hadoop)的权限应为755

安装JDK

1
$ java -version

查看 java 版本,未安装则下载 JDK 安装(后面重新安装了 JDK1.8.0_181)
安装后配置 JAVA_HOME 环境变量

1
$ vim ~/.bashrc

在文件最后一行添加指向 JDK 的安装位置,并保存

1
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.99.x86_64/jre
1
2
echo $JAVA_HOME 
$JAVA_HOME/bin/java -version

检查设置是否正确

配置Hadoop

下载 hadoop,解压到/usr/local,修改文件夹名为 hadoop,修改文件权限,查看是否可用

1
2
3
4
5
6
$ sudo tar -zxf ~/hadoop-2.8.5.tar.gz -C /usr/local
$ cd /usr/local
$ mv hadoop-2.8.5 hadoop
$ sudo chown -R hadoop:hadoop ./hadoop
$ cd ./hadoop
$ ./bin/hadoop version

如果出现Error:JAVA_HOME is not set and could not be found
打开hadoop/etc/hadoop目录下 hadoop-env.sh 脚本,修改其中的 JAVA_HOME 即可

修改hadoop/etc/hadoop下的 slaves 文件,写入作为 DataNode 的主机名

1
2
Slave1
Slave2

修改文件 core-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<configuration>
<property>
<name>fs.defaultFs</name>
<value>hdfs://Master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://127.0.0.1:9000</value>
</property>
</configuration>

修改文件 hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.namenode.data.dir</name>
<value>fild:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>

修改文件 mapred-site.xml(或文件 mapred-site.xml.template,修改后另存为 .xml 文件)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>Master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Master:19888</value>
</property>
</configuration>

修改文件 yarn-site.xml

1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

配置好后将 Master 中/usr/local/hadoop复制到其它两个节点上

1
2
3
4
5
$ cd /usr/local
$ tar -zcf ~/hadoop.master.tar.gz ./hadoop
$ cd~
$ scp ./hadoop.master.tar.gz Slave1:/home/hadoop
$ scp ./hadoop.master.tar.gz Slave2:/home/hadoop

在两个节点上分别执行

1
2
$ sudo tar -zxf /home/hadoop/hadoop.master.tar.gz -C /usr/local
$ sudo chown -R hadoop /usr/local/hadoop

关闭系统的防火墙

1
2
3
$ sudo service iptables stop  #关闭防火墙服务
$ sudo chkconfig iptables off #禁止防火墙开机自启
$ sudo service iptables status #查看防火墙状态

启动hadoop

首次启动时需要在 Master 节点上执行hdfs namenode -format进行 NameNode 的格式化

1
2
3
4
$ cd /usr/local/hadoop/sbin
$ ./start-dfs.sh
$ ./start-yarn.sh
$ ./mr-jobhistory-daemon.sh start historyserver

通过命令 jps 可以查看各个节点所启动的进程
正确的话在 Master 节点上可以看到 NameNode、ResourceManager、SecondaryNameNode、JobHistoryServer 进程
在 Slave1 和 Slave2 上可以看到 DataNode 和 NodeManager 进程
在 Master 节点上通过命令hdfs dfsadmin -report 查看 DataNode 是否正常启动。如果 Live DataNodes 不为 0 则说明启动成功
通过http://172.172.172.29:50090也可以查看 hadoop 的工作状态

遇到的问题

hadoop和hdfs找不到命令

/etc/profile文件中添加环境变量

1
2
3
4
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.99.x86_64/jre
export JRE_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.99.x86_64/jre
export HADOOP_HOME=/usr/local/hadoop
export PATH=.:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH

jps找不到命令

重新安装jdk1.8.0_181,修改相应的环境变量

1
$ source /etc/profile

使设置生效

DataNode没有启动

关闭所有服务,删除每个节点/usr/local/hadoop目录下的 tmp 和 logs 目录,新建 tmp 和 logs,重新初始化节点再启动服务

1
2
3
4
5
6
7
8
9
10
$ cd /usr/local/hadoop
$ ./sbin/stop-dfs.sh
$ ./sbin/stop-yarn.sh
$ sudo rm -r tmp
$ sudo rm -r logs
$ mkdir tmp
$ mkdir logs
$ hadoop namenode -format
$ ./sbin/start-dfs.sh
$ ./sbin/start-yarn.sh

WARN:unable to load native-hadoop library for your platform

hdfs dfsadmin -report显示没有DataNode