spark python3_spark-python版本依赖与三方模块方案

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. 参考

spark-python版本依赖与三方模块方案 首发于知乎专栏 从推公式到写代码

欢迎大家关注点赞。spark-python版本依赖与三方模块方案

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值