管理Spark和HDFS
启动和关闭
Spark和Hadoop的部署其实可配置的东西很复杂,但是多数教学用不到而且毕竟麻烦,所以我们只启动最简单的Spark Standalone和HDFS
$SPARK_HOME/sbin/start-all.sh # 启动spark
$SPARK_HOME/sbin/stop-all.sh # 关闭spark
$HADOOP_HOME/sbin/start-dfs.sh # 启动hdfs
$HADOOP_HOME/sbin/stop-dfs.sh # 关闭hdfs
# 如果环境变量没有找到上面的脚本,输入source /etc/profile
spark和hadoop配置成系统服务比较困难,目前加到了开机项,但不保证遇到一些特殊原因会自行关闭,如果发现连接不上,需要手动启动。
目前spark集群有一个master,一个worker节点,则启动时命令如下
$SPARK_HOME/sbin/start-master.sh
$SPARK_HOME/sbin/start-worker.sh spark://10.40.13.225:7077
Spark不能使用root启动,因为启动用户通过ssh连接master和worker,而root出于安全考虑被禁止ssh登录
WebUI
HDFS 10.40.13.225:50070
Spark Master节点 10.40.13.225:8080
spark-shell/pyspark的应用监控:10.40.13.225:4040,4041,4042,...
为避免占用过多服务器资源,spark-defaults.conf中我们可以禁用spark-shell/pyspark的ui(spark.ui.enabled false
)。
通过WebUI监控spark作业
在10.40.13.225:8080中可以看到当前spark中运行的application,可以手动结束占用资源过大的作业,也可以通过网页提供的链接访问具体某个作业的WebUI,如果网页访问失败,请注意网址域名是否变成了chenserver.chen.server,将其改为10.40.13.225重新访问即可。
另外,请通过netstat -nltp
命令可以查看4040、4041、4042...这一族端口的开启情况,并结合8080网页的作业情况对比,是否有学生用户自行创建了新的spark cluster,如果有,请及时终止其进程。
安装配置
这部分网上的教程很多,主要就是这几个步骤
- 拷贝ssh密钥配置免密
- 下载软件
- 修改环境变量配置JAVA_HOM/HADOOP_HOME/SPARK_HOME
- 修改Spark和Hadoop自身配置
- 对于spark主要是$SPARK_HOME/conf/spark-env.sh配置好一些变量
- 对于hadoop是$HADOOP_HOME/etc/hadoop/,这里比较复杂需要参考网上教程,然后初始化namenode
- 用安装目录sbin文件夹内的脚本启动服务
- Jps查看已启动进程判断是否成功,HDFS是看到namenode、secondarynamenode、datanode各一个,Spark是看到Master和Worker各一个
环境变量修改/etc/profile直接为所有用户配置比较省事,但保险起见spark和hadoop自己的环境变量仍要写一遍。
动态资源分配
Spark默认配置会给每个application的executer分配所有可用的cpu,直至application退出才释放。而我们的课程中学生多使用交互式spark而非作业提交,不终止notebook/session时application根本不会退出,在多人同时连接时其他人的程序会一直等待,因此我们需要设置每个excutor可使用的最大cpu核数,以及动态资源分配,以便在用户不运行新的交互式命令,系统自动释放对应的executor。详细配置请查阅spark官方文档。
在spark-defaults.conf中添加如下设置
# 动态资源分配
spark.dynamicAllocation.enabled true
## 设置每个executer在闲置30s后释放
spark.dynamicAllocation.executorIdleTimeout 30s
## 设置每个executer的缓存在闲置两天后也释放
spark.dynamicAllocation.cachedExecutorIdleTimeout 2d
spark.dynamicAllocation.shuffleTracking.enabled true
spark.shuffle.service.enabled true
# 每个executor启动时默认分配的cpu个数
spark.deploy.defaultCores 2
# 最大分配的cpu个数
spark.cores.max 4
示例配置文件
spark-env.sh
SPARK_LOCAL_IP=10.40.13.225
SPARK_LOG_DIR=/data/spark/logs
SPARK_SSH_OPTS="-p 9933"
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
SPARK_HOME=/usr/local/spark-3.3.0-bin-hadoop3
SCALA_HOME=/usr/share/scala-2.11
PYSPARK_PYTHON=/usr/local/anaconda3/envs/jupyter/bin/python
PYSPARK_DRIVER_PYTHON=/usr/local/anaconda3/envs/jupyter/bin/python
spark-defaults.conf
spark.master spark://10.40.13.225:7077
spark.dynamicAllocation.enabled true
spark.dynamicAllocation.executorIdleTimeout 30s
spark.dynamicAllocation.cachedExecutorIdleTimeout 2d
spark.dynamicAllocation.shuffleTracking.enabled true
spark.shuffle.service.enabled true
spark.deploy.defaultCores 2
spark.cores.max 4
关于Scala
目前jupyter并未安装scala的kernel
scala的配置相比python有一些复杂,且apache-toree文档不是很完善,目前没有安装,如果后续需要可以尝试