首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libhdfs c/c++ api是否支持读/写压缩文件

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

Stack Overflow用户
提问于 2013-06-03 14:43:12
回答 2查看 1.8K关注 0票数 1

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

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

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

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

提前谢谢。

向海地致以最好的敬意

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-03 16:34:29

据我所知,libhdfs只使用JNI来访问HDFS。如果您熟悉HDFS Java API,那么libhdfs只是org.apache.hadoop.fs.FSDataInputStream的一个包装器。所以它现在不能直接读取压缩文件。

我猜您希望通过C/C++访问HDFS中的文件。如果是这样的话,您可以使用zip libhdfs读取原始文件,并使用zip/unzip C/C++库来解压缩内容。压缩文件格式相同。例如,如果文件是用lzo压缩的,那么您可以使用lzo库对其进行解压缩。

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

票数 0
EN

Stack Overflow用户

发布于 2013-06-04 15:08:06

谢谢你的回复。使用libhdfs读取原始文件,然后使用zlib扩展内容。这是可行的。该文件使用gzip。我用的代码是这样的。

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16891274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档