Hadoop Map减少对大键空间的查询



我需要定期处理10亿条记录。唯一键可以在1000万的范围内。取值为最大200K字符的字符串。

以下是我的问题:

  1. 键空间非常大(1000万)。Hadoop能够处理这么大的密钥空间吗?每个键将有一个减速机,因此将有数百万个减速机。

  2. 我想更新DB在减速器本身。在reducer中,我将合并值(表示当前值),从DB读取现有值(表示现有值),合并当前值和现有值并更新DB。这是一个正确的策略吗?

  3. 每个箱体可以同时运行多少个减速器?它是否可配置?如果每次只有一个减速机运行,这将是一个问题,因为我将无法非常快地更新DB中的键的状态。

  4. 我希望这项工作在2-3小时内完成。我需要多少盒子(我最多可以腾出50个盒子- 64 GB RAM, 8核机器)

谢谢

回答你的问题:

。你有一个错误的概念,键,值分布在还原器。reducer的数量不等于唯一映射器输出键的数量。这个概念是——所有与一个键相关的值从mapper到一个reducer。这并不意味着一个reducer只能得到一个key。

例如,考虑以下映射器输出:
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 v2v3将进入单个减速机,例如R1,它不会被分成多个减速机。但这并不意味着R1只有一个键k1可以处理。它也可以有k2k3的值。但是对于一个减速器接收到的任何键,与该键相关的所有值都将到达同一个减速器。希望这能消除你的疑虑。

b。您使用的是哪个数据库?为了减少DB调用或更新语句,可以在完成与特定键相关的值的循环之后,将查询放在reducer()的末尾。

例如:

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
      }
}

c。是的,减速器的数量是可配置的。如果你想在每个作业的基础上设置它,你可以在你的作业代码run()方法中添加一行来设置reducer的数量。

jobConf.set("mapred.reduce.tasks", numReducers)

如果你想设置为每台机器的基础,即集群中每台机器应该有多少个reducer,那么你需要改变集群的hadoop配置:

mapred.tasktracker。{地图|减少}.tasks。maximum -最大数目MapReduce任务在给定的TaskTracker上同时运行,单独。默认为2(2个映射和2个减少),但可以改变它取决于你的硬件。

更多细节在这里:http://hadoop.apache.org/docs/stable/cluster_setup.html#Configuring+the+Hadoop+Daemons

d。如果你的数据文件没有gZipped(hadoop InputSplit不与gZipped文件一起工作),那么根据你所说的,你有200 * 1024 * 10亿字节= 204800 GB或204800 TB的数据,所以如果你想在2-3小时内完成它,最好保留所有50个盒子,如果reducer的内存占用很低,那么根据上一个答案增加每台机器的reducer数量。此外,将InputSplit的大小增加到128MB左右可能会有所帮助。

Thanks and Regards.
Kartikeya Sinha

相关内容

  • 没有找到相关文章