分类: LINUX
2016-08-19 15:29:22
关于grep:
hadoop streaming -input /user/hadoop/hadoopfile -output /user/hadoop/result -mapper "grep hello" -jobconf mapre.job.name="grep-test" -jobconf stream.non.zero.exit.is.failure=false -jobconf mapred.reduce.tasks=1
说明:
-input /user/hadoop/hadoopfile : 待处理文件目录
-output /user/hadoop/result :处理结果存放目录
-mapper "grep hello" :map程序
-jobconf mapre.job.name="grep-test" :任务名
-jobconf stream.non.zero.exit.is.failure=false : map-reduce程序返回值不做判断;streaming默认的情况下,mapper和reducer的返回值不是0,被认为异常任务,将被再次执行,默认尝试4次都不是0,整个job都将失败。而grep在没有匹配结果时返回1。
-jobconf mapred.reduce.tasks=1 : reduce任务数。 此处也可配置为0,为0配置表示告诉Map/reduce框架不要创建reducer任务
关于awk:
hadoop jar $HADOOP_STREAMING_JAR \
-input /test/ylb/mock_data/cv-pt-demo.txt \
-output /test/ylb/mock_data/output/cv-pt-demo-10 \
-mapper "awk '\$1~/1/ {printf(\"%s\t%s\n\",\$1,\$2)}'" \
-reducer "awk 'BEGIN{pt[\"test_key\"]=0;} {key=\$2/10;pt[key]+=1;} END{ for(k in pt){printf(\"%d\t%d\n\",k,pt[k]);} }'"
-mapper " awk ' ' " , 这种写法的话, ' ' 里面的脚本中有三种字符(shell特殊字符)需要转义,分别是 " ' $ ,这种写法的好处是可以方便的引用外部shell变量
-mapper ' awk " " ' 这种写法则不需要转义
类似的其他命令中需要嵌套单引号双引号也是这样。
1. -mapper " awk ' ' " , 这种写法的话, ' ' 里面的脚本中有三种字符(shell特殊字符)需要转义,分别是 " ' $
这种写法的好处是可以方便的引用外部shell变量
-mapper ' awk " " ' 这种写法则不需要转义
hadoop 支持reduce多路输出的功能,一个reduce可以输出到多个part-xxxxx-X文件中,其中X是A-Z的字母之一,程序在输出对的时候,在value的后面追加"#X"后缀,比如#A,输出的文件就是part-00000-A,不同的后缀可以把key,value输出到不同的文件中,方便做输出类型分类, #X仅仅用做指定输出文件后缀, 不会体现到输出的内容中
启动脚本中需要指定-outputformat org.apache.hadoop.mapred.lib.SuffixMultipleTextOutputFormat或者-outputformat org.apache.hadoop.mapred.lib.SuffixMultipleSequenceFileOutputFormat, 输出就会按照多路输出的方式进行分文件输出
所有标准输出的value中都要加上 #X后缀,X代表A-Z, 不然会报invalid suffix错误