我希望能够创建一个自定义的inputformat来读取序列文件,但是另外还要公开记录所在文件中的文件路径和偏移量。
退一步说,这里有一个用例:我有一个序列文件,其中包含大小可变的数据。键基本上是不相关的,值高达几兆字节,包含各种不同的字段。我想在elasticsearch中索引其中一些字段以及文件名和偏移量。这样,我可以从elasticsearch中查询这些字段,然后使用文件名和偏移量返回序列文件并获取原始记录,而不是将整个内容存储在es中。
我将整个过程作为一个java程序来工作。sequencefile.reader类方便地给出 getPosition
以及 seek
实现这一点的方法。
但是,最终会涉及到很多TB的数据,因此我需要将其转换为mapreduce作业(可能仅限于map)。由于序列文件中的实际键是不相关的,因此我希望采用的方法是创建一个自定义inputformat,该格式扩展或以某种方式利用squencefileinputformat,但不是返回实际键,而是返回一个由文件和偏移组成的复合键。
然而,事实证明,这在实践中更加困难。看起来这应该是可能的,但是考虑到实际的api和公开的内容,这很棘手。有什么想法吗?也许我应该采取另一种方法?
1条答案
按热度按时间new9mtju1#
如果有人遇到类似的问题,下面是我想出的解决办法。最后我简单地复制了sequencefileinputformat/recordreader中的一些代码,并对其进行了修改。我曾希望写一个子类或装饰或什么的。。。这种方式不太好看,但很管用:
sequencefileoffsetinputformat.java:
pathoffsetwriteable.java文件: