我的文件有两列id和timestamp。我计算每个值的会话数 - 由不活动确定超过30分钟。但是,我遇到了流命令的问题。几行的例子如下。
id,time
1,2015-02-05 01:01:01
1,2015-02-05 01:02:01
3,2015-02-05 02:01:01
3,2015-02-05 02:01:02
我知道我的mapper和reducer正常工作b / c当我只使用一个reducer时,我得到了正确的结果。我的问题是当我需要使用多个reducer时,我尝试使用Partitioner将map输出的第一个值发送到一个reducer,并按地图输出中的第二个值对其进行排序。有关如何实现这一目标的任何建议吗?
这就是我正在尝试的。
hadoop jar /opt/cloudera/parcels/CDH-5.1.2-1.cdh5.1.2.p470.103/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.3.0-mr1-cdh5.1.2.jar \
-Dmapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator \
-D stream.map.output.field.separator=, \
-D stream.num.map.output.key.fields=2 \
-D mapred.text.key.partitioner.options=-k1,1 \
-Dmapred.text.key.comparator.options=-k2,2 \
-input /in/ \
-output /out/ \
-mapper mapper1.py \
-file ${DIR}mapper.py \
-reducer reducerA.py \
-file ${DIR}reducer.py
答案 0 :(得分:0)
将“-Dmapred.text.key.comparator.options = -k2,2”更改为“-Dmapred.text.key.comparator.options = -k1,2”,以便reducer收到的记录首先按id排序然后是时间。您的reducer也需要比较记录的连续键(id),并且只计算具有相同ID的记录的会话。