我是Hadoop的新手,我目前的程序复杂性仅限于wordcount的复杂性。我试图了解Hadoop的基本架构,以便我可以更好地构建我的解决方案。
我遇到的一个重大问题是Hadoop如何在块边界处理大的Key值对?假设我有一个大小为10MB的键值对(例如,如果值是一个完整的10MB文件)并假设我使用了一个序列文件。 Hadoop如何在其边界处理这个问题?它是否将拆分拆分为两部分并将其保存在两个不同的块中,或者它是否意识到键值对非常大而不是拆分,它只是为整个键值对创建一个新块?
答案 0 :(得分:4)
HDFS中的默认块大小为64 MB。如果一个键/值对是10 MB,那么它可能/可能不会跨块分割。
如果第一个KV对是60 MB而第二个是10 MB。然后第二个KV对在第一个块中只剩下4 MB空间(当块大小为64MB时)。因此,第二个KV的4 MB存储在第一个块中,剩余的6个MB存储在第二个块中。
如果第一个KV对是40 MB而第二个是10 MB。然后第二个KV对在第一个块中剩余24 MB空间(当块大小为64MB时)。因此,第二个KV完全存储在第一个区块中而不是分开。
当使用SequenceFile时,映射器不知道块中的记录开始位置,因此Hadoop框架会自动将同步添加到SequenceFiles。根据{{3}}
同步点是流中的一个点,如果读取器“丢失”,可用于与记录边界重新同步 - 例如,在寻找流中的任意位置之后。 SyncFile.Writer记录同步点,在写入序列文件时,每隔几条记录插入一个特殊条目来标记同步点。这些条目足够小,只能产生适度的存储开销 - 小于1%。同步点始终与记录边界对齐。
当地图任务开始处理某个块时,它将Hadoop:The Definitive Guide第一个同步点并从那里开始处理记录。当它到达块的末尾时,它将寻找下一个块的第一个同步点,数据通过网络传输到该点,然后传送到映射器进行处理。
总而言之,即使记录跨块分割,Hadoop框架也能记录。