Hadoop-2.6.0上的C的API訪问HDFS
在通过Hadoop-2.6.0的C的API訪问HDFS的时候,编译和执行出现了不少问题,花费了几天的时间,上网查了好多的资料,最终还是把问题给攻克了
參考文献:http://m.blog.csdn.net/blog/Aquester/25242215
系统:CentOS 6.6,hadoop-2.6.0, 在hadoop集群的datanode机器上进行
例子代码来源官方文档中的CAPI libhdfs:
#include"hdfs.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char **argv) {
hdfsFS fs =hdfsConnect("10.25.100.130", 9000); //在这里做了一点改动
const char* writePath ="/tmp/testfile.txt";
hdfsFile writeFile = hdfsOpenFile(fs,writePath, O_WRONLY|O_CREAT, 0, 0, 0);
if(!writeFile) {
fprintf(stderr, "Failed toopen %s for writing!\n", writePath);
exit(-1);
}
char* buffer = "Hello,World!";
tSize num_written_bytes = hdfsWrite(fs,writeFile, (void*)buffer, strlen(buffer)+1);
if (hdfsFlush(fs, writeFile)) {
fprintf(stderr, "Failed to'flush' %s\n", writePath);
exit(-1);
}
hdfsCloseFile(fs, writeFile);
}
接下来就是编译。依照官网上给出的:
How To Link With The Library
See the CMake filefor test_libhdfs_ops.c in the libhdfssource directory (hadoop-hdfs-project/hadoop-hdfs/src/CMakeLists.txt) or something like: gcc above_sample.c -I$HADOOP_HDFS_HOME/include
-L$HADOOP_HDFS_HOME/lib/native-lhdfs -o above_sample
试用另外一种:
[root@node04 ~]# gcc above_sample.c -I/home/hadoop/hadoop-2.6.0/include/ -L /home/hadoop/hadoop-2.6.0/lib/native/-lhdfs -o above_sample
能够通过,查了好多资料。非常少有人使用这一种。怎样使用这一种有错误,也能够换用第二种。
我使用的是这一种编译方式:
[root@node04 ~]# gcc above_sample.c -I/home/hadoop/hadoop-2.6.0/include/ -L /home/hadoop/hadoop-2.6.0/lib/native/-lhdfs /usr/java/jdk1.7.0_75/jre/lib/amd64/server/libjvm.so -o above_sample
这两种方法都能够生成一个可运行的文件above_sample
编译通过,能够在执行的时候出现下面错误:
[root@node04 ~]# ./above_sample
./above_sample: error while loading sharedlibraries: libjvm.so: cannot open shared object file: No such file or directory
发生这样的报错的原因是,编译的程序执行期间须要依赖某个共享库,比方上面,write可执行程序须要依赖一个叫“libxxxx.so”的共享库。(动态链接库与静态链接库的差别。请百度相关文档)
在/etc/ld.so.conf中加入路径,然后又一次载入共享库:
首先要找到缺失这个库的存在路径
[root@node04 ~]# find / -name libhdfs.so.0.0.0
/home/hadoop/hadoop-2.6.0/lib/native/libhdfs.so.0.0.0
[root@node04 ~]# find / -name libjvm.so
/usr/java/jdk1.7.0_75/jre/lib/amd64/server/libjvm.so
[root@node04 ~]# vi /etc/ld.so.conf
编辑后例如以下:
include ld.so.conf.d/*.conf
/home/hadoop/hadoop-2.6.0/lib/native/
/usr/java/jdk1.7.0_75/jre/lib/amd64/server/
分别加入了两个路径。每一个路径占一行。
编辑完后,又一次载入库:
[root@node04 ~]# /sbin/ldconfig –v
这一种方法是是针对整个系统,启动时就载入。
然后我们就继续运行可运行文件:
[root@node04 ~]# ./above_sample
loadFileSystems error:
(unable to get stack trace for java.lang.NoClassDefFoundError exception: ExceptionUtils::getStackTrace error.)
hdfsBuilderConnect(forceNewInstance=0, nn=172.25.40.171, port=9001, kerbTicketCachePath=(NULL), userName=(NULL)) error:
(unable to get stack trace for java.lang.NoClassDefFoundError exception: ExceptionUtils::getStackTrace error.)
经过查找资料发现:
上述信息中的关键项是“NoClassDefFoundError”和“ExceptionUtils”。也就是找不到ExceptionUtils,一般可判断是由于找不到对应的jar文件,Google搜索“ExceptionUtils jar”,发现“ExceptionUtils”应当是在包apache-commons-lang.jar中。
进一步用Google去搜索“apache-commons-lang.jar”,找到下载网址:http://commons.apache.org/proper/commons-lang/download_lang.cgi,上面能够下载commons-lang3-3.3.2-bin.tar.gz,解压后就能够看到commons-lang3-3.3.2.jar。
hadoop的二进制安装包,应当自带了这个文件。通过努力。在hadoop安装文件夹下的share/hadoop/tools/lib子文件夹下发现了commons-lang-2.6.jar,应当就是它了
然后改动我们的环境变量。在我们配置java环境变量之后加入hadoop的环境变量
[root@node04 ~]# vi /etc/profile
unset i
unset -f pathmunge
export JAVA_HOME=/usr/java/jdk1.7.0_75
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/rt.jar
PATH=$PATH:$JAVA_HOME/bin
HADOOP_HOME=/home/hadoop/hadoop-2.6.0
exportPATH=$HADOOP_HOME/bin:$PATH
exportCLASSPATH=.:$HADOOP_HOME/share/hadoop/common/lib/commons-lang-2.6.jar
又一次执行程序。ExceptionUtils错误消失了,但遇到新错误:
loadFileSystems error:
java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FileSystem
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.fs.FileSystem
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
hdfsBuilderConnect(forceNewInstance=0, nn=10.25.100.130, port=9000, kerbTicketCachePath=(NULL), userName=(NULL)) error:
java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
仍然是NoClassDefFoundError错误,原因应当是一样的:classpath中漏了哪个文件夹。这就要看FileSystem和Configuration在哪个jar中了。尝试将hadoop-common-2.6.0.jar和commons-configuration-1.6.jar直接增加到classpath:
[root@node04~]# vi /etc/profile
export=CLASSPATH=.:$HADOOP_HOME/share/hadoop/common/lib/commons-lang-2.6.jar:/home/hadoop/hadoop-2.6.0/share/hadoop/common/hadoop-common-2.6.0.jar:/home/#hadoop/hadoop-2.6.0/share/hadoop/common/lib/commons-configuration-1.6.jar:/home/hadoop/hadoop-2.6.0/share/hadoop/common/lib/commons-logging-1.1.3.jar:/#home/hadoop/hadoop-2.6.0/share/hadoop/hdfs/hadoop-hdfs-2.6.0.jar
发现FileSystem和Configuration错误消失了,说明有效:
loadFileSystems error:
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.apache.hadoop.fs.FileSystem.<clinit>(FileSystem.java:95)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
。
。。。
。
。
。。。。
。。。。。。。
。。。
。。
。。
。。。
。。。。。。
。
。
。。
。。。。。。。。
。。。。
。。。。。。。。。。
。。。
。。
。
。
。。
经过查找资料发现,还是类似的错误,这样下会去搞死人。通过上述的一些操作。预计须要将全部的jar文件一个个的将入到classpath中。因为对java不熟悉,也仅仅有先这样做一做了
[root@node04 ~]# find /home/hadoop/hadoop-2.6.0/share/ -name *.jar|awk '{ printf("exportCLASSPATH=%s:$CLASSPATH\n", $0); }'
将查找到的所有结果所有导入到环境变量中,,将刚才加入的环境变量凝视:
[root@node04 ~]#vi /etc/profile
unset i
unset -fpathmunge
export JAVA_HOME=/usr/java/jdk1.7.0_75
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/rt.jar
PATH=$PATH:$JAVA_HOME/bin
HADOOP_HOME=/home/hadoop/hadoop-2.6.0
export PATH=$HADOOP_HOME/bin:$PATH
#export=CLASSPATH=.:$HADOOP_HOME/share/hadoop/common/lib/commons-lang-2.6.jar:/home/hadoop/hadoop-2.6.0/share/hadoop/common/hadoop-common-2.6.0.jar:/home/#hadoop/hadoop-2.6.0/share/hadoop/common/lib/commons-configuration-1.6.jar:/home/hadoop/hadoop-2.6.0/share/hadoop/common/lib/commons-logging-1.1.3.jar:/#home/hadoop/hadoop-2.6.0/share/hadoop/hdfs/hadoop-hdfs-2.6.0.jar
exportCLASSPATH=/home/hadoop/hadoop-2.6.0/share/hadoop/mapreduce/lib-examples/hsqldb-2.0.0.jar:$CLASSPATH
export CLASSPATH=/home/hadoop/hadoop-2.6.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar:$CLASSPATH
exportCLASSPATH=/home/hadoop/hadoop-2.6.0/share/hadoop/mapreduce/hadoop-mapreduce-client-common-2.6.0.jar:$CLASSPATH
export CLASSPATH=/home/hadoop/hadoop-2.6.0/share/hadoop/mapreduce/hadoop-mapreduce-client-hs-2.6.0.jar:$CLASSPATH
exportCLASSPATH=/home/hadoop/hadoop-2.6.0/share/hadoop/mapreduce/hadoop-mapreduce-client-shuffle-2.6.0.jar:$CLASSPATH
exportCLASSPATH=/home/hadoop/hadoop-2.6.0/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.0-tests.jar:$CLASSPATH
exportCLASSPATH=/home/hadoop/hadoop-2.6.0/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.0.jar:$CLASSPATH
exportCLASSPATH=/home/hadoop/hadoop-2.6.0/share/hadoop/mapreduce/lib/aopalliance-1.0.jar:$CLASSPATH
exportCLASSPATH=/home/hadoop/hadoop-2.6.0/share/hadoop/mapreduce/lib/javax.inject-1.jar:$CLASSPATH
exportCLASSPATH=/home/hadoop/hadoop-2.6.0/share/hadoop/mapreduce/lib/leveldbjni-all-1.8.jar:$CLASSPATH
export CLASSPATH=/home/hadoop/hadoop-2.6.0/share/hadoop/mapreduce/lib/guice-servlet-3.0.jar:$CLASSPATH
。。。。。。。
。
。。。。。。
。。。。
。。
。
。。。。。。。
。
。。。
。。。
。
。。。
。
。
。。。。。
。。。。
。。
。。。
。。。。
。。。
。。。。。。
。。
。
。
。
。
。
。。
。
。。
。
。。。。。
。。。。。。。。
。。。。。
。。。。。。。。。。。。。
。
。
。
。。
。。。。。。。。。。。
。
。
。。。。。
。
。。
。
。
。
。。。。
。。
。。。
。。。。。。。。
。
。
。。。
。。。。。。。。。。。
。。。。。
。。。。
。。。
。。
。。
。。。。。
。。。
。
。。。。。。。
。。
。。
。。。。。。
。。
。
。。。。
。。。。。
。
。。。
。
。
。。
。
。
。。。
搞定之后,然后继续执行
[root@node04 ~]# ./above_sample
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in[jar:file:/home/hadoop/hadoop-2.6.0/share/hadoop/kms/tomcat/webapps/kms/WEB-INF/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in[jar:file:/home/hadoop/hadoop-2.6.0/share/hadoop/httpfs/tomcat/webapps/webhdfs/WEB-INF/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in[jar:file:/home/hadoop/hadoop-2.6.0/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for anexplanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
2015-08-13 22:12:53,012 WARN [main] util.NativeCodeLoader (NativeCodeLoader.java:<clinit>(62))- Unable to load native-hadoop library for your platform... using builtin-javaclasses where applicable
2015-08-13 22:12:57,780 INFO [Thread-4] hdfs.DFSClient(DFSOutputStream.java:createBlockOutputStream(1471)) - Exception increateBlockOutputStream
java.io.IOException: Bad connect ack with firstBadLink as10.25.100.132:50010
atorg.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1460)
atorg.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1361)
atorg.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:588)
2015-08-13 22:12:57,785 INFO [Thread-4] hdfs.DFSClient(DFSOutputStream.java:nextBlockOutputStream(1364)) - AbandoningBP-611125423-10.25.100.130-1439079666020:blk_1073741846_1022
2015-08-13 22:12:57,801 INFO [Thread-4] hdfs.DFSClient (DFSOutputStream.java:nextBlockOutputStream(1368))- Excluding datanode 10.25.100.132:50010
[root@node04 ~]#
突然发现,成功了,先别高兴的太早,让我们先看看hadoop上有没有创建上传一个文本文档testfile.txt
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
经过查找,恭喜你,成功了!
!。
Hadoop-2.6.0上的C的API訪问HDFS的更多相关文章
- Hadoop-2.6.0上调用C的API实现相似云盘的功能
Hadoop-2.6.0上调用C的API实现类似云盘的功能(上传.下载.删除,重命名) 測试系统:CentOS6.6, hadoop-2.6.0 本次測试是调用hadoop下的C的API来訪问HDFS ...
- Hadoop HDFS (3) JAVA訪问HDFS
如今我们来深入了解一下Hadoop的FileSystem类. 这个类是用来跟Hadoop的文件系统进行交互的.尽管我们这里主要是针对HDFS.可是我们还是应该让我们的代码仅仅使用抽象类FileSyst ...
- Hadoop HDFS (3) JAVA訪问HDFS之二 文件分布式读写策略
先把上节未完毕的部分补全,再剖析一下HDFS读写文件的内部原理 列举文件 FileSystem(org.apache.hadoop.fs.FileSystem)的listStatus()方法能够列出一 ...
- hadoop 2.6.0上安装sqoop-1.99.6-bin-hadoop200
第一步:下载sqoop-1.99.6-bin-hadoop200.tar.gz 地址:http://www.eu.apache.org/dist/sqoop/1.99.6/ 第二步:将下载好的sqo ...
- hadoop 2.2.0 关于map和reduce的个数的设置
关于hadoop中的map过程,我的理解是每一个map系统会开启一个JVM进程来处理,map之间相互并行,map函数内串行.这样的想法是否正确? 由于想在hadoop集群上算一个初始输入数据不多,但是 ...
- mac OS X Yosemite 上编译hadoop 2.6.0/2.7.0及TEZ 0.5.2/0.7.0 注意事项
1.jdk 1.7问题 hadoop 2.7.0必须要求jdk 1.7.0,而oracle官网已经声明,jdk 1.7 以后不准备再提供更新了,所以趁现在还能下载,赶紧去down一个mac版吧 htt ...
- 64位CentOS上编译 Hadoop 2.2.0
下载了Hadoop预编译好的二进制包,hadoop-2.2.0.tar.gz,启动起来后.总是出现这样的警告: WARN util.NativeCodeLoader: Unable to load n ...
- CentOS 64位上编译 Hadoop 2.6.0
Hadoop不提供64位编译好的版本号,仅仅能用源代码自行编译64位版本号. 学习一项技术从安装開始.学习hadoop要从编译開始. 1.操作系统编译环境 yum install cmake lzo- ...
- Hadoop 3.1.0 在 Ubuntu 16.04 上的安装过程
安装过程主要参考官方文档: http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/SingleCluster. ...
随机推荐
- List operations
The + operator concatenates lists: Similarly, the * operator repeats a list a given number of items: ...
- 搭建Hadoop的全分布模式
此教程仅供参考 注意:此文档目的是为了本人方便以后复习,不适合当教程,以免误导萌新... 1.安装三台Linux2.在每台机器上安装JDK3.配置每台机器的免密码登录 (*) 生成每台机器的公钥和私钥 ...
- C语言基础-第六章
数组和字符串 1.一维数组 数组当中最简单的数据 声明: 类型说明符 数组名[常量表达式] int a[3];说明a的长度为3,那么给a赋值的语句是:a={1,2,3}; 2.多维数组 2.1 二维数 ...
- List<List<model>>如何更快捷的取里面的model?
访问接口返回数据类型为List<List<model>>,现在想将其中的model插入数据库,感觉一点点循环有点傻,0.0...,各位有没有其他的方法? List<Lis ...
- IHttpHandler的学习(0-2)
这个IHttpHandler,要想到asp.net生命周期 ,想到哪个从你发起请求开始,这个请求通过HttpModule------>IHttpHandler的: 执行HttpModule的一系 ...
- vue 中使用querySelect 封装的万能选择器
function query (el) { if (typeof el === 'string') { var selector = el; el = document.querySelector(e ...
- 01背包-第k优解
The title of this problem is familiar,isn't it?yeah,if you had took part in the "Rookie Cup&quo ...
- core组件进阶
访问图像像素 存储方式 BGR连续存储有助于提升图像扫描速度. isContinuous()判断是否是连续存储. 颜色空间缩减 仅用这些颜色中具有代表性的很小的部分,就足以达到同样的效果. 将现有颜色 ...
- [Spark源代码剖析] DAGScheduler提交stage
转载请标明出处:http://blog.csdn.net/bigbigdata/article/details/47310657 DAGScheduler通过调用submitStage来提交stage ...
- 新一代企业即时通信系统 -- 傲瑞通(OrayTalk)
傲瑞通(OrayTalk)是我们为企业专门打造的新一代企业即时通讯平台,功能强大丰富.像组织结构.文字/语音/视频会话.文件传送.远程协助.消息记录等功能都有,而且留有接口可与企业遗留系统进行集成. ...