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

y4ekin9u  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(397)

我发现有人说libhdfs在2010年左右不支持读/写gzip文件。
我下载了最新的hadoop-2.0.4并阅读了hdfs.h。也没有压缩参数。
现在我想知道它现在是否支持读取压缩文件?
如果没有,我如何为libhdfs做一个补丁并使其工作?
提前谢谢。
向海地致意

voj3qocg

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;
oug3syen

oug3syen2#

如我所知,libhdfs只使用jni访问hdfs。如果您熟悉hdfsjavaapi,那么libhdfs只是 org.apache.hadoop.fs.FSDataInputStream . 所以现在不能直接读取压缩文件。
我猜您希望通过c/c访问hdfs中的文件。如果是这样,您可以使用libhdfs来读取原始文件,并使用zip/unzip c/c库来解压缩内容。压缩文件格式相同。例如,如果文件是由lzo压缩的,那么可以使用lzo库对其进行解压缩。
但是如果文件是序列文件,那么您可能需要使用jni来访问它们,因为它们是hadoop特殊文件。我以前见过 Impala 做过类似的工作。但这不是现成的。

相关问题