我发现有人说libhdfs在2010年左右不支持读/写gzip文件。我下载了最新的hadoop-2.0.4并阅读了hdfs.h。也没有压缩参数。现在我想知道它现在是否支持读取压缩文件?如果没有,我如何为libhdfs做一个补丁并使其工作?提前谢谢。向海地致意
voj3qocg1#
谢谢你的回复。使用libhdfs读取原始文件,然后使用zlib膨胀内容。这是可行的。文件使用gzip。我用了这样的代码。
z_stream gzip_stream; gzip_stream.zalloc = (alloc_func)0; gzip_stream.zfree = (free_func)0; gzip_stream.opaque = (voidpf)0; gzip_stream.next_in = buf; gzip_stream.avail_in = readlen; gzip_stream.next_out = buf1; gzip_stream.avail_out = 4096 * 4096; ret = inflateInit2(&gzip_stream, 16 + MAX_WBITS); if (ret != Z_OK) { printf("deflate init error\n"); } ret = inflate(&gzip_stream, Z_NO_FLUSH); ret = inflateEnd(&gzip_stream); printf("the buf \n%s\n", buf1); return buf;
oug3syen2#
如我所知,libhdfs只使用jni访问hdfs。如果您熟悉hdfsjavaapi,那么libhdfs只是 org.apache.hadoop.fs.FSDataInputStream . 所以现在不能直接读取压缩文件。我猜您希望通过c/c访问hdfs中的文件。如果是这样,您可以使用libhdfs来读取原始文件,并使用zip/unzip c/c库来解压缩内容。压缩文件格式相同。例如,如果文件是由lzo压缩的,那么可以使用lzo库对其进行解压缩。但是如果文件是序列文件,那么您可能需要使用jni来访问它们,因为它们是hadoop特殊文件。我以前见过 Impala 做过类似的工作。但这不是现成的。
org.apache.hadoop.fs.FSDataInputStream
2条答案
按热度按时间voj3qocg1#
谢谢你的回复。使用libhdfs读取原始文件,然后使用zlib膨胀内容。这是可行的。文件使用gzip。我用了这样的代码。
oug3syen2#
如我所知,libhdfs只使用jni访问hdfs。如果您熟悉hdfsjavaapi,那么libhdfs只是
org.apache.hadoop.fs.FSDataInputStream
. 所以现在不能直接读取压缩文件。我猜您希望通过c/c访问hdfs中的文件。如果是这样,您可以使用libhdfs来读取原始文件,并使用zip/unzip c/c库来解压缩内容。压缩文件格式相同。例如,如果文件是由lzo压缩的,那么可以使用lzo库对其进行解压缩。
但是如果文件是序列文件,那么您可能需要使用jni来访问它们,因为它们是hadoop特殊文件。我以前见过 Impala 做过类似的工作。但这不是现成的。