2

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

LPF 文件的格式为:(第 1 条记录的大小,4 字节)(第 1 列的大小,2 字节)(第 1 列)(第 2 列的大小)(第 2 列)………….(第 n 列的大小)(第 n 列)(第二条记录的大小)(第一列的大小)(第一列)…………以此类推……

但是,似乎没有合适的 InputFormat 可用于读取各个记录,因为没有分隔符来分隔各个记录或列。

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

4

3 回答 3

1

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

我在谷歌上找不到关于 LPF 格式的太多信息,但是根据你的描述 - 在 reords 之间没有可恢复的分隔符(txt 文件使用换行符,序列文件在块之间有一个签名的 16 字节标题),你需要在单个映射器中处理文件(“不可拆分”)。

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

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

显然,这不是一个有效的算法,但您也许可以通过更多的格式知识/经验来构建它

不管怎样,您肯定需要编写自己的 InputFormat 和 RecordReader。

于 2012-12-04T11:48:20.933 回答
1

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

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

于 2012-12-03T19:20:58.177 回答
0

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

另一种方法是在创建文件时为要处理的每个文件设置块大小。如果您已经知道要写入的文件的大小,这是可能的

于 2012-12-03T15:24:20.700 回答