如何使用 virtualenv 打包 pyspark 代码(包括 python3 解释器)?

Abd*_*man 5 virtualenv python-3.x hadoop-yarn python-venv pyspark

我正在尝试让我的 pyspark 应用程序在纱线集群上运行。该应用程序使用某些需要 python3 的库。但是yarn集群使用python2并且没有安装python3。有没有办法将我的 pyspark 应用程序与 python3 和所有核心 python3 库打包。

我一直按照这些步骤大致创建虚拟环境

virtualenv -p /usr/bin/python3 venv/
source venv/bin/activate
pip install -r requirements.txt
venv-pack -o environment.tar.gz
/usr/bin/spark-submit --master yarn --executor-cores 1  --num-executors 15  --queue wesp_dev   --deploy-mode cluster  --conf "spark.driver.extraJavaOptions=-DENVIRONMENT=pt"  --conf "spark.executor.extraJavaOptions=-DENVIRONMENT=pt"  --name "EndpointAttackDetectionEngine"   --class com.telus.endpointAttackDetectionEngine.AppMain   --keytab $KEY_TAB  --principal $PRINCIPAL --driver-memory=4G --archives environment.tar.gz#environment --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./environment/bin/python --conf spark.executorEnv.LD_LIBRARY_PATH=./environment/lib/ --conf spark.yarn.appMasterEnv.LD_LIBRARY_PATH=./environment/lib/ test.py 
Run Code Online (Sandbox Code Playgroud)

但是,当我按照上述步骤创建虚拟环境时出现了很多问题

  1. 我注意到 venv/bin/python 中的 python 解释器符号链接到 /usr/bin/python。我必须手动删除符号链接,然后将 python 解释器复制过来。因为集群的 /usr/bin/python 中没有 python3。
  2. libpython3.6m.so.1.0 丢失。Pyspark 应用程序最初因此失败。我手动将其复制到 venv/lib/ 并在Spark-submit 中spark.executorEnv.LD_LIBRARY_PATH=./environment/lib/指定它spark.yarn.appMasterEnv.LD_LIBRARY_PATH=./environment/lib/
  3. Fatal Python error: Py_Initialize: Unable to get the locale encoding ModuleNotFoundError: No module named 'encodings'现在,当我在纱线集群中运行 pysark 应用程序时,我陷入困境。我从 /usr/lib64/python3.6 手动复制了 python3 的编码和其他核心模块,但没有解决问题。

所有这些让我相信,当我用 venv 打包我的环境时,我缺少了一些东西。必须有更好的方法来做到这一点。

小智 3

我最近也遇到了同样的情况。

当您想在未安装 Python3 的集群中使用 Python3 中的 pyspark 时,您确实可以遵循使用 virtualenv 的策略。

但是,您必须仔细选择构建 virtualenv 的工具。正如您所注意到的,通常的 virtualenv 命令并没有完全打包所需的 Python3 文件。

通过基于 conda Python3 的 virtualenv,我成功地在 Python2.7 纱线集群内以纱线集群和客户端模式使用 pyspark。

这是我的分步指南:

  1. 创建 docker centos 7 容器
docker pull centos:centos7
docker run --entrypoint "/bin/sh" -it <image_id_centos:centos7>
Run Code Online (Sandbox Code Playgroud)
  1. 在centos7创建的容器内创建virtualenv
yum install bzip2
curl -O https://repo.anaconda.com/archive/Anaconda3-5.3.1-Linux-x86_64.sh
bash Anaconda3-5.3.1-Linux-x86_64.sh
source ~/.bashrc
conda update conda
conda create -n myvenv python=3.6 anaconda
conda activate myvenv
conda install -n myvenv pip
pip install -r requirements.txt
cd /root/anaconda3/envs/myvenv
tar zcvf myvenv.tar.gz *
Run Code Online (Sandbox Code Playgroud)
  1. 从 docker 容器中提取 myvenv virtualenv
docker cp <container-id>:/root/anaconda3/envs/myvenv/myvenv.tar.gz ~/Downloads
Run Code Online (Sandbox Code Playgroud)
  1. 在集群中使用新的 virtualenv。

不要忘记将其标记为#ENV 并在spark.pyspark.python 和spark.pyspark.driver.python conf 选项中使用该标记。

${SPARK_HOME}/bin/spark-submit \
--master ${CLUSTER_MANAGER} \
--deploy-mode ${DEPLOY_MODE} \
--num-executors ${NUM_EXECUTORS} \
--driver-memory ${DRIVER_MEMORY} \
--executor-memory ${EXECUTOR_MEMORY} \
--executor-cores ${EXECUTOR_CORES} \
--archives ./myvenv.tar.gz#ENV \
--conf spark.pyspark.python=./ENV/bin/python \
--conf spark.pyspark.driver.python=./ENV/bin/python \
--py-files my_project.zip \
main.py "$@"
Run Code Online (Sandbox Code Playgroud)