如何在hadoop中处理长度前缀文件

时间:2012-12-03 06:24:58

标签: hadoop mapreduce bigdata fixed-length-record

我有一个巨大的LPF(长度前缀文件)由Hadoop处理。

LPF文件的格式为:( 4字节的第1条记录的大小)(1字节的大小,2字节)(第1列)(第2列的大小)(第2列)............(第n列的大小) (第n栏) (第2记录的大小)(第1列的大小)(第1列)............等......

但是,由于没有用于分隔单个记录或列的分隔符,因此似乎没有适当的InputFormat可用于读取单个记录。

输入拆分必须发生在其中一个记录的末尾,以便在其他一个块中不存在半记录。否则,记录阅读器必须知道半记录的结束,以便它可以与另一半记录连接。请提供一些阅读和处理LPF文件的方法

3 个答案:

答案 0 :(得分:1)

为什么要阻止您拆分此文件?有很多带有可变长度条目的文件格式,在Hadoop中可以很好地分割。

查看InputFormatRecordReader类,看看是否可以实现自定义版本。如果是这样,这就是你应该做的。

答案 1 :(得分:1)

  

LPF文件的格式为:( 4字节的第1条记录的大小)(1字节的大小,2字节)(第1列)(第2列的大小)(第2列)............(第n列的大小) (第n栏)(第2记录的大小)(第1栏的大小)(第1栏)............等等..

我在google上找不到关于LPF格式的更多信息,但是你所描述的内容 - reords之间没有可恢复的分隔符(txt文件使用换行符,序列文件在块之间有一个签名的16字节头),你将需要在单个映射器中处理文件('non-splittable')。

现在可能有一种算法允许您在输入文件中寻找随机位置(假设它没有使用不可拆分的压缩格式压缩,例如gzip)。

例如,您可以在文件中寻找随机位置,将下一个4096字节读入缓冲区并尝试检查从该位置恢复记录。当您解释不可能的记录或列大小(-ve或太大,不知道更多关于文件格式我无法进一步推测)时,将缓冲区左移1个字节并开始尝试再次恢复记录。

显然,这不是一种有效的算法,但你可以用更多的格式知识/经验来构建它

无论如何,你肯定需要编写自己的InputFormat和RecordReader。

答案 2 :(得分:0)

如果你有很多这些文件,我建议将文件设置为不可拆分(只需扩展你的FileInputFormat并设置isSplitable()函数返回false)

另一种方法是在创建seperat时为每个要处理的文件设置blocksize。如果您已经知道要编写的文件的大小

,这是可能的