一、背景说明
单机执行pyspark(python on spark)非常简单,只要在脚本所在服务器上部署个python环境或Anaconda这种集成运行环境,再通过python3命令执行就完了。
而想将python提交到spark集群中运行,则有两种方法,一种是在每个spark结点上部署python环境,在spark低版本与python集成没那么完善的时候,集群结点数又不多的情况下,的确可以这么干(实际上我就这么干过),这种方式比较大的优势是每次执行pyspark任务时,不用分发python环境,会比接下来说的第二种方法快那么一丢丢。而缺点就显而易见的,就是太难维护了:python环境增加依赖时,需求每个结点都安装依赖;集群添加新spark结点时,又要另外部署python环境。这不是扯蛋吗?
在经历了第一种方式的折磨后,终于用上了第二种方法,就是先将python环境打包放到HDFS中,然后稍微修改一下执行脚本,即可方便地以集群的方式执行pyspark脚本了。
以下以使用Anaconda为例构建python虚拟环境,其他虚拟环境大同小异。
二、构建python虚拟环境
1、到anaconda官网下载anaconda;(我下载的是Anaconda3-2019.10-Linux-x86_64.sh);
2. 在该目录下,执行Anaconda3-2019.10-Linux-x86_64.sh ,安装Anaconda;
3. 重启黑窗(ssh连接);
4. 使用命令创建一个python3.7版本,名叫my_test_env的python虚拟环境:
conda create --name my_test_env python=3.7
5. 激活(进入)新环境:
conda activate my_test_env
6. 在新环境下(my_test_env)安装需要的包,requirements.txt是描述所需依赖的文件:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
requirements.txt内容示例:
至此,虚拟环境安装完,并且已经安装好requirements.txt里指定的依赖。
三、将虚拟环境放到hdfs中
安装好的虚拟环境,是存放在anaconda安装目录下的“/anaconda3/envs”下,在该目录下,我们可以看到刚刚安装的 my_test_env 目录,执行以下命令将该目录打包成zip包:
zip -r my_test_env.zip my_test_env
(如提示找不到zip命令,执行 yum install -r zip 安装zip工具)
执行以下命令将刚刚打包的zip包放到hdfs:
# 创建存放环境的目录
hadoop fs -mkdirs /apps/python/env
# 将zip包put到该目录
hadoop fs -put my_test_env.zip /apps/python/env/
四、修改执行脚本
在执行脚本中,只要增加--archives和几个指定python环境的参数,就可以了,完整的模版如下:
# 脚本名字,不需要后缀名(.py)
python_file=my_python_script
# 指定yarn的执行队列
queue=default
# 指定需要的executor数,默认1C/4G为一个executor
core=15
# 如果要在crontab中自动调度,若想使用相对路径,需要先cd进脚本所在目录
cd /data/python_script/
# 执行模版(其中,9-13就是新增的配置,用于指定hdfs上的python虚拟环境)
nohup \
spark-submit \
--master yarn \
--deploy-mode cluster \
--num-executors $core \
--driver-memory 8G \
--executor-memory 4G \
--executor-cores 1 \
--archives hdfs://myhadoop/apps/python/env/my_test_env.zip#PyEnv \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=PyEnv/my_test_env/bin/python3.7 \
--conf spark.yarn.appMasterEnv.PYSPARK_DRIVER_PYTHON=PyEnv/my_test_env/bin/python3.7 \
--conf spark.executorEnv.PYSPARK_PYTHON=PyEnv/my_test_env/bin/python3.7 \
--conf spark.executorEnv.PYSPARK_DRIVER_PYTHON=PyEnv/my_test_env/bin/python3.7 \
--queue $queue \
$python_file\.py \
1> nohup.out.$python_file 2>&1 &
# 脚本执行日志,会输出到当前目录下的 nohup.out.脚本名 文件中。
另外,如果想查看yarn上详细的任务日志,可通过以下命令导出日志:
# yarn logs -applicationId 任务的appid > logs.txt ,示例:
yarn logs -applicationId application_1652618816000_3721 > logs.txt