我正在编写一个 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(使用前将#替换为@)