对于大批量的数据,使用本地的 diff 命令比较速度慢,推荐采用 map-reduce 的方式来进行。本文的主要内容为 mr 相关脚本的实现及分析。
脚本如下:
run.sh : 用于提交 mr 任务
mapper.sh : mr 任务的 mapper 脚本
reducer.sh : mr 任务的 reducer 脚本
代码是抄同事的,分析是抄博客的(滑稽
run.sh
1 |
|
stream.num.map.output.key.fields
设置分割符的位置,位置之前为 key,后面为 value,例如 “1,2,3,4,5” ,如果为 4,则 key 为 “1,2,3,4”,value 为 “5”。
参考:https://blog.csdn.net/xhu_eternalcc/article/details/47147425
num.key.fields.for.partition
指定 key 中前几部分用来分片,例如 key 为 “1,2,3,4”,如果为 2,则用来分片的为 “1,2”
参考:https://blog.csdn.net/xhu_eternalcc/article/details/47147425
mapred.output.key.comparator.class
指定对 key 进行分片时进行排序的 class
org.apache.hadoop.mapred.lib.KeyFieldBasedComparator
mapred.text.key.comparator.options
_-n_ specifies that the sorting is numerical sorting and _-r_ specifies that the result should be reversed;-k 开始,结束 index(默认从 1 开始)。例如 “-k2,2nr” ,对第二列视为数字类型进行逆序排序
1 | 11.12.1.2 |
org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
允许你根据 key 的一部分(也就是字段)来进行 partition ,需要配置 mapreduce.partition.keypartitioner.options
参考:https://hadoop.apache.org/docs/r2.7.2/api/org/apache/hadoop/mapred/lib/KeyFieldBasedPartitioner.html
org.apache.hadoop.mapred.lib.SuffixMultipleTextOutputFormat
hadoop 支持 reduce 多路输出的功能,一个reduce可以输出到多个
part-xxxxx-X
文件中,其中X
是A-Z
的字母之一,程序在输出<key,value>
对的时候,在value
的后面追加#X
后缀,比如#A
,输出的文件就是part-00000-A
,不同的后缀可以把<key,value>
输出到不同的文件中,方便做输出类型分类,#X
仅仅用做指定输出文件后缀,不会体现到输出的内容中参考:https://www.cnblogs.com/shapherd/archive/2012/12/21/2827860.html
mapper.sh
1 | set -x |
在 run.sh 里指定了执行命令:-mapper "sh -x mapper.sh ${context1} ${context2}"
对于 hadoop 路径中包含 context1 的文件,会在其每行url后添加 \t1
,例如 url1 \t 1
,然后输出
对于 hadoop 路径中包含 context2 的文件,会在其每行url后添加 \t2
,例如 url2 \t 2
,然后输出
之后 hadoop 会根据这两个列进行排序( -D mapred.text.key.comparator.options=”-k1,2”)
reducer.sh
1 |
|
这个脚本接受的输入大致如下:
1 | url1 1 |
url1 在 1 和 2 中都存在,则输出 url1#C
url2 只在 1 中存在,则输出 url2#A
url3 只在 2 中存在,则输出 url3#B
org.apache.hadoop.mapred.lib.SuffixMultipleTextOutputFormat
会根据 # 后的值,将 url 输出到不同的 xxx-X 的文件中,X 对应 A、B 或 C