Spark混部集群适配独立Python 用户指南

52 篇文章 10 订阅

问题分析

更新时间:2020/10/19 GMT+08:00

说明:

  1. 以PySpark任务提交的独立Python包中为ARM版本Python为例说明。
  2. 集群为x86与ARM的混合部署Spark集群。
  3. 任务脚本“/opt/test_spark.py”为举例脚本,可用其它PySpark任务替代。
  4. test_spark.py脚本内容
# test_spark.py
import os
import sys
from pyspark import SparkContext
from pyspark import SparkConf

conf = SparkConf()
conf.setAppName("get-hosts")

sc = SparkContext(conf=conf)

def noop(x):
    import socket
    import sys
    return socket.gethostname() + ' '.join(sys.path) + ' '.join(os.environ)

rdd = sc.parallelize(range(1000), 100)
hosts = rdd.map(noop).distinct().collect()
print(hosts)

 

  1. 提交PySpark任务。

     

    PYSPARK_PYTHON=./ANACONDA/mlpy_env/bin/python spark-submit --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./ANACONDA/mlpy_env/bin/python --conf spark.executorEnv.PYSPARK_PYTHON=./ANACONDA/mlpy_env/bin/python --master yarn-cluster --archives /opt/mlpy_env.zip#ANACONDA /opt/test_spark.py

     

  2. 分析Spark2 History服务中的任务运行情况。

     

    executors运行情况如下图:

    说明:

    其中,agent1为x86服务器,agent2为ARM服务器。agent1上运行失败是由于独立Python包中打包的是ARM版本的Python,导致在x86服务器上运行失败。

    运行失败executor的错误日志为:

     

  3. 分析archives文件“opt/mlpy_env.zip”流转过程。

     

    1. 任务提交后会将独立Python压缩包上传至HDFS中。
      20/07/22 19:00:51 INFO Client: Uploading resource file:/home/mlpy_env.zip#ANACONDA -> hdfs://server1:8020/user/hdfs/.sparkStaging/application_1595415474950_0002/mlpy_env.zip
    2. Container加载时会下载独立Python压缩包并解压。

    说明:

    压缩包的下载路径在yarn.nodemanager.local-dirs配置的目录下。

解决方案

更新时间:2020/09/30 GMT+08:00

说明:

以mlpy_env.zip为例进行说明,在实际应用中酌情修改。

  1. 将x86平台和ARM平台的Python都放入Python独立压缩包mlpy_env.zip中,其中x86目录名称与压缩包名称相同为mlpy_env,ARM目录名称为压缩包名称加上字符串“_aarch64”。

     

    └── mlpy_env.zip
        ├── mlpy_env
        └── mlpy_env_aarch64

     

  2. 在Container中解压mlpy_env.zip后,判断运行平台为ARM时,将mlpy_env目录修改为mlpy_env_bak(或者删除掉),并将mlpy_env_aarch64目录修改为mlpy_env。从而实现在对应服务器运行对应版本的Python。

 

方案实现

更新时间:2020/09/30 GMT+08:00

软件版本

项目

版本

hadoop

apache hadoop-2.7.2

代码实现

