簡介
??在使用pyspark運行python代碼的程序中,通常遇到集群環境中沒有相應的python三方庫,即:ImportError: No module named ** ,對于該種情況,通常有兩種解決方案:
?1. 集群中的python環境安裝相應的三方庫! 走流程、找運維,賊麻煩
?2. 集群未配置python環境,加載虛擬python環境!(重點講解該方式,用起來賊方便)
未加載庫的通常處理方式
??使用pyspark程序中,遇到沒有相應python庫,可以通常有三種處理方法:
?1.單一py檔案
??spark-submit命令中添加 --py-files a.py 即可:
spark-submit \
--master yarn \
--deploy-mode cluster \
--num-executors 40 \
--queue default \
--verbose \
--py-files a.py \
b.py
?2.自建模塊或python簡單三方庫(不含.so檔案, 如 jieba)
??直接將python相應的模塊如(jieba包)打包為zip,然后spark-submit命令中動態加載該模塊即可;(本人直接將windows下python環境中site-packages 中的jieba 打包為zip, 然后使用如下提交命令就可以直接使用,注意模塊的依賴包)
??注意點:
????1.模塊存在依賴包
????2.zip 包檔案較大可以先將zip包上傳到HDFS中
????3.當有多個模塊需要參考時,可以使用逗號分隔
spark-submit \
--master yarn \
--deploy-mode cluster \
--num-executors 40 \
--queue default \
--verbose \
--py-files hdfs://xxx/jieba.zip \
b.py
?3.python復雜三方庫(含.so 檔案,即動態加載庫,如numpy、pandas)(本文重點講解該方法)
加載虛擬環境
?1.在任意臺機器上安裝Anaconda 軟體
?2.通過Anaconda 創建虛擬Python環境
(嘗試過使用virtualenvwrapper 創建虛擬環境,但是在應用時失敗了,因此建議直接使用Anaconda)
?3.在創建好的Python環境中安裝依賴的Python包
?4.將整個虛擬Python環境打包為zip,或tar.gz包
進入到虛擬環境下,如/home/hadoop/anaconda3/envs,使用以下命令將虛擬環境進行打包
zip -r conda_env.zip conda_env # 虛擬環境為conda_env, 打包為conda_env.zip 檔案
?5.提交Pyspark Application,通過 --archives 選項指定 zip 包路徑(可以將虛擬環境zip上傳到HDFS或某個節點下 ),然后是在cluster、client模式下提交application,示例如下
spark-submit 提交application時主要是添加如下三行conf,對于cluster與client存在差異
--conf spark.yarn.dist.archives=/wang/code/conda_env \
--conf spark.pyspark.driver.python=/wang/code/conda_env/bin/python \
--conf spark.pyspark.python=/wang/code/conda_env/bin/python \
######################## cluster模式
spark-submit \
--master yarn \
--deploy-mode cluster \
--num-executors 50 \
--queue default \
--verbose \
--conf spark.yarn.dist.archives=hdfs:wang/conda_env.zip#python36 \
--conf spark.pyspark.driver.python=./python36/conda_env/bin/python \
--conf spark.pyspark.python=./python36/conda_env/bin/python \
test.py
注意:
1、hdfs:/// 是三條斜杠,之前參考其他資料寫的兩條斜杠一直報錯
2、archives 命令后的 # 是必須的(通常會以為是注釋),它指的是將 zip包 臨時解壓到的檔案夾,后續兩條--conf命令直接參考該檔案夾即可
3、在提交 Pyspark Application 時會將該環境 zip 包上傳到運行Application 的所在的每個節點上,并解壓縮為Python 代碼提供運行環境,如果不想每次都從客戶端將該環境檔案上傳到集群中運行 pyspark application 的節點上,可以采用zip 包上傳到HDFS的方式即可
######################## client模式
spark-submit \
--master yarn \
--deploy-mode client \
--driver-memory 2g \
--num-executors 50 \
--queue default \
--verbose \
--conf spark.yarn.dist.archives=hdfs:wang/conda_env.zip#python36 \
--conf spark.pyspark.driver.python=/mnt/wang/conda_env/bin/python \
--conf spark.pyspark.python=./python36/conda_env/bin/python \
test.py
注意:
1、與cluster主要不同在 --conf spark.pyspark.driver.python
對應的路徑為提交application 的節點上解壓conda_env.zip 后對應的/bin/python路徑,即conda_env.zip 解壓后的路徑為/mnt/wang/conda_env/ ,然后再加上對應的路徑下的 /bin/python,其目的就是集群 driver節點使用的python環境
參考
https://blog.csdn.net/weixin_41002327/article/details/112252163
https://blog.csdn.net/yawei_liu1688/article/details/112304595.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/327918.html
標籤:其他
