[zz]HDFS文件读写 使用c api

1.用haddop提供的C API to HDFS来实现文件写入到HDFS中。过程中主要是在配置环境花了点时间

参考官网:http://hadoop.apache.org/common/docs/r0.20.203.0/libhdfs.html

不用重新编译直接用$HADOOP_HOME/c++/Linux-Linux-amd64-64/lib即可,若要编译libhdfs,在hadoop顶层目录运行:ant compile-c++-libhdfs -Dislibhdfs=true

API主要可以去hadoop软件包解压目录中查看hdfs.h定义的一些已实现的函数

一门语言的初学入门例子,一般都是“hello,world”,下面看写hdfs文件代码,文件hello_hdfs.c

 1 #include "hdfs.h"
 2 
 3  int main(int argc, char **argv) {
 4 
 5     hdfsFS fs = hdfsConnect("127.0.0.1", 9000);
 6     const char* writePath = "/tmp/testfile.txt";
 7     hdfsFile writeFile = hdfsOpenFile(fs, writePath, O_WRONLY|O_CREAT, 0, 0, 0);
 8     if(!writeFile) {
 9           fprintf(stderr, "Failed to open %s for writing!\n", writePath);
10           exit(-1);
11     }
12     char* buffer = "Hello, World!";
13     tSize num_written_bytes = hdfsWrite(fs, writeFile, (void*)buffer, strlen(buffer)+1);
14     if (hdfsFlush(fs, writeFile)) {
15            fprintf(stderr, "Failed to 'flush' %s\n", writePath);
16           exit(-1);
17     }
18    hdfsCloseFile(fs, writeFile);
19  return 0;
20  }

编译命令:

gcc hello_hdfs.c -I${HADOOP_HOME}/src/c++/libhdfs -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux  -L${HADOOP_HOME}/c++/Linux-Linux-amd64-64/lib -lhdfs -L${JAVA_HOME}/jre/lib/amd64/server -ljvm -o hello_hdfs

运行的时候报:error while loading shared libraries: libjvm.so: cannot open shared object file: No such file or directory
这个是LD_LIBRARY_PATH 没有设置:


这个是我本机上面的配置: /etc/profile(Ubuntu有一个bug,在这里设置的所有环境变量都是all user wide,除了LD_LIBRARY_PATH,你必须重新source一遍才行)

export JAVA_HOME=/usr/lib/jvm/java-6-sun
export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64/server
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/home/hadoop/hadoop-0.20.203.0
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$HADOOP_HOME/hadoop-core-0.20.203.0.jar:$HADOOP_HOME/lib/commons-logging-1.1.1.jar:$HADOOP_HOME/lib/commons-configuration-1.6.jar:$HADOOP_HOME/lib/commons-lang-2.4.jar

查看文件是否写入,bin/hadoop fs -ls /tmp,或直接拷到本地以便查看:bin/hadoop fs -get /tmp/testfile.txt /home/test

如果写入不成功,一定要检查启动hadoop的是否与运行这个程序的是同一个用户!

原文地址:https://www.cnblogs.com/zhangzhang/p/2852496.html