pyspark异构集群部署

28 阅读2分钟

非异构集群部署

/opt/module/spark-3.0.0-bin-hadoop3.2/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--archives hdfs:///user/root/pyspark2.zip#ENV \
--conf spark.executorEnv.PYSPARK_PYTHON=./ENV/pyspark2/bin/python3 \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./ENV/pyspark2/bin/python3 \
--driver-memory 512M \
--executor-memory 1G \
--num-executors 1 \
--executor-cores 1 \
--conf spark.yarn.maxAppAttempts=1 \
python.py

核心参数:

  1. archives
    --archives hdfs:///user/root/pyspark2.zip#ENV
    --archives用于指定上传的python依赖环境和解压路径,依赖环境一般打成zip包,#ENV表示解压到容器工作目录的ENV目录。
    pyspark2.zip的目录结构:


这是一个在x86_64机器上用conda制作的python环境。

  1. spark.yarn.appMasterEnv.PYSPARK_PYTHON
    --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./ENV/pyspark2/bin/python3
    用于指定ApplicationMaster的python解释器路径。

  2. spark.executorEnv.PYSPARK_PYTHON
    --conf spark.executorEnv.PYSPARK_PYTHON=./ENV/pyspark2/bin/python3
    用于指定executor的python解释器路径。

异构集群解决方案

异构集群指集群中的节点的cpu,既有x86架构,也有arm架构。Yarn机器所有的节点都安装了jdk,即所有的机器都有Java的运行环境,分发scala的spark任务时,只需要分发业务代码和第三方jar包,所以scala编写的spark对于异构集群是无感的。但是对于pyspark,一般是提交的时候把整个python环境(包括解释器和其他python包)上传,然后executor去下载。然而python环境与cpu架构是有绑定关系的,x86的python环境放在arm机器上,就会报错:不能执行二进制文件。

解决办法

  1. 为大数据集群中的x86_64节点添加标签,提交任务时指定该标签,任务就只会被调度到x86_64节点。缺点:需要修改集群配置并重启Yarn。

  2. 在aarch64机器上,打一个预测程序所需的python依赖环境。然后运行的时候,上传x86和aarch64两个依赖环境,让容器根据所在机器的cpu架构,选择对应的依赖环境。

方法1是最简单的,但是yarn中这个配置默认是关闭的,公司的yarn集群一般不会显示开启。所以方法1的弊端就是需要修改配置文件,重启Yarn。这在非检修时期一般是不允许的。

方法2的核心在于,编写一个脚本,可以识别cpu,然后选择python解释器路径。

#!/bin/bash

ARCH=$(uname -m)

if [[ "$ARCH" == "x86_64" ]]; then
    ./ENV_X86/pyspark2/bin/python3 "$@"
elif [[ "$ARCH" == "aarch64" || "$ARCH" == "arm64" ]]; then
    ./ENV_ARM/pyspark2/bin/python3 "$@"
else
    echo "Unsupported architecture: $ARCH" >&2
    exit 1
fi

注意:脚本执行中不能做打印操作,否则executor处理数据时会报错。

基于方法2的提交命令:

/opt/module/spark-3.1.1-bin-hadoop3.2/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--archives hdfs:///user/root/pyspark_x86.zip#ENV_X86,hdfs:///user/root/pyspark_arm.zip#ENV_ARM \
--files hdfs:///user/root/select_python.sh \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./select_python.sh  \
--conf spark.executorEnv.PYSPARK_PYTHON=./select_python.sh \
--driver-memory 512M \
--executor-memory 1G \
--num-executors 1 \
--executor-cores 1 \
--conf spark.yarn.maxAppAttempts=1 \
python.py

--archives 分发了两个依赖环境。
--files用于将指定文件分发至容器的工作目录下。
spark.yarn.appMasterEnv.PYSPARK_PYTHON和spark.executorEnv.PYSPARK_PYTHON指定AM和executor的python路径为工作目录下的select_python.sh。在AM和executor中调用python解释器时,则变为了 ./select_python.sh 参数