实现该功能,需修改hadoop源码中的“FSDownload.java”文件。“FSDownload.java”原始代码可参考:https://github.com/apache/hadoop/blob/rel/release-3.2.0/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/FSDownload.java

  1. 修改“hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/FSDownload.java”文件,新增aarch64PyMix(File dst)方法,该方法实现在ARM平台上将解压文件改名。

     

    private void aarch64PyMix(File dst) {  
      String dstPath = dst.getAbsolutePath();  
      String fileFullName = dst.getName();  
      String fileName = fileFullName.substring(0,fileFullName.length() - 4);  
      String orgDirName = dstPath + File.separator + fileName;  
      String aarch64DirName = dstPath + File.separator + fileName + "_aarch64";
      File orgFile = new File(orgDirName);
      File aarch64File = new File(aarch64DirName);
      if (orgFile.exists() && aarch64File.exists() && "aarch64".equals(System.getProperty("os.arch"))) {
         orgFile.renameTo(new File(orgDirName + "_bak"));
         aarch64File.renameTo(new File(orgDirName));
      }
    }

     

  2. 在“hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/FSDownload.java”文件的unpack方法中ARCHIVE条件下的zip解压后增加对aarch64PyMix方法的调用。

     

    ...
    case ARCHIVE:
    ...  
      } else if (lowerDst.endsWith(".zip")) {
        FileUtil.unZip(localrsrc, dst);
        aarch64PyMix(dst);
      } else if (lowerDst.endsWith(".tar.gz") ||
    ...

混部环境搭建

更新时间:2020/09/30 GMT+08:00

  1. 参照方案实现进行代码修改后,编译Hadoop代码。

     

    移植编译可参考:https://support.huaweicloud.com/prtg-apache-kunpengbds/kunpenghadoop_02_0001.html

     

  2. 利用步骤一中修改编译后的hadoop安装包在x86和ARM服务器上部署,并验证集群运行正常。

     

    hadoop部署指南可参考:https://support.huaweicloud.com/dpmg-apache-kunpengbds/kunpenghadoop_04_0001.html

 

创建Python虚拟环境

更新时间:2020/09/30 GMT+08:00

  1. 下载Anaconda安装脚本。

     

    1. 在x86平台下载脚本。

      wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2.1.0-Linux-x86_64.sh

      sh Anaconda3-2.1.0-Linux-x86_64.sh

    2. 在ARM平台下载脚本。

      wget https://github.com/Archiconda/build-tools/releases/download/0.2.3/Archiconda3-0.2.3-Linux-aarch64.sh

      sh Archiconda3-0.2.3-Linux-aarch64.sh

     

  2. 安装Anaconda。

     

    输入自己要把anaconda安装的目录,或直接回车安装到默认目录/root/archiconda3下(本例中是安装到默认目录/root/archiconda3)。

    创建环境变量。

    刷新环境变量。

    source .bash_profile

     

  3. 创建Python虚拟环境。

     

    1. 在x86上创建。

      conda create -n mlpy_env --copy -y -q python=2

    2. 在ARM上创建。

      conda create -n mlpy_env_aarch64 --copy -y -q python=2

    创建完成后将在anaconda安装目录的envs目录下生成虚拟环境文件夹,比如,如果anaconda安装到默认目录下,则在/root/archiconda3/envs目录下生成相应虚拟环境的文件夹。

     

  4. 制作双平台Python虚拟环境压缩包。

     

    1. 将两个平台Archiconda安装目录下envs目录中的mlpy_env和mlpy_env_aarch64目录拷贝到一个机器的同一个目录下,例如/home目录下。
    2. 将mlpy_env和mlpy_env_aarch64目录打包到压缩包中。

      cd /home

      zip -r mlpy_env.zip mlpy_env mlpy_env_aarch64

      说明:

      打包出的mlpy_env.zip即为支持双平台运行的Python包。

    3. 将mlpy_env.zip上传到集群中任务提交机器的“/opt”目录下。

 

提交PySpark任务

更新时间:2020/12/03 GMT+08:00

说明:

  1. 步骤命令中mlpy_env.zip为举例说明,实际使用时酌情修改。
  2. 任务脚本“/opt/test_spark.py”为举例脚本,可用其它PySpark任务替代。
  1. 将Python虚拟环境压缩包mlpy_env.zip上传到Python集群中(以“/opt”目录说明)。

     

    /opt/mlpy_env.zip

     

  2. 提交PySpark任务到混部集群。

     

    PYSPARK_PYTHON=./ANACONDA/mlpy_env/bin/python spark-submit --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./ANACONDA/mlpy_env/bin/python --conf spark.executorEnv.PYSPARK_PYTHON=./ANACONDA/mlpy_env/bin/python --master yarn-cluster --archives /opt/mlpy_env.zip#ANACONDA /opt/test_spark.py

     

  3. 观察任务运行结果。

     

    Executor分布情况:

    说明:

    其中,agent1为x86服务器,agent2为ARM服务器。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值