在集群上提交pyspark脚本,如果是多个py脚本之间有相互依赖关系,需要将所有脚本打包为.egg文件,然后用一个.py主脚本来调用这些文件。提交的时候同时提交.egg文件和.py文件。
将多个文件.py文件打包为一个.egg文件的代码如下,需要注意:
- 在文件夹下面必须有一个__init__.py文件,文件内部不需要有任何内容
- py文件引用的时候要使用相对路径,避免更换了包的路径后导致程序出错。./代表当前路径,../代表上一层目录
- 只有指定目录中的.py文件会被打包为.egg文件,其余格式的文件不会被处理
- .比如将haha文件夹打包进hehe.egg里再放入my_path路径下,直接设定mypath为当前工作路径,import haha即可,不需要写成from hehe import haha
import os
os.chdir('my_path')
from setuptools import setup, find_packages
setup(
name = "xxx",
version = "0.1",
packages = find_packages(),
description = "xxx",
long_description = "xxx",
author = "liuzimu",
author_email = "xxx",
license = "xxx",
keywords = ("xx", "xxx"),
platforms = "xxx",
url = "xxx",
)
在spark集群上提交.egg和.py文件的脚本如下,因为要使用hive,所以要加上“files ${SPARK_HOME}/conf/hive-site.xml”
因为不想永久地改变系统环境变量,所以要用到export语句临时更改系统环境变量。
export SPARK_MAJOR_VERSION=2
export PYSPARK_DRIVER_PYTHON=ipython
export PYSPARK_PYTHON=ipython
export PYSPARK_DRIVER_PYTHON_OPTS
SPARK_HOME=/usr/hdp/current/spark2-client
${SPARK_HOME}/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--driver-memory 8g \
--num-executors 4 \
--executor-memory 8g \
--executor-cores 4 \
--files ${SPARK_HOME}/conf/hive-site.xml \
--py-files /path/file.egg /path/file.py