libhdfs c / c ++ api是否支持读/写压缩文件

时间:2013-06-03 06:43:12

标签: api hadoop hdfs

我发现有人认为libhdfs在2010年左右不支持读/写gzip文件。

我下载了最新的hadoop-2.0.4并阅读了hdfs.h.也没有压缩参数。

现在我想知道它现在是否支持读取压缩文件?

如果没有,我如何为libhdfs制作补丁并使其有效?

提前致谢。

最诚挚的问候 海地

2 个答案:

答案 0 :(得分:0)

据我所知, libhdfs 仅使用 JNI 来访问HDFS。如果您熟悉HDFS Java API, libhdfs 只是org.apache.hadoop.fs.FSDataInputStream的包装器。因此它现在无法直接读取压缩文件。

我想你想通过C / C ++访问HDFS中的文件。如果是这样,您可以使用 libhdfs 来读取原始文件,并使用zip / unzip C / C ++库来解压缩内容。压缩文件格式相同。例如,如果文件是由lzo压缩的,那么您可以使用lzo库来解压缩它们。

但是如果文件是序列文件,那么您可能需要使用JNI来访问它们,因为它们是Hadoop特殊文件。我见过Impala之前做过类似的工作。但它不是开箱即用的。

答案 1 :(得分:0)

感谢您的回复。使用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;
相关问题