问题分析
更新时间:2020/10/19 GMT+08:00
说明:
- 以PySpark任务提交的独立Python包中为ARM版本Python为例说明。
- 集群为x86与ARM的混合部署Spark集群。
- 任务脚本“/opt/test_spark.py”为举例脚本,可用其它PySpark任务替代。
- 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)
- 提交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
- 分析Spark2 History服务中的任务运行情况。
executors运行情况如下图:
说明:其中,agent1为x86服务器,agent2为ARM服务器。agent1上运行失败是由于独立Python包中打包的是ARM版本的Python,导致在x86服务器上运行失败。
运行失败executor的错误日志为:
- 分析archives文件“opt/mlpy_env.zip”流转过程。
- 任务提交后会将独立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
- Container加载时会下载独立Python压缩包并解压。
压缩包的下载路径在yarn.nodemanager.local-dirs配置的目录下。
- 任务提交后会将独立Python压缩包上传至HDFS中。
解决方案
更新时间:2020/09/30 GMT+08:00
说明:
以mlpy_env.zip为例进行说明,在实际应用中酌情修改。
- 将x86平台和ARM平台的Python都放入Python独立压缩包mlpy_env.zip中,其中x86目录名称与压缩包名称相同为mlpy_env,ARM目录名称为压缩包名称加上字符串“_aarch64”。
└── mlpy_env.zip ├── mlpy_env └── mlpy_env_aarch64
- 在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
- 修改“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)); } }
- 在“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
- 参照方案实现进行代码修改后,编译Hadoop代码。
移植编译可参考:https://support.huaweicloud.com/prtg-apache-kunpengbds/kunpenghadoop_02_0001.html。
- 利用步骤一中修改编译后的hadoop安装包在x86和ARM服务器上部署,并验证集群运行正常。
hadoop部署指南可参考:https://support.huaweicloud.com/dpmg-apache-kunpengbds/kunpenghadoop_04_0001.html。
创建Python虚拟环境
更新时间:2020/09/30 GMT+08:00
- 下载Anaconda安装脚本。
- 在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
- 在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
- 在x86平台下载脚本。
- 安装Anaconda。
输入自己要把anaconda安装的目录,或直接回车安装到默认目录/root/archiconda3下(本例中是安装到默认目录/root/archiconda3)。
创建环境变量。
刷新环境变量。
source .bash_profile
- 创建Python虚拟环境。
- 在x86上创建。
- 在ARM上创建。
创建完成后将在anaconda安装目录的envs目录下生成虚拟环境文件夹,比如,如果anaconda安装到默认目录下,则在/root/archiconda3/envs目录下生成相应虚拟环境的文件夹。
- 制作双平台Python虚拟环境压缩包。
提交PySpark任务
更新时间:2020/12/03 GMT+08:00
说明:
- 步骤命令中mlpy_env.zip为举例说明,实际使用时酌情修改。
- 任务脚本“/opt/test_spark.py”为举例脚本,可用其它PySpark任务替代。
- 将Python虚拟环境压缩包mlpy_env.zip上传到Python集群中(以“/opt”目录说明)。
/opt/mlpy_env.zip
- 提交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
- 观察任务运行结果。
Executor分布情况:
说明:其中,agent1为x86服务器,agent2为ARM服务器。