【hadoop摸索系列】记录使用libhdfs访问hdfs的关键问题
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的关键问题的更多相关文章
- Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统
前言 我们知道HDFS集群中,所有的文件都是存放在DN的数据块中的.那我们该怎么去查看数据块的相关属性的呢?这就是我今天分享的内容了 一.HDFS中数据块概述 1.1.HDFS集群中数据块存放位置 我 ...
- Hadoop通过路径和和链接访问HDFS
如果既想在Hadoop服务器本地可以通过绝对路径如"/user/hadoop"方式访问hdfs,也想通过"hdfs://local host:9000/user/hado ...
- Hadoop(五)搭建Hadoop与Java访问HDFS集群
前言 上一篇详细介绍了HDFS集群,还有操作HDFS集群的一些命令,常用的命令: hdfs dfs -ls xxx hdfs dfs -mkdir -p /xxx/xxx hdfs dfs -cat ...
- Hadoop(五)搭建Hadoop客户端与Java访问HDFS集群
阅读目录(Content) 一.Hadoop客户端配置 二.Java访问HDFS集群 2.1.HDFS的Java访问接口 2.2.Java访问HDFS主要编程步骤 2.3.使用FileSystem A ...
- 配置伪分布模式下的hadoop以及采用fuse-dfs来访问HDFS
实验目标 配置环境的主要目的是得到HDFS的客户端fuse-dfs的IO性能.本来的服务器上没有任何环境,因此安装均是从无到有的.系统是Ubuntu server 14.04 amd64.整个过程参考 ...
- hadoop学习记录(一)HDFS
hadoop的灵感源于谷歌,最初目的是解决传统数据库处理数据成本高和速度慢的问题. hadoop两个核心项目是HDFS(hadoop分布式文件系统)和MapReduce. HDFS用来实现数据的存储, ...
- 【Hadoop】HA 场景下访问 HDFS JAVA API Client
客户端需要指定ns名称,节点配置,ConfiguredFailoverProxyProvider等信息. 代码示例: package cn.itacst.hadoop.hdfs; import jav ...
- Java程序中不通过hadoop jar的方式访问hdfs
一般情况下,我们使用Java访问hadoop distributed file system(hdfs)使用hadoop的相应api,添加以下的pom.xml依赖(这里以hadoop2.2.0版本 ...
- 访问HDFS报错:org.apache.hadoop.security.AccessControlException: Permission denied
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apac ...
随机推荐
- C# 向listbox添加大量数据项的实践心得
使用 ListBox.Items.Add 方法添加项时,可以使用 BeginUpdate 方法,以防止每次向列表添加项时控件都重新绘制 ListBox.完成向列表添加项的任务后,调用 EndUpdat ...
- C程序语法(无左递归)
<程序> -〉 <外部声明> | <函数定义><外部声明> -〉<头文件> | <变量> | <结构体> <头 ...
- Linux Crontab语法
Crontab语法 Lists 链表值 : 逗号,表示并列,要依次序;Examples:"1,2,5,9", "0-4,8-12". Ranges of num ...
- The World's Only Advanced Operating System
The World's Only Advanced Operating System
- Debian 8 jessie, OpenSSH ssh connection server responded Algorithm negotiation failed
安装了debian 8.5 就出问题了. root@debian8:~# lsb_release -aNo LSB modules are available.Distributor ID: Debi ...
- bzoj 2563: 阿狸和桃子的游戏
开始写了一些东西但是后来浏览器挂了就没有存下来简直!!!!!!!!!!!!!QAQ 不想再写一遍了...总之是简单贪心. #include <iostream> #include < ...
- Swap Nodes in Pairs
Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2-& ...
- VS2012中丢失ArcGIS模板的解决方法
VS2012中丢失ArcGIS模板的解决方法 由于ArcGIS10.0(for .NET)默认是用VS2010作为开发工具的,所以在先安装VS2012后装ArcGIS10.0 桌面版及ArcObjec ...
- web应用程序
1.web应用程序和网站的区别 应用程序有两种模式C/S.B/S.C/S是客户端/服务器端程序,也就是说这类程序一般独立运行.而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助IE等浏览器来 ...
- Skyshop: Image-Based Lighting Tools & Shaders插件调整反射光不明显的模型
在Skyshop插件中,使用类似不锈钢等材质的模型,实时反光效果非常好,如果是其他反光不明显的模型,如砖头,建筑等,这时候就需要调整模型的Shader的高光贴图了. 如官方例子中的用砖块组成的柱子,反 ...