spark-python版本依赖与三方模块方案
本文讲解spark client模式和cluster模式的第三方库依赖解决方法,注意,在用的时候需要看清楚自己的集群是哪种方法部署spark。
更新:2019-12-18
1、cluster模式
如果spark集群是以cluster模式搭建,方法就比较简单。
下面是一些步骤,每个公司的集群配置不同,具体的参数配置位置需要根据实际情况而定。
(1)使用conda创建python虚拟环境、安装第三方库
假设虚拟环境是pyspark_py36,安装位置是:
/softwares/anaconda3/envs/pyspark_py36
此处省略1w个字。
安装的第三方库是:
source activate pyspark_py36
pip install pandas
pip install sklearn
pip install lightgbm
其他省略1w字。
(2)打包整个虚拟环境
进入虚拟环境目录,压缩整个文件夹
cd /softwares/anaconda3/envs/
zip -r -9 -q pyspark_py36.zip pyspark_py36/
压缩后得到压缩包pyspark_py36.zip。
(3)将压缩是虚拟环境上传到hdfs
# 查看hdfs目录下的文件
hdfs dfs -ls /user/bdms_Zhenyu.Su/
# 上传
hdfs dfs –put pyspark_py36.zip /user/bdms_Zhenyu.Su/
# 再次查看
hdfs dfs -ls /user/bdms_Zhenyu.Su
这里上传的hdfs目录如下,后面指定参数的时候需要指定这个目录。
/user/bdms_Zhenyu.Su/
(4)新建pyspark程序
没什么好说的,就是普通的pyspark程序,简单的例子如下所示:
# -*- coding: utf-8 -*-
from pyspark.sql import SparkSession
# 测试刚才安装的第三方库是否正常导入
import pandas as pd
import lightgbm as lgb
# 初始化会话
spark = SparkSession \
.builder \
.enableHiveSupport() \
.getOrCreate()
# 测试从hive读取数据
df = spark.sql("select * from test.test_table limit 10")
# 测试从pandas dataframe创建
colors = ['white', 'green', 'yellow', 'red', 'brown', 'pink']
color_df = pd.DataFrame(colors, columns=['color'])
color_df['length'] = color_df['color'].apply(len)
color_df = spark.createDataFrame(color_df)
color_df.show()
spark.stop()
(5)在集群管理页面创建spark程序
创建spark程序后,设置如下属性,指定python的地址和版本,也就是前面上传到hdfs的压缩包。
# 参数配置
conf.spark.yarn.dist.archives = hdfs:///user/bdms_Zhenyu.Su/pyspark_py36.zip#py3env
conf.spark.yarn.appMasterEnv.PYSPARK_PYTHON = py3env/pyspark_py36/bin/python
第一个参数,压缩的文件会被提取到executor到工作目录下面去,后面到#py3env表示,这个文件被解压成到文件名称。
第二个参数,指定python的环境是哪个。
运行正常。
2、client模式
client模式的缺点是,要求每个节点都要安装相同的python环境,一个偷懒的方法是,在一个节点安装,然后用ssh的方法将python同步到所有节点。
首先在每个节点安装相同的python版本
注意,需要在spark集群的每个节点安装相同的python版本,如果依赖第三方包,要求每个节点也安装有相同的第三方包。 确实很麻烦,比较偷懒的办法是用用ftp同步的方式,在一个节点安装后自动同步更新到其余节点
spark任务的提交参数
注意,启动spark的时候,依然要先切换到python2.7的版本,然后再提交。 为了能让python引用我们的项目代码,需要将项目代码目录添加到pythonpath环境变量中。
code_path=/usr/local/suzhenyu/da_groups # 项目代码目录
cd ${code_path}
export PATH=/usr/bin:$PATH # 切换到系统的python2.7
export PYTHONPATH=${code_path}:$PYTHONPATH # 将项目代码添加到site-package索引
python -V # 查看此时Python的版本
pwd
# 提交方式1:使用统一的python环境执行任务
/usr/hdp/2.6.4.0-91/spark2/bin/spark-submit --master yarn --queue ai \
--name {job_name} \
--conf "spark.pyspark.driver.python=/usr/bin/python3" \ # 这是重点,指定python的版本
--conf "spark.pyspark.python=/usr/bin/python3" \ # 这是重点,指定python的版本
python_file.py
# 提交方式2:使用虚拟环境提交任务,核心是修改 driver.python 的配置项
/usr/hdp/2.6.4.0-91/spark2/bin/spark-submit --master yarn --queue ai \
--name {job_name} \
--conf "spark.pyspark.driver.python=/usr/local/miniconda/envs/my_project/bin/python3" \ # 这是重点,指定虚拟环境中的python的版本
--conf "spark.pyspark.python=/usr/local/miniconda/envs/my_project/bin/python3" \ # 这是重点,指定虚拟环境中的python的版本
python_file.py
python_file.py
的内容如下,我们测试是否真的引用了虚拟环境的python。
import pymysql
import pandas as pd
print('\n'*3)
print('*'*100)
print(pymysql.__path__) # 这里打印虚拟环境中的包
print(pd.__path__) # 这里打印虚拟环境中的包
print('*'*100)
print('\n'*3)
from pyspark.sql import SparkSession
def main():
spark = SparkSession.builder.enableHiveSupport().getOrCreate()
print('\n'*3)
print('*'*100)
print(pymysql.__path__) # 这里打印虚拟环境中的包
print(pd.__path__) # 这里打印虚拟环境中的包
print('*'*100)
print('\n'*3)
spark.stop()
if __name__ == '__main__':
main()
输出如下,我们发现真的可以使用虚拟环境执行任务了,比相对通用环境有了更多的定制和便利。
****************************************************************************************************
['/home/dm/.conda/envs/fusionpredict/lib/python3.6/site-packages/pymysql']
['/home/dm/.conda/envs/fusionpredict/lib/python3.6/site-packages/pandas']
****************************************************************************************************
可以看到,要求在每个节点在相同的位置安装相同的python还是挺麻烦的,当集群变大了之后就需要自动运维平台来管理了。
当然,下面提高将python环境打包上传到hdfs的方式,如果能成功更方便,可惜一直没成功。
5. 参考
- pyspark使用anaconda后spark-submit方法
- How do I set the driver's python version in spark
- 基于YARN集群构建运行PySpark Application
- Python Environments for PySpark, Part 1: Using Condas
- Conda env && Spark Jobs
- Making Python on Apache Hadoop Easier with Anaconda and CDH
- Zeppelin %python.conda and %python.sql interpreters do not work without adding Anaconda libraries to %PATH
spark-python版本依赖与三方模块方案 首发于知乎专栏 从推公式到写代码
欢迎大家关注点赞。spark-python版本依赖与三方模块方案