1. 程式人生 > >Spark叢集,多個版本Python/Python Package管理

Spark叢集,多個版本Python/Python Package管理

進年來,越來越多的資料科學家、分析人員、資料工程師運用Python語言進行資料分析和機器學習。Spark在0.7版本開始支援Python語言(PySpark)。
相比於Scala/Java, Python語言更適合互動的探索性分析,擁有內建的圖形化工具以及豐富的機器學習庫。Scala/Java的優勢在於平臺獨立,程式碼和第三方庫易於打包到Jar檔案,更好的執行效率。當我們使用PySpark時則會失去以上優勢,尤其是在叢集環境管理不同的Python版本和第三方庫。

具體問題:

  1. 不同的資料分析人員/開發團隊需要不同版本的Python版本執行PySpark。
  2. 同一Python版本下,需要安裝多個Python庫,甚至需要不同版本的庫。

針對問題2的一個解決辦法是將Python依賴庫打包成*.egg檔案,在執行pyspark或者spark-submit時使用–py-files載入egg檔案。此解決方案的問題在於許多Python庫都包含native code,編譯時對平臺依賴,並且對於一些複雜依賴的庫(如Pandas),編譯失敗。
如果不使用*.egg檔案,則需要安裝不同Python版本極其所需庫在叢集中的每一臺機器,然後在執行Spark時指定所需Python的路徑。

解決方案

使用Anaconda管理多個Python環境在叢集中的每一個節點
1. Anaconda 安裝 https://www.continuum.io

wget http://repo.continuum.io/archive/Anaconda3-4.1.1-Linux-x86_64.sh
bash Anaconda3-4.1.1-Linux-x86_64.sh -b -p /opt/anaconda

(此安裝包預設為python3.5, 注意anaconda在每個節點的安裝路徑需要一致)
2. 建立多個Anaconda Python環境
建立,每行命令最後的引數anaconda是指定安裝所有anaconda python package

/opt/anaconda/bin/conda create -n py34 python=3.4 anaconda
/opt/anaconda/bin/conda create
-n py27a python=2.7 anaconda

複製anaconda環境, 並在此環境中安裝python thrift package

/opt/anaconda/bin/conda create -n py27b --clone py27a

使用指定的Python環境執行Spark
Client Mode: PYSPARK_PYTHON = /opt/anaconda/bin/conda/py27b/python
Cluster Mode: spark.yarn.appMasterEnv.PYSPARK_PYTHON = /opt/anaconda/bin/conda/py27b/python

設定Spark預設Python環境
修改spark-env.sh

if [ -z "${PYSPARK_PYTHON}" ]; then
export PYSPARK_PYTHON=/opt/anaconda3/bin/python
fi