返回信息流不知道发在这个版是否合适……
最近开始研究hadoop,奈何LZ是java渣……
在mapreduce对全局数据进行排序的时候,假设我想输出如下的结果:
1 2
2 6
3 15
4 22
...
就是左面的一列是原始数据在原始数据集中的位次,我的疑问是:程序是如何知道自己节点数据在整体数据中的位次呢……网上查资料的结果大多都是复制粘贴的……
//reduce将输入中的key复制到输出数据的key上,
//然后根据输入的value‐list中元素的个数决定key的输出次数 //用全局linenum来代表key的位次
public static class Reduce extends
Reducer<IntWritable,IntWritable,IntWritable,IntWritable>{
private static IntWritable linenum = new IntWritable(1); //实现reduce函数
public void reduce(IntWritable key,Iterable<IntWritable> values,
Context context)
throws IOException,InterruptedException{ for(IntWritable val:values){ context.write(linenum, key);
linenum = new IntWritable(linenum.get()+1);
}
}
是通过这个linenum全局变量获得的么?原理是什么?
可能问题比较小白,求各位大神不吝赐教啊~~~
这是一条镜像帖。来源:北邮人论坛 / java / #26270同步于 2013/7/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
hadoop-mapreduce排序的一点疑问
magiczzc
2013/7/7镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
啊,还得再请假您一个问题~
那个例子还自定义了一个partition函数,就是为了保证全局的顺序~既然默认只有一个reduce task,那这部就没什么必要了吧~
换句话说,如果我定义了多个reduce task,那么之前那个linenum也只能获得自己reduce节点上数据的位次了吧~
那我如果有多个reduce task 也想获得全局的rank有没有什么办法呢~~
【 在 yanxuan 的大作中提到: 】
: 只有一个reduce task
要是一个reduce task的话 那定义partition就没意义了
例子定义的是TotalOrderPartitioner么,那多个reduce之间能保证:reduce1的都大于reduce2,reduce2的都大于reduce3 ...., 全局的rank通过一个mapreduce还是求不出来。可以对第一次的mapreduce结果进行处理,再做mapreduce。
【 在 magiczzc 的大作中提到: 】
: 啊,还得再请假您一个问题~
: 那个例子还自定义了一个partition函数,就是为了保证全局的顺序~既然默认只有一个reduce task,那这部就没什么必要了吧~
: 换句话说,如果我定义了多个reduce task,那么之前那个linenum也只能获得自己reduce节点上数据的位次了吧~
: ...................
哦~~懂了~~~太感谢了~~果然论坛多牛人啊
【 在 yanxuan 的大作中提到: 】
: 要是一个reduce task的话 那定义partition就没意义了
: 例子定义的是TotalOrderPartitioner么,那多个reduce之间能保证:reduce1的都大于reduce2,reduce2的都大于reduce3 ...., 全局的rank通过一个mapreduce还是求不出来。可以对第一次的mapreduce结果进行处理,再做mapreduce。