1. 前言
计划在三台Linux主机中搭建Spark on Yarn集群,Spark版本3.2.3,Hadoop版本3.2.3。
主机配置为4C8G,操作系统为CentOS7,hosts配置为:
1 | 192.168.56.101 spark-master |
选择101作为master节点,另外两个作为worker节点。
参考文档:
- 《Linux中安装配置Hadoop》
- 《Linux中搭建Spark集群》
- Hadoop 3.2.2 安装与使用文档超详细图文步骤
- spark3.2+hadoop3.3.2三节点分布式部署初体验
- 搭建Spark on Yarn集群
- spark3.3.0安装&部署过程
2. 安装Java
参考文档《全平台安装JDK》
3. 安装Hadoop
3.1. 下载Hadoop安装包
1 | wget https://dlcdn.apache.org/hadoop/common/hadoop-3.2.3/hadoop-3.2.3.tar.gz --no-check-certificate |
3.2. 修改Hadoop配置
1、修改hadoop-env.sh
1 | cd /usr/local/hadoop/hadoop-3.2.3 |
修改JAVA_HOME为绝对路径。
1 | export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_161 |
2、验证环境
1 | ./bin/hadoop version |
3.3. 单机测试运行
1 | mkdir ./input |
看到结果1 dfsadmin
表明运行成功。
3.4. master节点配置HDFS
1、修改etc/hadoop/core-site.xml
1 | <configuration> |
配置参考文档:hadoop3.2.3 core-default.xml
2、修改etc/hadoop/hdfs-site.xml
1 | <configuration> |
配置参考文档:hadoop3.2.3 hdfs-default.xml
3、修改etc/hadoop/workers
1 | spark-master |
3.5. master节点配置配置Yarn
1、编辑 etc/hadoop/mapred-site.xml
1 | <configuration> |
2、编辑 etc/hadoop/yarn-site.xml
1 | <configuration> |
3.6. 配置环境变量
1 | vim /etc/profile |
添加:
1 | export HADOOP_HOME=/usr/local/hadoop/hadoop-3.2.3 |
使生效:
1 | source /etc/profile |
3.7. 拷贝配置到slave节点
1 | rsync -P -avz /usr/local/hadoop 192.168.56.102:/usr/local/ |
3.8. master节点启动HDFS
1、格式化namenode
1 | ./bin/hdfs namenode -format |
执行完成,没有报错,当前目录中出现了tmp目录,表明格式化成功。slave节点不会出现tmp目录。
2、添加HDFS用户环境变量
/etc/profile中添加
1 | export HDFS_DATANODE_USER=root |
或者sbin/start-dfs.sh 和 sbin/stop-dfs.sh,文件顶部添加
1 | HDFS_DATANODE_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 | YARN_RESOURCEMANAGER_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 | wget https://archive.apache.org/dist/spark/spark-3.2.3/spark-3.2.3-bin-hadoop3.2-scala2.13.tgz |
更多版本的spark,可以在Spark release archives页面找到。
2、创建配置文件
1 | cd /usr/local/spark/spark-3.2.3-bin-hadoop3.2-scala2.13/conf |
3、修改配置
(1)workers中删除localhost,添加
1 | spark-master |
(2)spark-defaults.conf暂时不变
(3)spark-env.sh中添加
1 | export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_161 |
4、/etc/profile中添加环境变量
1 | export SPARK_HOME=/usr/local/spark/spark-3.2.3-bin-hadoop3.2-scala2.13 |
5、使配置生效
1 | source /etc/profile |
4.2. master配置同步到worker
1 | rsync -P -avz /usr/local/spark 192.168.56.102:/usr/local/ |
4.3. 运行Spark
1、启动spark(在master节点上执行)
1 | cd /usr/local/spark/spark-3.2.3-bin-hadoop3.2-scala2.13/sbin |
根据提示,依次输入两台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 | ./bin/spark-submit \ |
3、浏览器查看进度
浏览器访问 http://192.168.50.105:8088
在Yarn ResourceManager页面,可以查看到任务详情。
6. vcore数量不对问题
6.1. 问题描述
理论上:vcores使用数 = executor-cores * num-executors + 1
但是实际提交任务后,配置的executor-cores并没有起作用。
例如:
1 | ./bin/spark-submit --class org.apache.spark.examples.SparkPi \ |
上面的提交,理论上应该使用2 * 4 + 1 = 9
核,实际上从Yarn ResourceManager页面查看Allocated CPU VCores,只分配了5核。
也就是说executor-cores没有生效,使用了默认值1。
6.2. 解决办法
1、编辑 capacity-scheduler.xml
1 | cd /usr/local/hadoop/hadoop-3.2.3 |
如下修改:
1 | <property> |
2、同步到slave节点
1 | 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 |
3、重启yarn
1 | ./sbin/stop-yarn.sh |