hadoop官方的二进制发布版本一直是32位平台编译的,对于java来说跨平台不影响使用,但是为了在c/c++程序中操作hdfs就做不到了,因为libhdfs.so是二进制不兼容的。

我使用的是stable版本的hadoop 2.20,直接从官方下载了二进制发布版本,在目录lib/native下有操作hadoop的c/c++库(.a和.so),但由于服务器是64位的原因无法链接。

解决方法就是下载hadoop的src源码,自行编译生成so,这个过程如果没有Yum会比较繁琐,因为依赖很多,在编译过程中会遇到若干错误,后续会将编译步骤完善起来,这里只说明libhdfs.so如何编译生成一个可运行的程序。

libhfds是基于libjvm运行的,也就是创造了一个java虚拟机然后直接调用hadoop的java jar包实现hdfs系统的访问,所以在编译程序时一定要注意以下几点要素:

1, 如果你是64位系统,必须自行编译hadoop生成64位版本的libhfds.so,如果你是32位系统那就不必了,可以直接使用目录下的lib/native里的so。

2, 编译时一定要链接libjvm.so,这个so在jdk/jre/lib/amd64/server/下面,其中amd64目录代表我是64位系统,你需要根据你的系统选择特定目录下的libjvm.so。

3, 由于libhdfs直接基于jvm加载jar包,而jvm是依靠系统环境变量CLASSPATH寻找jar包的,所以你一定要export导出CLASSPATH环境变量,保证它包含了java jdk和jre的所有jar包以及hadoop/shared/hadoop内的所有jar包,这样运行时jvm才能正确的load到jar包,否则会抛出java异常令程序终止。

4,由于程序依赖so动态库,为了运行时能够找到so,还需要导出libhdfs.so和libjvm.so的路径到LD_LIBRARY_PATH变量中去。

下面是一段简单的示例代码,打开一个hdfs文件并向文件写入了hello hdfs,之后关闭文件,重点关注其编译命令:

#include "hdfs.h"

int main(int argc, char **argv)
{
hdfsFS fs = hdfsConnect("10.46.120.32", );
if (!fs) {
fprintf(stderr, "connect fail\n");
return -;
}
hdfsFile writeFile = hdfsOpenFile(fs, "/first.txt", O_WRONLY, , , );
if (!writeFile) {
fprintf(stderr, "openfile fali\n");
return -;
}
hdfsWrite(fs, writeFile, "hello hdfs", );
hdfsCloseFile(fs, writeFile);
hdfsDisconnect(fs);
return ;
}

编译命令如下:

gcc -o hdfs hdfs.c -L /hadoop/lib/native -lhdfs -I /hadoop/include -L /jdk/jre/lib/amd64/server/ -ljvm

下面的代码足以完成所有环境变量的初始化,不需要再做额外的任何工作,建议填好后放到.bashrc中,这里假设hadoop安装在/hadoop中,jdk安装在/jdk中,libhdfs在hadoop默认路径下:

export JAVA_HOME=/jdk  #jdk安装路径

export JRE_HOME=${JAVA_HOME}/jre #jre路径

export LD_LIBRARY_PATH=/jdk/jre/lib/amd64/server:/hadoop/lib/native # libjvm.so目录和libhdfs.so目录

CLASSPATH=${JAVA_HOME}/lib:${JRE_HOME}/lib # jdk与jre的jar

HADOOP_HOME=/hadoop #hadoop安装路径

CLASSPATH=${CLASSPATH}":"`find ${HADOOP_HOME}/share/hadoop | awk '{path=path":"$0}END{print path}'` # hadoop的jar
export CLASSPATH

