1.背景
目前大數據使用的是Amazon EMR集群,該集群可根據計算需求變化靈活擴展或收縮集群,就會存在一個問題:當spark任務提交之后,EMR集群會根據計算的需求進行擴展,新擴展的機器上python環境各不相同,並且每次擴展的機器ip不相同(不是同一台機器),對某些第三方包,例如:pandas 還會依賴numpy,並且對版本還有一定要求,必須大於15.4;此時python依賴的沖突就會導致spark任務執行失敗。
2.解決方案
鑒於以上問題,通過搭建獨立的Python運行環境可以解決以上問題,同時還可以使得單個項目的運行環境與其他項目互不影響。
3.搭建方法
3.1.安裝virtualenv
3.1.1.檢查服務器是否安裝virtualenv
virtualenv --version
3.1.2.沒有的話需要安裝
pip install virtualenv
3.2.創建python虛擬環境
cd /home/hadoop/code
mkdir py_spark_env #創建目錄py_spark_env
virtualenv -p /usr/bin/python3.6 pyspark_venv #選擇使用python3.6解釋器創建虛擬環境目錄
source pyspark_venv/bin/activate #激活虛擬環境變量
deactivate #退出當前虛擬環境
刪除虛擬環境,只需要刪除它的文件夾:rm -rf pyspark_venv
3.3.安裝python依賴
3.3.1安裝python依賴庫
安裝之前需要選擇虛擬環境,否則就會安裝在系統的環境下
source pyspark_venv/bin/activate #選擇虛擬環境
pip install pandas #安裝pandas
pip install pyspark #安裝pyspark
以上的依賴庫會安裝在:
/home/hadoop/code/py_spark_env/pyspark_venv/lib64/python3.6/dist-packages下
需要將其拷貝至
/home/hadoop/code/py_spark_env/pyspark_venv/lib64/python3.6/site-packages下
3.3.2.驗證python虛擬環境
選擇虛擬環境:source pyspark_venv/bin/activate
在服務器終端執行python: python #可以看到當前的python環境是3.6.8
以下截圖是在本地測試pandas和numpy依賴可用性:
3.4.spark基於python虛擬環境提交任務
3.4.1.打包python虛擬環境
cd /home/hadoop/code/py_spark_env
zip -r py_spark_venv.zip py_spark_venv
3.4.2.上傳至s3或者hdfs
hadoop fs -put py_spark_venv.zip s3://tmp/bigdata/config
hadoop fs -put py_spark_venv.zip /tmp/pyspark
如果還需要增加其它第三方依賴,則需要通過執行步驟3.3安裝依賴,再打包成zip,上傳至s3或者hdfs上。
3.4.3.spark依賴虛擬環境
請參考以下示例:
spark-submit \
--deploy-mode cluster \
--master yarn \
--driver-memory 2g \
--num-executors 6 \
--executor-memory 4g \
--executor-cores 2 \
--queue default \
--name test \
--archives s3://tmp/bigdata/config/pyspark_venv.zip#pyspark_venv \
--conf spark.pyspark.driver.python=./pyspark_venv/pyspark_venv/bin/python3 \
--conf spark.pyspark.python=./pyspark_venv/pyspark_venv/bin/python3 \
/home/hadoop/tmp/nibo/test.py
注:
--archives s3://tmp/bigdata/config/pyspark_venv.zip#pyspark_venv ----會將pyspark_venv.zip解壓,解壓的目錄是"pyspark_venv", #后面的pyspark_venv不能省略,會被解壓到每個Executor的工作目錄中,僅限於Spark on Yarn模式
--conf spark.pyspark.driver.python=./pyspark_venv/pyspark_venv/bin/python3 ----指定python執行器
--conf spark.pyspark.python=./pyspark_venv/pyspark_venv/bin/python3 ----指定python執行器