Hadoop Streaming提供了一个便于进行MapReduce编程的工具包,使用它可以基于一些可执行命令、脚本语言或其他编程语言来实现Mapper和 Reducer,从而充分利用Hadoop并行计算框架的优势和能力,来处理大数据
Hadoop Streaming原理
mapper和reducer会从标准输入中读取用户数据,一行一行处理后发送给标准输出。Streaming工具会创建MapReduce作业,发送给各个tasktracker,同时监控整个作业的执行过程。 
 如果一个文件(可执行或者脚本)作为mapper,mapper初始化时,每一个mapper任务会把该文件作为一个单独进程启动,mapper任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入。 同时,mapper收集可执行文件进程标准输出的内容,并把收到的每一行内容转化成key/value对,作为mapper的输出。 默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。如果没有tab,整行作为key值,value值为null。
Hadoop Streaming用法
options: 
 (1) -input:输入文件路径 
 (2) -output:输出文件路径 
 (3) -mapper:用户自己写的mapper程序,可以是可执行文件或者脚本 
 (4) -reducer:用户自己写的reducer程序,可以是可执行文件或者脚本 
 (5) -file:打包文件到提交的作业中,可以是mapper或者reducer要用的输入文件,如配置文件,字典等。 
 (6) -numReduceTasks:reduce任务数 
 (7) -inputformat:输入数据格式 
 (8) -partitioner:用户自定义的partitioner程序 
 (9) -combiner:用户自定义的combiner程序 
 -D:作业的一些属性 具体有: 
 -D mapred.map.tasks: map task数目 
 -D mapred.reduce.tasks:reduce task数目 
 -D stream.map.output.field.separator key\value 分割方式 
 -D stream.num.map.output.key.fields 
 -D stream.reduce.output.field.separator 
 -D stream.num.reduce.output.key.fields 
 -D map.output.key.field.separator=, 对key分割 
 -D num.key.fields.for.partition=1 分组字段,取第一个字段 
 -D mapreduce.output.fileoutputformat.compress=true \ 输出数据需要压缩 
 -D mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec \ 压缩格式,lzo 
eg:python版本
#!/bin/bash
EXEC_PATH=$(dirname "$0")
HPHOME=/opt/cloudera/parcels/CDH
JAR_PACKAGE=/opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-streaming.jar
IN_PATH0=/bigdata/xxx/201609*/*
IN_PATH1=/bigdata/xxx/20161[0-1]*/*
OUT_PATH=/user/xxx/
MAP_FILE=${EXEC_PATH}/step2_map.py
RED_FILE=${EXEC_PATH}/step2_red.py
$HPHOME/bin/hadoop fs -rm -r $OUT_PATH
$HPHOME/bin/hadoop jar $JAR_PACKAGE \
-D stream.map.input.ignoreKey=true-D-D num.key.fields.for.partition=1 \ #定义分组字段,以逗号切分map输出字段,然后提取第一个字段为分组字段-numReduceTasks 1-input $IN_PATH0-input $IN_PATH1-output $OUT_PATH-inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat \ #lzo压缩-mapper $MAP_FILE-reducer $RED_FILE-file $MAP_FILE-file $RED_FILE-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner$HPHOME/bin/hadoop fs -ls $OUT_PATH
                