【hadoop摸索系列】记录使用libhdfs访问hdfs的关键问题的更多相关文章

  1. Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统

    前言 我们知道HDFS集群中,所有的文件都是存放在DN的数据块中的.那我们该怎么去查看数据块的相关属性的呢?这就是我今天分享的内容了 一.HDFS中数据块概述 1.1.HDFS集群中数据块存放位置 我 ...

  2. Hadoop通过路径和和链接访问HDFS

    如果既想在Hadoop服务器本地可以通过绝对路径如"/user/hadoop"方式访问hdfs,也想通过"hdfs://local host:9000/user/hado ...

  3. Hadoop(五)搭建Hadoop与Java访问HDFS集群

    前言 上一篇详细介绍了HDFS集群,还有操作HDFS集群的一些命令,常用的命令: hdfs dfs -ls xxx hdfs dfs -mkdir -p /xxx/xxx hdfs dfs -cat ...

  4. Hadoop(五)搭建Hadoop客户端与Java访问HDFS集群

    阅读目录(Content) 一.Hadoop客户端配置 二.Java访问HDFS集群 2.1.HDFS的Java访问接口 2.2.Java访问HDFS主要编程步骤 2.3.使用FileSystem A ...

  5. 配置伪分布模式下的hadoop以及采用fuse-dfs来访问HDFS

    实验目标 配置环境的主要目的是得到HDFS的客户端fuse-dfs的IO性能.本来的服务器上没有任何环境,因此安装均是从无到有的.系统是Ubuntu server 14.04 amd64.整个过程参考 ...

  6. hadoop学习记录(一)HDFS

    hadoop的灵感源于谷歌,最初目的是解决传统数据库处理数据成本高和速度慢的问题. hadoop两个核心项目是HDFS(hadoop分布式文件系统)和MapReduce. HDFS用来实现数据的存储, ...

  7. 【Hadoop】HA 场景下访问 HDFS JAVA API Client

    客户端需要指定ns名称,节点配置,ConfiguredFailoverProxyProvider等信息. 代码示例: package cn.itacst.hadoop.hdfs; import jav ...

  8. Java程序中不通过hadoop jar的方式访问hdfs

      一般情况下,我们使用Java访问hadoop distributed file system(hdfs)使用hadoop的相应api,添加以下的pom.xml依赖(这里以hadoop2.2.0版本 ...

  9. 访问HDFS报错:org.apache.hadoop.security.AccessControlException: Permission denied

    import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apac ...

随机推荐

  1. webpack 打包一个简单react组件

    安装Webpack,并加载一个简单的React组件 全局的npm模块安装: npm install -g webpack 安装jsx-loader npm install --save-dev jsx ...

  2. HashMap的内部实现机制,Hash是怎样实现的,什么时候ReHash

    1.HashMap的内部实现机制 HashMap是对数据结构中哈希表(Hash Table)的实现,Hash表又叫散列表.Hash表是根据关键码Key来访问其对应的值Value的数据结构,它通过一个映 ...

  3. [Android]依赖注入框架google的dagger

    分享一下Android依赖注入框架--Google升级版Dagger2框架 Google的Dagger2是对上一版squareup的Dagger改版,话不多说直接上项目代码. Dagger2源码 Da ...

  4. 使用VisualVM分析性能

    性能分析神器VisualVM VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量 ...

  5. rinetd

    1.安装 tar zxvf rinetd.tar.gz    make    make install 2.设置 vi /etc/rinetd.conf 0.0.0.0 8080 172.19.94. ...

  6. Android Activity task 相关属性

    所谓的 task ,是指用户完成某一项任务时与之交互的一组 Activity.比如用户要向开发者汇报 bug,先打开程序主页,然后打开关于页面,再点击报告 bug 按钮,打开编辑邮件页面.当前这三个 ...

  7. IOS UIAlertController 使用方法

    在很多种语言中,alert都表示弹窗操作,弹窗功能非常有用,不仅可以用于正式的app功能中,也可以在调试中使用.在OC中,UIAlertController类用来控制弹窗操作.在IOS 8.0之前, ...

  8. 在线图片压缩后以ImageIO 流的形式 设置大小显示指定页面

    1.Servlet   代码 public class ZoomImgServlet extends HttpServlet implements Servlet { public void init ...

  9. tab+tab

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. angularjs服务-service

    Service 的特性 ①service都是单例的 ②service由$injector 负责实例化 ③service在整个应用的声明周期中存在,可以用来共享数据 ④在需要使用的地方利用依赖注入ser ...