【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 ...
随机推荐
- 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)
题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...
- spark 2.0 中 pyspark 对接 Ipython
pyspark 2.0 对接 ipython 在安装spark2.0 后,以往的对接ipython方法失效,会报如下错错误: 因为在spark2.0后对接ipython的方法进行了变更我们只需要在py ...
- 【生活没有希望】poj1273网络流大水题
你不能把数据规模改大点吗= =我优化都不加都过了 #include <cstdio> #define INF 2147483647 int n,m,ans,x,y,z,M; ],l[],f ...
- 谷歌浏览器如何查看或获取Cookie字符串
注:此博客仅供非web开发人员查看,以下内容都基于谷歌浏览器. 在网页空白处点击鼠标右键,在弹出菜单中选择[审查元素],可以看到网页下方出现审查元素相关界面. 在审查元素相关界面,点击[Network ...
- spring3.0使用annotation完全代替XML(三)
很久之前写过两篇博客: spring3.0使用annotation完全代替XML spring3.0使用annotation完全代替XML(续) 用java config来代替XML,当时还遗留下一些 ...
- JAVA自定义注解
在学习使用Spring和MyBatis框架的时候,使用了很多的注解来标注Bean或者数据访问层参数,那么JAVA的注解到底是个东西,作用是什么,又怎样自定义注解呢?这篇文章,即将作出简单易懂的解释. ...
- normalize.css入门和下载
CSS Reset 是革命党,CSS Reset 里最激进那一派提倡不管你小子有用没用,通通给我脱了那身衣服,凭什么你 body 出生就穿一圈 margin,凭什么你姓 h 的比别人吃得胖,凭什么你 ...
- python setup.py 管理
发布项目遇到了坑……特此记录. How to write setup.py: https://docs.python.org/2/distutils/setupscript.html Setup.py ...
- ios设备中openGL所支持的最大纹理尺寸
这几天碰到一个在iphone4上显示图片未黑色矩形的bug,在其他机器上都正常 最后发现是图片打包尺寸的关系,iphone4无法读取2048以上大小的单个图片,所以其中的图片都显示成了黑色,希望对碰到 ...
- JSON详解
首先要知道JSON是一种轻量级的数据格式,不是一种编程语言,因此其他语言也可以使用. 一.JSON语法 JSON语法可以表现为下面三种值: 1.简单值:字符串.数值.布尔值和null,如"h ...