背景
使用Hadoop streaming + python開發,集羣節點的python是python2.6,語法與python2.7略有不同。而我本地和開發機的python版本都是python2.7,考慮到Hadoop streaming支持分發壓縮文件到節點,因此打算自己製作一個python2.7的壓縮包,上傳到HDFS,之後寫Hadoop streaming程序都可以使用這個python2.7作爲Python解釋器
步驟
源碼編譯安裝python2.7到指定目錄
假設以下步驟的工作目錄位於$PWD
下載python2.7安裝包(速度比較慢)
wget https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tgz
解壓
tar -xzf Python-2.7.14.tgz
安裝三部曲,第三步指定安裝到當前工作目錄下的python2.7
目錄,否則默認安裝到/usr/local
目錄下,其bin
, lib
, include
, share
會和其他程序混在一起,不利於最小化打包,/
目錄空間下也需要sudo權限才能執行各種操作,比較不方便
./configure
make
make DESTDIR=$PWD/python2.7 install
安裝完成後,會自動在$PWD/python2.7
目錄下生成usr/local
目錄,$PWD/python2.7/usr/local
目錄下就是乾淨的bin
, lib
, include
, share
,只包含python2.7的內容。重命名local
爲python2.7
並打包(也可以不重命名,這是非必須的,隻影響之後分發到節點的路徑名稱)
cd $PWD/python2.7/usr
mv local python2.7
tar zcvf python2.7.tar.gz python2.7
打包完成後,在$PWD/python2.7/usr
目錄下生成了壓縮包python2.7.tar.gz
,這個壓縮包就是需要上傳到HDFS的壓縮包,其他下載、安裝產生的文件都沒有用了,可以刪除,只需要保留python2.7.tar.gz
壓縮包就可以
上傳壓縮包到HDFS
假設python2.7壓縮包python2.7.tar.gz
在HDFS的路徑爲$HDFS_DIR
,用以下命令上傳
hadoop fs -put python2.7.tar.gz $HDFS_DIR/python2.7.tar.gz
在Hadoop streaming驅動程序中使用python2.7
以shell驅動程序爲例,在hadoop streaming
命令中使用-cacheArchive $HDFS_DIR/python2.7.tar.gz#python
分發python2.7到計算節點(並將計算節點解壓縮的目錄重命名爲python),在-mapper
, -reducer
參數中用./python/python2.7/bin/python2.7
替代原來的python
(表示使用解壓縮的python
目錄下的python2.7/bin
路徑下的python2.7
可執行文件作爲Python解釋器),以下是一個簡化的使用python2.7的Hadoop streaming命令的例子
hadoop streaming \
-D mapred.job.name="${JOB_NAME}" \
-D mapred.reduce.tasks=1200 \
-D mapred.job.queue.name=$QUEUE > debug.log 2>&1 \
-input ${INPUT_PATH} \
-output ${OUTPUT_DIR} \
-cacheArchive "$HDFS_DIR/python2.7.tar.gz#python" \
-mapper "./python/python2.7/bin/python2.7 mapper.py" \
-reducer "./python/python2.7/bin/python2.7 reducer.py" \
-file "./mapper.py" \
-file "./reducer.py"