【问题标题】:Very large key value pair in HadoopHadoop中非常大的键值对
【发布时间】:2011-12-20 00:02:08
【问题描述】:

我是 Hadoop 的新手,我目前的程序复杂性仅限于字数的复杂性。我正在尝试了解 Hadoop 的基本架构,以便更好地构建我的解决方案。

我遇到的一个大问题是 Hadoop 如何在块边界处理大型键值对?假设我有一个大小为 10MB 的键值对(例如,如果该值是整个 10MB 文件)并假设我使用一个序列文件。 Hadoop 如何在其块边界处处理这个问题?是否将拆分拆分为两部分并将其保存在两个不同的块中,或者它是否意识到键值对非常大,因此而不是拆分,它只是为整个键值对创建一个新块?

【问题讨论】:

  • 好问题!我认为它在值的中间拆分它,然后在运行时重构它(也就是说,它忽略了键/值边界)......但我不确定提供官方答案。

标签: hadoop key


【解决方案1】:

HDFS 中的默认块大小为 64 MB。如果一个键/值对是 10 MB,那么它可能/可能不会跨块拆分。

  • 如果第一个 KV 对是 60 MB,第二个是 10 MB。然后第二个 KV 对在第一个块中只剩下 4 MB 空间(当块大小为 64MB 时)。因此,第 2 个 KV 的 4 MB 存储在第一个块中,剩余的 6 MB 存储在第二个块中。

  • 如果第一个 KV 对是 40 MB,第二个是 10 MB。然后第二个 KV 对在第一个块中剩余 24 MB 空间(当块大小为 64MB 时)。所以,第二个 KV 完全存储在第一个块中,而不是拆分。

使用 SequenceFile 时,映射器不知道记录的开始在块中的位置,因此 Hadoop 框架会自动将同步添加到 SequenceFiles。根据Hadoop:The Definitive Guide

同步点是流中的一个点,可用于在读取器“丢失”时与记录边界重新同步 - 例如,在寻找流中的任意位置之后。同步点由 SequenceFile.Writer 记录,在写入序列文件时,每隔几条记录插入一个特殊条目来标记同步点。这样的条目足够小,只会产生适度的存储开销——不到 1%。同步点始终与记录边界对齐。

当一个map任务开始处理一个block时,它会seek第一个同步点并从那里开始处理记录。当它到达块的末尾时,它将寻找下一个块的第一个同步点,并将数据通过网络传输到该点的第一个同步点到映射器进行处理。

总而言之,Hadoop 框架是记录感知的,即使记录被分成多个块。

【讨论】:

  • 感谢您的信息。这回答了我的问题,但我想这也意味着当大键值对被拆分时,在节点之间传输大量数据会产生相当大的开销。 (在您的示例中,需要 6MB 或 4MB 的传输)。因此,拥有大的键值对可能没有意义。我说的对吗?
  • 如果存在较大的 kv 对,则 HDFS 块大小可以从默认值 64 MB 增加。
猜你喜欢
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
相关资源
最近更新 更多