一个计算机技术爱好者与学习者

0%

搭建Spark on Yarn集群

1. 前言

计划在三台Linux主机中搭建Spark on Yarn集群,Spark版本3.2.3,Hadoop版本3.2.3。

主机配置为4C8G,操作系统为CentOS7,hosts配置为:

1
2
3
192.168.56.101 spark-master
192.168.56.102 spark-slave1
192.168.56.103 spark-slave2

选择101作为master节点,另外两个作为worker节点。

参考文档:

2. 安装Java

参考文档《全平台安装JDK》

3. 安装Hadoop

3.1. 下载Hadoop安装包

1
2
3
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.2.3/hadoop-3.2.3.tar.gz --no-check-certificate
mkdir -p /usr/local/hadoop/
tar -xzvf hadoop-3.2.3.tar.gz -C /usr/local/hadoop/

3.2. 修改Hadoop配置

1、修改hadoop-env.sh

1
2
cd /usr/local/hadoop/hadoop-3.2.3
vim etc/hadoop/hadoop-env.sh

修改JAVA_HOME为绝对路径。

1
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_161

2、验证环境

1
./bin/hadoop version

3.3. 单机测试运行

1
2
3
4
mkdir ./input
cp ./etc/hadoop/*.xml ./input
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+'
cat ./output/*

看到结果1 dfsadmin表明运行成功。

3.4. master节点配置HDFS

1、修改etc/hadoop/core-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<configuration>
<!-- 指定hdfs中nomenode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://spark-master:9000</value>
</property>

<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/hadoop-3.2.3/data/tmp</value>
</property>
</configuration>

配置参考文档:hadoop3.2.3 core-default.xml

2、修改etc/hadoop/hdfs-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
<configuration>
<!-- 设置dfs副本数 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- hdfs的web管理页面的端口 -->
<property>
<name>dfs.http.address</name>
<value>0.0.0.0:50070</value>
</property>
<!-- 设置secondnamenode的端口 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>spark-master:9001</value>
</property>
<!-- namenode目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/hadoop-3.2.3/data/dfs/name</value>
</property>
<!-- datanode目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/hadoop-3.2.3/data/dfs/data</value>
</property>
</configuration>

配置参考文档:hadoop3.2.3 hdfs-default.xml

3、修改etc/hadoop/workers

1
2
3
spark-master
spark-slave1
spark-slave2

3.5. master节点配置配置Yarn

1、编辑 etc/hadoop/mapred-site.xml

1
2
3
4
5
6
7
<configuration>
<!-- 指定mr运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

2、编辑 etc/hadoop/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
<configuration>
<!-- reducer 获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 YARN 的 ResourceManager 的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>spark-master</value>
</property>

<!-- 该节点上YARN可使用的物理内存总量,默认是 8192(MB)-->
<!-- 注意,如果你的节点内存资源不够8GB,则需要调减小这个值 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>

<!-- 单个任务可申请最少内存,默认 1024 MB -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>

<!-- 单个任务可申请最大内存,默认 8192 MB -->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
</configuration>

3.6. 配置环境变量

1
vim /etc/profile

添加:

1
2
export HADOOP_HOME=/usr/local/hadoop/hadoop-3.2.3
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

使生效:

1
source /etc/profile

3.7. 拷贝配置到slave节点

1
2
3
4
rsync -P -avz /usr/local/hadoop 192.168.56.102:/usr/local/
rsync -P -avz /usr/local/hadoop 192.168.56.103:/usr/local/
rsync -P -avz /etc/profile 192.168.56.102:/etc/profile
rsync -P -avz /etc/profile 192.168.56.103:/etc/profile

3.8. master节点启动HDFS

1、格式化namenode

1
./bin/hdfs namenode -format

执行完成,没有报错,当前目录中出现了tmp目录,表明格式化成功。slave节点不会出现tmp目录。

2、添加HDFS用户环境变量
/etc/profile中添加

1
2
3
4
export HDFS_DATANODE_USER=root
export HDFS_DATANODE_SECURE_USER=hdfs
export HDFS_NAMENODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root

或者sbin/start-dfs.sh 和 sbin/stop-dfs.sh,文件顶部添加

1
2
3
4
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

否则执行可能报错:
Starting namenodes on [spark-master]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [spark-master]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.

3、启动hdfs服务

1
./sbin/start-dfs.sh

这条命令会在master和slave节点同时启动hdfs,会提示输入密码,最好提前配置好免密登录。

4、查看hdfs进程

1
jps -l

master节点可以看到:

  • org.apache.hadoop.hdfs.server.namenode.NameNode
  • org.apache.hadoop.hdfs.server.datanode.DataNode
  • org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode

slave节点可以看到:

  • org.apache.hadoop.hdfs.server.datanode.DataNode

5、浏览器访问
浏览器访问 http://192.168.56.101:50070
可以看到 NameNode 和 Datanode 的信息。

3.9. master节点启动Yarn

1、修改 sbin/start-yarn.sh 和 sbin/stop-yarn.sh,文件顶部添加

1
2
3
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

2、启动yarn

1
./sbin/start-yarn.sh

3、查看进程

1
jps -l

master可以看到:

  • org.apache.hadoop.yarn.server.nodemanager.NodeManager
  • org.apache.hadoop.yarn.server.resourcemanager.ResourceManager

slave节点可以看到:

  • org.apache.hadoop.yarn.server.nodemanager.NodeManager

4、浏览器访问
浏览器访问 http://192.168.56.101:8088
可以看到 Yarn ResourceManager的信息。

4. 安装Spark

4.1. master节点配置

1、下载spark并解压

1
2
3
wget https://archive.apache.org/dist/spark/spark-3.2.3/spark-3.2.3-bin-hadoop3.2-scala2.13.tgz
mkdir -p /usr/local/spark
tar -xzvf spark-3.2.3-bin-hadoop3.2-scala2.13.tgz -C /usr/local/spark

更多版本的spark,可以在Spark release archives页面找到。

2、创建配置文件

1
2
3
4
cd /usr/local/spark/spark-3.2.3-bin-hadoop3.2-scala2.13/conf
cp workers.template workers
cp spark-defaults.conf.template spark-defaults.conf
cp spark-env.sh.template spark-env.sh

3、修改配置
(1)workers中删除localhost,添加

1
2
3
spark-master
spark-slave1
spark-slave2

(2)spark-defaults.conf暂时不变

(3)spark-env.sh中添加

1
2
3
4
5
6
7
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_161
export SPARK_MASTER_HOST=spark-master
export SPARK_MASTER_PORT=7077
export SPARK_HOME=/usr/local/spark/spark-3.2.3-bin-hadoop3.2-scala2.13
export HADOOP_HOME=/usr/local/hadoop/hadoop-3.2.3
export HADOOP_CONF_DIR=/usr/local/hadoop/hadoop-3.2.3/etc/hadoop/
export YARN_CONF_DIR=/usr/local/hadoop/hadoop-3.2.3/etc/hadoop/

4、/etc/profile中添加环境变量

1
2
export SPARK_HOME=/usr/local/spark/spark-3.2.3-bin-hadoop3.2-scala2.13
export PATH=$SPARK_HOME/bin:$PATH

5、使配置生效

1
source /etc/profile

4.2. master配置同步到worker

1
2
3
4
rsync -P -avz /usr/local/spark 192.168.56.102:/usr/local/
rsync -P -avz /usr/local/spark 192.168.56.103:/usr/local/
rsync -P -avz /etc/profile 192.168.56.102:/etc/profile
rsync -P -avz /etc/profile 192.168.56.103:/etc/profile

4.3. 运行Spark

1、启动spark(在master节点上执行)

1
2
cd /usr/local/spark/spark-3.2.3-bin-hadoop3.2-scala2.13/sbin
./start-all.sh

根据提示,依次输入两台worker节点的密码。(这里最好配置上免密登录)
这样,三个节点上的spark就都可以启动起来。

2、验证安装

1
jps -l

master节点看到Master和Worker进程,worker节点看到Worker进程。

3、浏览器访问
浏览器访问 http://192.168.56.101:8080
可以看到spark master信息。
浏览器访问 http://192.168.56.102:8081
可以看到spark slave节点信息。

5. 测试使用Spark on Yarn

1、spark-submit提交任务

1
2
3
4
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
./examples/jars/spark-examples_2.13-3.2.3.jar 1000

3、浏览器查看进度
浏览器访问 http://192.168.50.105:8088
在Yarn ResourceManager页面,可以查看到任务详情。

6. vcore数量不对问题

6.1. 问题描述

理论上:vcores使用数 = executor-cores * num-executors + 1
但是实际提交任务后,配置的executor-cores并没有起作用。

例如:

1
2
3
4
5
6
7
8
./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--driver-memory 2g \
--executor-memory 1g \
--num-executors 4 \
--executor-cores 2 \
./examples/jars/spark-examples_2.13-3.2.3.jar 10

上面的提交,理论上应该使用2 * 4 + 1 = 9核,实际上从Yarn ResourceManager页面查看Allocated CPU VCores,只分配了5核。
也就是说executor-cores没有生效,使用了默认值1。

6.2. 解决办法

1、编辑 capacity-scheduler.xml

1
2
cd /usr/local/hadoop/hadoop-3.2.3
vim etc/hadoop/capacity-scheduler.xml

如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
<property>
<name>yarn.scheduler.capacity.resource-calculator</name>
<!-- <value>org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator</value> -->
<value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>
<description>
The ResourceCalculator implementation to be used to compare
Resources in the scheduler.
The default i.e. DefaultResourceCalculator only uses Memory while
DominantResourceCalculator uses dominant-resource to compare
multi-dimensional resources such as Memory, CPU etc.
</description>
</property>

2、同步到slave节点

1
2
rsync -P -avz /usr/local/hadoop/hadoop-3.2.3/etc/hadoop/ 192.168.56.102:/usr/local/hadoop/hadoop-3.2.3/etc/hadoop
rsync -P -avz /usr/local/hadoop/hadoop-3.2.3/etc/hadoop/ 192.168.56.103:/usr/local/hadoop/hadoop-3.2.3/etc/hadoop

3、重启yarn

1
2
./sbin/stop-yarn.sh
./sbin/start-yarn.sh

参考文档:spark on yarn提交后vcore数不对

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-spark-on-yarn/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~