如果值跨边界存储,如何在mapreduce程序中创建键、值对?

ergxz8rk  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(527)

在我需要处理的输入文件中,有按标题及其相应记录分类的数据。我的200MB文件有3个这样的头文件,它的记录被分成4个块(364MB和18MB)。
数据格式如下

HEADER 1
Record 1
Record 2
.
.
Record n
HEADER 2
Record 1
Record 2
.
.
Record n
HEADER 3
Record 1
Record 2
.
.
Record n

我所需要的只是将头作为键,将其下面的记录作为值,并在Map程序代码中处理一些操作。
这里的问题是我的记录被分成了不同的块。假设我的第一个头和它各自的记录占用了70MB的空间,这意味着它占用了第一个块的64MB和第二个块的6MB空间。
现在,在第2个块上运行的Map程序如何知道6MB的文件属于头1的记录。
谁能解释一下如何完整地获取标题及其记录吗。

xytpbqjk

xytpbqjk1#

您可以将hdfs块的默认大小增加到128mb,如果文件很小,它将把它作为一个块。

tjvv9vkg

tjvv9vkg2#

您需要一个定制的recordreader和定制的linereader来以这种方式进行处理,而不是读取每一行。
由于拆分是在客户机中计算的,所以每个Map器都已经知道是否需要丢弃上一个头的记录。
希望下面的链接能对hadoop进程记录如何跨越块边界进行拆分有所帮助?

syqv5f0l

syqv5f0l3#

你有两种方法:
一个单独的Map器处理所有记录,这样您就可以在一个类中获得完整的数据,并决定如何将它们分开。给定输入大小,这将有性能问题。更多信息在hadoop定义指南,mr类型和格式,输入格式,防止分裂。更少的编码工作,如果您的Map器有较少的数据和频繁运行,这种方法是可以的。
如果您计划使用自定义拆分和记录读取器,则需要修改框架的工作方式。因为,您的记录类似于textinputformat。所以基本上不需要计划定制的记录阅读器。但是,您需要定义如何进行拆分。一般来说,为了利用数据的局部性,拆分的大小基本上等于块大小。在您的情况下,您的数据(主要是标题部分)可以在任何块结束,您应该相应地分割。所有上述更改都需要进行,以使map reduce与您拥有的数据一起工作。

相关问题