在 Hadoop MapReduce 中为二进制文件创建自定义 InputFormat 和 RecordReader

2024-05-27

我正在编写一个 M/R 作业,该作业处理以二进制格式编写的大型时间序列数据文件,如下所示(此处换行以提高可读性,显然,实际数据是连续的):

TIMESTAMP_1---------------------TIMESTAMP_1
TIMESTAMP_2**********TIMESTAMP_2 
TIMESTAMP_3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%TIMESTAMP_3
.. etc

其中时间戳只是一个 8 字节结构,可通过前 2 个字节进行识别。实际数据限于重复值时间戳之间,如上所示,并且包含一个或多个预定义结构。我想编写一个自定义输入格式,它将向映射器发出键/值对:

< TIMESTAMP_1, --------------------- >
< TIMESTAMP_2, ********** >
< TIMESTAMP_3, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% >

从逻辑上讲,我想跟踪当前的情况TIMESTAMP,并汇总所有数据,直到TIMESTAMP再次检测到,然后发送我的<TIMESTAMP, DATA>配对作为记录。我的问题是在内部的拆分之间同步RecordReader,所以如果某个读者收到以下分割

# a split occurs inside my data
reader X: TIMESTAMP_1--------------
reader Y: -------TIMESTAMP_1 TIMESTAMP_2****..

# or inside the timestamp
or even: @@@@@@@TIMES
         TAMP_1-------------- ..

解决这个问题的好方法是什么?我是否有一种简单的方法来访问文件偏移量,以便我的CustomRecordReader可以在拆分之间同步而不丢失数据吗?我觉得我在如何处理分割方面存在一些概念上的差距,所以也许对这些的解释可能会有所帮助。谢谢。


一般来说,创建支持分割的输入格式并不简单,因为您应该能够找出从分割边界移动到哪里以获得一致的记录。 XmlInputFormat 是这样做的格式的一个很好的例子。
我建议首先考虑您是否确实需要可拆分输入?您可以将输入格式定义为不可拆分,这样就不会出现所有这些问题。
如果您的文件通常不会比块大小大很多 - 您不会丢失任何东西。如果他们这样做 - 您将失去部分数据局部性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Hadoop MapReduce 中为二进制文件创建自定义 InputFormat 和 RecordReader 的相关文章

随机推荐