一、将虚拟Python环境打包
创建好环境后,进入到环境所在的文件夹,例如环境是/home/hadoop/anaconda3/envs, cd到envs下,使用打包命令将当前目录下的文件打成zip包:
cd /home/hadoop/anaconda3/envszip -r py37.zip py37
YARN集群配置Python环境
在开始安装YARN及Spark集群的时候,可以将对应Python软件包、依赖模块,在YARN集群中的每个节点上进行安装。这样,YARN集群的每个NodeManager上都具有Python环境,可以编写PySpark Application并在集群上运行。
优点
对于PySpark的使用,如果偏向机器学习,可以考虑在整个集群中都安装好Python环境,并根据不同的需要进行依赖模块的统一管理,能够极大地方便PySpark Application的运行。
缺点
如果后续使用Python编写Spark Application,需要增加新的依赖模块,那么就需要将该模块在YARN集群的每个节点上都进行安装。而且如果环境中有多个Python版本,还需要涉及不同版本Python环境的管理。因为提交PySpark Application运行是由YARN资源管理器决定的,所以必须保证每个NodeManager上都具有Python环境(基础环境+依赖模块)。
YARN集群未配置Python环境
如果已经安装了规模较大的YARN集群,且在开始开始的时候未曾考虑后续会使用基于Python来编写Spark Application,未曾在YARN集群的NodeManager上安装Python基础环境及其依赖模块。现在要想使用Python编写Spark Application。
实现思路如下所示:
在任意一台机器节点上,安装Anaconda软件
通过Anaconda创建虚拟Python环境
在创建好的Python环境中下载安装依赖的Python模块
将整个Python环境打成zip包
提交PySpark Application时,并通过–archives选项指定zip包路径
案例:
将linux上的集群环境进行打包
#进入anaconda3环境目录下/root/anaconda3/envs#进行打包zip -r dev.zip py37
注意:这里主要应用打包文件里的py27/bin/python
Python文件:word_seg.py
# -*- coding: utf-8 -*-from pyspark.sql import SparkSessionimport jiebafrom pyspark.sql.functions import *from pyspark.sql.types import *from pyspark.ml.classification import NaiveBayesfrom pyspark.ml.feature import HashingTF,StringIndexer,Tokenizer,IDFfrom pyspark.ml.evaluation import MulticlassClassificationEvaluator# 解决编码问题import sysreload(sys)sys.setdefaultencoding('utf8')# 创建sparkSession#提交到yarn上进行显示的名称appName("word_seg Test")spark = SparkSession.builder.appName("word_seg Test").enableHiveSupport().getOrCreate()# 读取hive的数据df = spark.sql("select content,label from badou.new_no_seg limit 300")df.show()# 定义结巴切词方法def seg(text):return ' '.join(jieba.cut(text,cut_all=True))#返回切词后的UDFseg_udf = udf(seg, StringType())# 对数据进行结巴切词df_seg = df.withColumn('seg',seg_udf(df.content)).select('seg','label')df_seg.show()
运行脚本:
PARK_PYTHON=./ANACONDA/py27/bin/pythoncd /usr/local/src/spark-2.4.4-bin-hadoop2.6/./bin/spark-submit \--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./ANACONDA/py27/bin/python \--master yarn-cluster \--jars /usr/local/src/apache-hive-1.2.2-bin/lib/mysql-connector-java-5.1.46.jar,/usr/local/src/spark-2.4.4-bin-hadoop2.6/jars/datanucleus-api-jdo-3.2.6.jar,/usr/local/src/spark-2.4.4-bin-hadoop2.6/jars/datanucleus-core-3.2.10.jar,/usr/local/src/spark-2.4.4-bin-hadoop2.6/jars/datanucleus-rdbms-3.2.9.jar,/usr/local/src/spark-2.4.4-bin-hadoop2.6/jars/guava-14.0.1.jar \--files /usr/local/src/spark-2.4.4-bin-hadoop2.6/conf/hive-site.xml \--archives /usr/local/src/badou_code/spark/dev.zip#ANACONDA \/usr/local/src/badou_code/spark/word_seg.py
./ANACONDA/py27/bin/python 代表的集群上的文件解压后的路径
注意:archives命令后的#是必须的,它指的是将这个zip包解压到的文件夹。
PySpark在Spark集群上运行详解
参考自:spark的python环境及No module问题(超详细)作者:bigdata老司机.
使用spark-submit命令引用
client模式
假设上一步得到python37.zip文件,该文件包含numpy、pandas、scipy这三个依赖包。该zip文件大概有500MB以上。将该zip压缩包拷贝到指定目录中,方便后续提交PySpark Application。
1、在linux本地解压
--conf spark.yarn.dist.archives=/home/hadoop/python37 \--conf spark.pyspark.driver.python=/home/hadoop/python37/bin/python \--conf spark.pyspark.python=/home/hadoop/python37/bin/python \
2、将python37.zip文件上传到hdfs
--conf spark.yarn.dist.archives=hdfs://input/test/python37.zip#python37 \--conf spark.pyspark.driver.python=./python37/bin/python3 \--conf spark.pyspark.python=./python37/bin/python3 \
注意:archives命令后的#是必须的,它指的是将这个zip包解压到的文件夹。
在提交PySpark Application时会将该环境zip包上传到运行Application的所在的每个节点上,并解压缩后为Python代码提供运行环境。如果不想每次都从客户端将该环境文件上传到集群中运行PySpark Application的节点上,可以采用将zip包上传到HDFS上的方式,并修改–archives参数的值为hdfs://***/***/python37.zip#python37。
另外,如果我们要运行的.py文件中,也依赖一些自己编写的函数,具有多个Python依赖的文件。想要通过上面的方式运行,则必须将这些依赖的Python文件拷贝到我们创建的环境中,对应的目录为python37/lib/python3.7/site-packages/
cluster模式
cluster模式下,driver端可以略去。
--conf spark.yarn.dist.archives=hdfs://input/test/python37.zip#python37 \--conf spark.pyspark.python=./python37/bin/python3 \
举例:
yarn client hdfs文件
spark-submit \--master yarn \--deploy-mode cluster \--driver-memory 4g \--executor-memory 2g \--executor-cores 3 \--queue prod \--conf spark.yarn.dist.archives=hdfs://input/test/python37.zip#python37 \--conf spark.pyspark.driver.python=./python37/bin/python3 \--conf spark.pyspark.python=./python37/bin/python3 \--jars /home/hadoop/mysql-connector-java-8.0.21.jar,/home/hadoop/elasticsearch-spark-20_2.11-7.9.2.jar,/home/hadoop/ojdbc6.jar \/home/hadoop/test.py
如果觉得《anaconda3环境整体打包放在Spark集群上运行》对你有帮助,请点赞、收藏,并留下你的观点哦!