2011-12-19 53 views
4

我是Hadoop的全新品牌,目前我的程序复杂度仅限于wordcount的复杂度。我想了解Hadoop的基本架构,以便更好地构建我的解决方案。Hadoop中非常大的键值对

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

+0

好问题!我认为它会在价值中间分裂它,然后在运行时重新构造它(也就是说,它忽略了键/值边界)......但我不确定是否提供了正式答案。 – 2011-12-19 15:35:46

回答

4

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

  • 如果第一个KV对是60 MB,第二个是10 MB。然后,第二个KV对在第一个块中只剩下4 MB空间(如果块大小为64 MB)。因此,在第一个块中存储4 MB的第二个KV,剩余的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框架仍可以识别记录。

+0

感谢您的信息。这回答了我的问题,但我想这也意味着当大键值对被拆分时,在节点之间传输大量数据会有相当大的开销。 (在你的例子中,需要6MB或4MB的传输)。 SO可能是具有大键值对的意义不大。我对么? – BegaluruBoy 2011-12-20 12:30:03

+0

如果有较大的kv对,则HDFS块大小可以从64 MB的默认值增加。 – 2011-12-20 13:26:24