我需要定期处理10亿份记录。唯一的键可以在1000万左右。值是具有最大200 K字符的字符串。
以下是我的问题:
谢谢
发布于 2013-04-23 19:17:39
对你的问题的回答:
你有错误的观念,关键,价值分配的减速器。减速器的数量不等于唯一映射器输出键的数量。这个概念是--映射器中与键相关的所有值都归一个减速器所有。这绝不意味着减速机只能得到一个键。
例如,考虑以下映射器输出:
Mapper(k1,v1), Mapper(k1,v2), Mapper(k1,v3)
Mapper(k2,w1), Mapper(k2,w2)
Mapper(k3,u1), Mapper(k3,u2), Mapper(k3,u3), Mapper(k3,u4)因此,与k1 - v1,v2和v3相关的值将进入一个单一的减速器,比如R1,它不会被分割成多个减速器。但这并不意味着R1将只有一个键k1需要处理。它也可能具有k2或k3的值。但是对于还原器接收到的任何键,与该键相关联的所有值都将到达同一个减速机。希望它能消除你的疑虑。
你用的是哪个DB?若要减少DB调用或update语句,可以在完成与特定键相关的值的循环之后,在还原器()的末尾进行查询。
例如:
public static class ReduceJob extends MapReduceBase implements Reducer<Text, Text, Text, Text> {
@Override
public synchronized void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output,
Reporter reporter) throws IOException {
while (values.hasNext()) {
// looping through the values
}
// have your DB update etc. query here to reduce DB calls
}
}是的,减速器的数量是可配置的。如果希望将其设置为每个作业基础,则可以在作业代码run()方法中添加一行,该方法设置减速器的数量。
jobConf.set("mapred.reduce.tasks", numReducers)如果希望将其设置为每台机器,即集群中每台计算机应有多少减缩器,则需要将集群的hadoop配置更改为:
Mapred.tasktracker.{map\reduce}.tasks.maximum--单独在给定的TaskTracker上同时运行的最大MapReduce任务数。默认为2(2个映射和2个减少),但是根据硬件的不同而改变它。
这里有更多详细信息:setup.html#Configuring+the+Hadoop+Daemons
如果您的数据文件不是gZipped(hadoop InputSplit不适用于gZipped文件),那么正如您所说的,您有200 * 1024 *10亿字节= 204800 GB或204.800 TB数据,所以如果您想在2-3小时内完成它,最好保留所有50个框,如果减速器的内存占用较低,那么按照最后一个答案增加每台计算机的减速器数量。此外,将InputSplit大小增加到128 to可能会有所帮助。
谢谢和问候。
卡蒂克亚·辛哈
https://stackoverflow.com/questions/16164534
复制相似问题