背景
使用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"