在我需要处理的输入文件中,有按标题分类的数据及其各自的记录。我的200 MB文件有3个这样的标题,它的记录分为4个块(3 * 64 MB和1 * 8 MB)。
数据将采用以下格式
HEADER 1
Record 1
Record 2
.
.
Record n
HEADER 2
Record 1
Record 2
.
.
Record n
HEADER 3
Record 1
Record 2
.
.
Record n
我只需要将 HEADER 作为键,将记录作为值,并在我的映射器代码中处理一些操作。
这里的问题是我的记录分为不同的块。 假设我的第一个Header及其各自的记录占用70 MB的空间,这意味着它占用了第一个块的64 MB和第二个块中的6 MB空间。
现在,在第二个块上运行的映射器如何知道6 MB的文件属于HEADER 1的记录。
任何人都可以向我解释如何完整地获取标题及其记录。
答案 0 :(得分:0)
您需要一个自定义记录阅读器和自定义线路阅读器来处理,而不是阅读每一行。
由于拆分是在客户端计算的,因此每个映射器都知道是否需要丢弃先前标头的记录。
希望以下链接可能会有所帮助 How does Hadoop process records split across block boundaries?
答案 1 :(得分:0)
您有两种方式:
单一映射器处理所有记录,因此您可以在单个类中获得完整数据,并决定如何将它们分开。鉴于输入大小,这将产生性能问题。有关Hadoop定义指南,MR类型和格式,输入格式,防止拆分的更多信息。减少编码工作量,如果您的映射器数据较少且经常运行,这种方法就可以了。
如果您打算使用自定义拆分和记录阅读器,则需要修改框架的工作方式。因为,您的记录类似于TextInputFormat。因此大多数情况下无需计划自定义记录阅读器。但是,您需要定义拆分的方式。通常,拆分大多等于块大小,以利用数据局部性。在您的情况下,您的数据(主要是标题部分)可以在任何块结束,您应该相应地进行拆分。所有上述更改都需要进行,以使地图减少使用您拥有的数据。
答案 2 :(得分:0)
您可以将HDFS块的默认大小增加到128MB,如果文件很小,则将其作为一个块。