【问题标题】:Hadoop Map Reduce queries for large key spacesHadoop Map Reduce 对大键空间的查询
【发布时间】:2013-04-24 03:17:39
【问题描述】:

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

这是我的问题:

  1. 密钥空间是否非常大(1000 万)。 Hadoop 是否能够处理如此大的密钥空间?每个 key 会有一个 reducer,所以会有数百万个 reducer。

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

  3. 每个盒子可以同时运行多少个减速器?是否可配置?如果每个盒子一次只运行一个 reducer,那将是个问题,因为我无法快速更新 DB 中键的状态。

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

谢谢

【问题讨论】:

  • 合并是如何实现的?每个键是否都必然导致数据库更新,或者实际上它只是一个子集?高层次的逻辑是什么样的?
  • 嗨,克里斯。是的,每个键可能不一定意味着数据库更新,但我不指望这一点。在实践中,我可能会遇到需要为每个键更新数据库的情况。你可以假设它就像更新一个键的状态。

标签: hadoop mapreduce


【解决方案1】:

回答您的问题:

一个。您对减速器之间的键值分布有错误的概念。 reducer 的数量不等于唯一映射器输出键的数量。 这个概念是 - 与映射器中的键关联的所有值都转到单个减速器。这绝不意味着 reducer 只会得到一个键。

例如,考虑以下映射器输出:

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 相关的值将进入单个 reducer,例如 R1,它赢了不要分成多个减速器。但这并不意味着 R1 将只有 1 个密钥 k1 来处理。它也可能有 k2k3 的值。但是对于 reducer 接收到的任何 key,与该 key 关联的所有值都将来自同一个 reducer。希望它能消除你的疑问。

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。是的,reducer 的数量是可配置的。如果你想为每个作业设置它,你可以在你的作业代码 run() 方法中添加一行来设置减速器的数量。

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

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

mapred.tasktracker.{map|reduce}.tasks.maximum - 最大数量 MapReduce 任务,在给定的 TaskTracker 上同时运行, 分别。默认为 2(2 个 map 和 2 个 reduce),但会有所不同 取决于您的硬件。

更多详情:http://hadoop.apache.org/docs/stable/cluster_setup.html#Configuring+the+Hadoop+Daemons

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

感谢和问候。
卡提凯亚辛哈

【讨论】:

  • 嗨,Kartikeya,非常感谢。还有一些后续qns:
  • 一个。这消除了我的疑问。假设我必须在 2 小时内处理 1000 万个密钥,减少 50 台主机的作业,密钥的处理需要半秒(更多的是多个数据库调用)。这意味着我需要每盒每秒处理 28 个键。如果每个盒子只运行一个减速器,我们就无法实现。我想每箱运行 30 个减速器。湾。最后我会有疑问。从 reducer 进行更新是一个糟糕的策略吗? C。我想按盒子设置。这个数字可以有多大?我们需要记住哪些事情来计算这个? d。在实践中,我希望它会少得多。
  • e.由于这个大的键空间(如洗牌等),您是否看到任何问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 2011-07-21
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
相关资源
最近更新 更多