1. 往map或reduce传入参数
-cmdenv name=value
name在reduce或map的机器上就是环境变量的名字,在python里可以使用:
os.environ['name'] 获取value;
2. 使用自己的python
-cacheArchive " /user/username/python.tar.gz#python"
python.tar.gz解压后里面为lib、bin、include文件夹,注意相对路径;在map.py里面就可以使用 #! ./python/bin/python;
用一个map.sh 将map.py封装,并且建立环境变量:
************************************************************************************************
#! /bin/bash
#
# Filename: map.sh
#
export LD_LIBRARY_PATH=./python/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=./python/include:$C_INCLUDE_PATH
export LIBRARY_PATH=./python/lib:$LIBRARY_PATH
export PYTHONHOME=./python
export PYTHONPATH=$PYTHONHOME:$PYTHONHOME/lib/python2.7/site-packages
export PATH=./python/bin:$PYTHONHOME:$PYTHONPATH:$PATH
python map.py
**************************************************************************************************
-cacheArchive事实上是分发压缩文件的参数;
3.多路输出
使用reduce多路输出的功能,需要做三件事情:
使用reduce多路输出需要注意一下几点:
4.使用hdfs上的文件
如果文件(如字典文件)存放在HDFS中,希望计算时在每个计算节点上将文件当作本地文件处理,可以使用-cacheFile hdfs://host:port/path/to/file#linkname选项在计算节点缓存文件,Streaming程序通过./linkname访问文件。
在使用的时候要注意路径名字:
如果TFFILE为hadoop上的一个文件/user/file
-cacheFile "hdfs://namenode:Port/${TFFILE}#tf"会解释为:
-cacheFile "hdfs://namenode:Port//user/file#tf";也就是在user前面有两个'/'有时候会出错。
5.读取输入路径
data=os.environ.get('map_input_file').split('.')