我有一个巨大的lpf(长度前缀文件)要由hadoop处理。
lpf文件的格式为:(第1条记录的大小为4字节)(第1列的大小为2字节)(第1列)(第2列的大小)(第2列)……………………(第n列的大小)(第2条记录的大小)(第1列的大小)(第1列)………………………依此类推。。。
但是似乎没有合适的inputformat可用于读取各个记录,因为没有分隔符来分隔各个记录或列。
输入拆分必须发生在其中一条记录的末尾,以便在其他块中不存在半条记录。否则,记录阅读器必须知道半个记录的结尾,这样它才能将它与另一半连接起来。请建议一些方法来读取和处理lpf文件
3条答案
按热度按时间xtfmy6hx1#
如果您有很多这样的文件,我建议您将这些文件设置为不可拆分(只需扩展fileinputformat并将issplitable()函数return设置为false)
另一种方法是为创建时要单独处理的每个文件设置块大小。如果您已经知道要写入的文件的大小,这是可能的
e3bfsja22#
为什么阻止您拆分此文件?在hadoop中,有很多具有可变长度条目的文件格式可以很好地分割。
看一看这个
InputFormat
以及RecordReader
类,看是否有可能实现自定义版本。如果是这样,这就是你应该做的。m4pnthwp3#
lpf文件的格式为:(第1条记录的大小为4字节)(第1列的大小为2字节)(第1列)(第2列的大小)(第2列)………..(第n列的大小)(第2条记录的大小)(第1列的大小)(第1列)…..依此类推。。
我在google上找不到关于lpf格式的太多信息,但是根据您所描述的,reords之间没有可恢复的分隔符(txt文件使用换行符,序列文件在块之间有一个签名16字节的头),您需要在单个Map器(“non-splittable”)中处理该文件。
现在可能有一种算法允许您查找输入文件中的随机位置(假设没有使用不可拆分的压缩格式(如gzip)进行压缩)。
例如,您可以查找文件中的一个随机位置,将下一个4096字节读入缓冲区,并尝试检查从该位置恢复记录。当您解释一个不可能的记录或列大小(-ve或太大,不知道更多关于文件格式的信息,我无法进一步推测)时,请将缓冲区左移1字节,然后再次尝试恢复记录。
显然,这不是一个有效的算法,但是您可以在它的基础上,对格式有更多的知识/经验
另外,您肯定需要编写自己的输入格式和recordreader。