Centos7搭建hadoop spark集群之hadoop集群搭建

准备工作及环境

两台主机

1
2
10.4.20.181 spark01
10.4.20.48 spark02

系统均为centos7

jdk已经装好

参考我的另一篇博客centos7下卸载自带的java安装jdk8

创建用户

建议创建一个单独的用户spark以从Unix文件系统隔离Hadoop文件系统

1
2
3
4
useradd hadoop
passwd hadoop
New password:
Retype new password:

授权 root 权限,在root下面加一条hadoop的hadoop ALL=(ALL) ALL,用root用户执行如下命令

1
vim /etc/sudoers

添加如下内容

1
2
root    ALL=(ALL)       ALL
spark ALL=(ALL) ALL

SSH 免秘钥

参考我的另一篇博客CentOs7搭建hadoop spark集群之ssh免密登录

hadoop集群搭建

下载hadoop2.7.5并解压到相应目录

我在本地window已经下好了hadoop-2.7.5.tar.gz的压缩包,并使用xftp将其上传到了主机spark01的/home/spark/download目录下
在用户spark的主目录下(即/home/spark)创建app文件夹,用于安装hadoop和spark,将hadoop-2.7.5解压到app目录下

1
2
mkdir /home/spark/app
tar -zxf /home/spark/download/hadoop-2.7.5.tar.gz -C /home/spark/app

进入app目录并修改hadoop-2.7.5的文件名

1
2
cd /home/spark/app
mv hadoop-2.7.5 hadoop

环境变量

如果是对所有的用户都生效就修改vim /etc/profile 文件
如果只针对当前用户生效就修改 vim ~/.bahsrc 文件

1
sudo vim /etc/profile

在文件末尾添加以下内容

1
2
3
4
#hadoop
HADOOP_HOME=/home/spark/app/hadoop/
PATH=$HADOOP_HOME/bin:$PATH
export PATH HADOOP_HOME

使环境变量生效,运行下面的命令使/etc/profile文件生效

1
source /etc/profile

~/.bahsrc文件同理

配置Hadoop

集群/分布式模式需要修改 /home/spark/app/hadoop/etc/hadoop 中的5个配置文件,更多设置项可点击查看官方说明,这里仅设置了正常启动所必须的设置项: slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml。
进入hadoop 配置文件目录

1
cd /home/spark/app/hadoop/etc/hadoop/

编辑 hadoop-env.sh 文件,找到 JAVA_HOME 改为 JDK 的安装目录

1
2
vim hadoop-env.sh
export JAVA_HOME=/usr/java

这里我的jdk安装目录为/usr/java

修改 core-site.xml
打开 core-site.xml文件并对其进行编辑,如下图所示。

1
vim core-site.xml

修改内容如下

1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://spark01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/spark/app/hadoop/tmp</value>
</property>
</configuration>

spark01是我的master节点名,你可以将spark01换成你的master节点名,hadoop.tmp.dir属性也要换成自己的

修改 hdfs-site.xml
打开hdfs-site.xml文件并对其进行编辑,如下图所示。

1
vim 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>spark01:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/spark/app/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/spark/app/hadoop/tmp/dfs/data</value>
</property>
</configuration>

注意修改master节点名,我的是spark01,dfs.namenode.name.dir和dfs.datanode.data.dir这两个属性

修改 mapred-site.xml
目录下么没有这个文件,这有一个模板,我们需要先拷贝一份

1
2
cp mapred-site.xml.template mapred-site.xml
vim mapred-site.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>spark01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>spark01:19888</value>
</property>
</configuration>

注意修改master节点名

修改 yarn-site.xml

1
vim yarn-site.xml

修改内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
<configuration>

<!-- Site specific YARN configuration properties -->

<property>
<name>yarn.resourcemanager.hostname</name>
<value>spark01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

注意修改master节点名

配置集群

复制节点
将spark01的hadoop文件夹重打包后复制到其他子节点

1
2
3
cd /home/spark/app
tar zcf hadoop.tar.gz hadoop
scp hadoop.tar.gz spark@spark02:/home/spark/app

在其他子节点 解压

1
tar -zxf hadoop.tar.gz

配置slaves文件

修改(Master主机)spark01的/home/spark/app/hadoop/etc/hadoop/slaves文件
该文件指定哪些服务器节点是datanode节点。删除locahost,添加所有datanode节点的主机名

1
2
cd /home/spark/app/hadoop/etc/hadoop/
vim slaves

删除localhost,添加节点主机名,这里我将master节点也作为datanode节点使用

1
2
spark01
spark02

关闭防火墙

CentOS系统需要关闭防火墙
CentOS系统默认开启了防火墙,在开启 Hadoop 集群之前,需要关闭集群中每个节点的防火墙。有防火墙会导致 ping 得通但 telnet 端口不通,从而导致 DataNode 启动了,但 Live datanodes 为 0 的情况。
在 CentOS 6.x 中,可以通过如下命令关闭防火墙:

1
2
sudo service iptables stop   # 关闭防火墙服务
sudo chkconfig iptables off # 禁止防火墙开机自启,就不用手动关闭了

若用是 CentOS 7,需通过如下命令关闭(防火墙服务改成了 firewall):

1
2
systemctl stop firewalld.service    # 关闭firewall
systemctl disable firewalld.service # 禁止firewall开机启动

启动集群操作

首次启动需要先在 Master 节点执行 NameNode 的格式化:

1
hdfs namenode -format       # 首次运行需要执行初始化,之后不需要

接着可以启动 hadoop 了,启动需要在 Master 节点上进行:

1
2
3
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver

通过命令 jps 可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 、datanode进程,
master节点jps进程
在slave节点可以看到DataNode 和 NodeManager 进程
slave节点jsp进程
缺少任一进程都表示出错。如果进程都启动成功说明hadoop集群搭建成功
另外还需要在 Master 节点上通过命令 hdfs dfsadmin -report 查看 DataNode 是否正常启动,如果 Live datanodes 不为 0 ,则说明集群启动成功。
Live datanodes
也可以通过 Web 页面看到查看 DataNode 和 NameNode 的状态:http://spark01:50070/。如果不成功,可以通过启动日志排查原因。
spark01
访问http://spark01:8088,查看yarn的工作状态
spark01

执行分布式实例

首先创建 HDFS 上的用户目录:

1
hdfs dfs -mkdir -p /user/spark

将 /home/spark/app/hadoop/etc/hadoop 中的配置文件作为输入文件复制到分布式文件系统中

1
2
hdfs dfs -mkdir input
hdfs dfs -put /home/spark/app/hadoop/etc/hadoop/*.xml input

接着就可以运行 MapReduce 作业了:

1
hadoop jar /home/spark/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'

可能会有点慢,但如果迟迟没有进度,比如 5 分钟都没看到进度,那不妨重启 Hadoop 再试试。若重启还不行,则很有可能是内存不足引起,建议增大虚拟机的内存,或者通过更改 YARN 的内存配置解决。

运行结果如下图所示
MapReduce
同样可以通过 Web 界面查看任务进度 http://spark01:8088/cluster
任务进度
执行如下命令查看执行完毕后的输出结果:

1
hdfs dfs -cat output/*

输出结果
输出结果

关闭 Hadoop 集群也是在 Master 节点上执行的:

1
2
3
stop-yarn.sh
stop-dfs.sh
mr-jobhistory-daemon.sh stop historyserver

至此,hadoop集群搭建成功

打赏

请我喝杯咖啡吧~

支付宝
微信