我正在编写一个 M/R 作业,它处理以二进制格式编写的大型时间序列数据文件,看起来像这样(为了便于阅读,这里的新行,实际数据是连续的,显然):
TIMESTAMP_1---------------------TIMESTAMP_1
TIMESTAMP_2**********TIMESTAMP_2
TIMESTAMP_3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%TIMESTAMP_3
.. etc
其中 timestamp 只是一个 8 字节的结构,可以通过前 2 个字节来识别。如上所示,实际数据在重复值时间戳之间有界,并且包含一个或多个预定义结构。我想编写一个自定义 InputFormat,它将向映射器发出键/值对:
< 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
可以在拆分之间同步而不会丢失数据?我觉得我在如何处理拆分方面存在一些概念上的空白,因此对这些问题的解释可能会有所帮助。谢谢。