Libhdfs 使用过程中遇到的坑

2,787 阅读2分钟

根据客户的需求,希望能够把文件写入到hdfs上备份,对于一个纯c++的项目来说比较坑。能拿来直接用的hdfs的客户端有两个,一个是第三方提供的libhdfs3纯c++代码,能够直接组织到项目里做静态编译,但是已经很久没有维护了;另一个是官方提供的native方法libhdfs,让人不满意的地方是libhdfs是通过jni启动封装接口调用java代码的方式来实现的。为了项目的稳定最后选择了官方提供的libhdfs。下面说明一下在使用过程遇到的坑。

libhdfs依赖的jar

完整的项目hdfs项目里面有非常多的jar,但是对于libhdfs来说其只依赖common文件夹和hdfs_client文件夹下的jar包,对于3.2.1的hadoop而言大概是57M左右,在启动libhdfs的项目之前将这些jar包添加到环境变量CLASSPATH中即可

libhdfs的配置文件路径

libhdfs的连接的示例代码大概如下所示:

hdfsFS fs = hdfsConnect("default", 0);

这种连接方式会读取默认的配置文件来进行配置,默认配置文件的搜索路径为同样为CLASSPATH,可以在通过添加配置文件的路径到其中默认的配置文件为core-site.xml

Jvm core dump

如果在使用libhdfs的过程中,在c++的代码中注册了signal的监听,jvm的运行可能会导致这些监听被调用出现错误。在我们的项目中通过对signal的监听实现了mini core,运行过程中会导致莫名其妙的core dump。这是因为jvm在运行时会自己产生并处理一些signal,例如SIGSEGV,jvm依赖其检测是否是null pointer等。

可以通过链接动态库libjsig.so来确保jvm截获这些signal不会触发原始在c++代码中注册的signal handler

参考资料

  1. libhdfs
  2. jvm signal
  3. jvm native signal