Hadoop通过c语言API访问hdfs
2014-06-18 11:24
330 查看
Hadoop给我们提供了使用c语言访问hdfs的API,下面进行简要介绍:
环境:ubuntu14.04 hadoop1.0.1 jdk1.7.0_51
访问hdfs的函数主要定义在hdfs.h文件中,该文件位于hadoop-1.0.1/src/c++/libhdfs/文件夹下,而相应的库文件是位于hadoop-1.0.1/c++/Linux-amd64-64/lib/目录下的libhdfs.so,另外要访问hdfs还需要依赖jdk的相关API,头文件目录包括jdk1.7.0_51/include/和jdk1.7.0_51/include/linux/,库文件为jdk1.7.0_51/jre/lib/amd64/server/目录下的libjvm.so,这些库和包含目录都要在编译连接时给出。下面是一段简单的源程序main.c:
程序比较简单,重要的地方都有注释,这里就不一一解释了。程序所实现的主要功能为在hdfs的/user/root/output/目录下新建一名称为testfile.txt的文件,并写入Hello, World!,然后将Hello, World!从该文件中读出并打印出来。如果你的hdfs中没有/user/root/output/目录,则需要你新建一个或将路径改为一个存在的路径。
下面给出我系统中的编译连接指令:
g++ main.cpp -I /root/hadoop-1.0.1/src/c++/libhdfs/ -I /usr/java/jdk1.7.0_51/include/ -I /usr/java/jdk1.7.0_51/include/linux/ -L /root/hadoop-1.0.1/c++/Linux-amd64-64/lib/ -lhdfs -L /usr/java/jdk1.7.0_51/jre/lib/amd64/server/ -ljvm -o hdfs-test
其中,g++为编译指令,-I后面的是头文件包含路径,-L后面的是要连接的库文件路径-lhdfs和-ljvm是要连接的具体库名称。具体路径需要换成你系统中的相应路径。至此,编译应该就可以完成了。但运行时回报找不到libhdfs.so.0和libjvm.so。解决办法是将相应库文件所在目录追加到到/etc/ld.so.conf文件中,然后执行ldconfig命令,这相当于在系统中注册了一下相应的库,运行时就不会找不到了。
环境:ubuntu14.04 hadoop1.0.1 jdk1.7.0_51
访问hdfs的函数主要定义在hdfs.h文件中,该文件位于hadoop-1.0.1/src/c++/libhdfs/文件夹下,而相应的库文件是位于hadoop-1.0.1/c++/Linux-amd64-64/lib/目录下的libhdfs.so,另外要访问hdfs还需要依赖jdk的相关API,头文件目录包括jdk1.7.0_51/include/和jdk1.7.0_51/include/linux/,库文件为jdk1.7.0_51/jre/lib/amd64/server/目录下的libjvm.so,这些库和包含目录都要在编译连接时给出。下面是一段简单的源程序main.c:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "hdfs.h" int main(int argc, char **argv) { /* * Connection to hdfs. */ hdfsFS fs = hdfsConnect("127.0.0.1", 9000); if(!fs) { fprintf(stderr, "Failed to connect to hdfs.\n"); exit(-1); } /* * Create and open a file in hdfs. */ const char* writePath = "/user/root/output/testfile.txt"; hdfsFile writeFile = hdfsOpenFile(fs, writePath, O_WRONLY|O_CREAT, 0, 0, 0); if(!writeFile) { fprintf(stderr, "Failed to open %s for writing!\n", writePath); exit(-1); } /* * Write data to the file. */ const char* buffer = "Hello, World!"; tSize num_written_bytes = hdfsWrite(fs, writeFile, (void*)buffer, strlen(buffer)+1); /* * Flush buffer. */ if (hdfsFlush(fs, writeFile)) { fprintf(stderr, "Failed to 'flush' %s\n", writePath); exit(-1); } /* * Close the file. */ hdfsCloseFile(fs, writeFile); unsigned bufferSize=1024; const char* readPath = "/user/root/output/testfile.txt"; hdfsFile readFile = hdfsOpenFile(fs, readPath, O_RDONLY, bufferSize, 0, 0); if (!readFile) { fprintf(stderr,"couldn't open file %s for reading\n",readPath); exit(-2); } // data to be written to the file char* rbuffer = (char*)malloc(sizeof(char) * (bufferSize+1)); if(rbuffer == NULL) { return -2; } // read from the file tSize curSize = bufferSize; for (; curSize == bufferSize;) { curSize = hdfsRead(fs, readFile, (void*)rbuffer, curSize); rbuffer[curSize]='\0'; fprintf(stdout, "read '%s' from file!\n", rbuffer); } free(rbuffer); hdfsCloseFile(fs, readFile); /* * Disconnect to hdfs. */ hdfsDisconnect(fs); return 0; }
程序比较简单,重要的地方都有注释,这里就不一一解释了。程序所实现的主要功能为在hdfs的/user/root/output/目录下新建一名称为testfile.txt的文件,并写入Hello, World!,然后将Hello, World!从该文件中读出并打印出来。如果你的hdfs中没有/user/root/output/目录,则需要你新建一个或将路径改为一个存在的路径。
下面给出我系统中的编译连接指令:
g++ main.cpp -I /root/hadoop-1.0.1/src/c++/libhdfs/ -I /usr/java/jdk1.7.0_51/include/ -I /usr/java/jdk1.7.0_51/include/linux/ -L /root/hadoop-1.0.1/c++/Linux-amd64-64/lib/ -lhdfs -L /usr/java/jdk1.7.0_51/jre/lib/amd64/server/ -ljvm -o hdfs-test
其中,g++为编译指令,-I后面的是头文件包含路径,-L后面的是要连接的库文件路径-lhdfs和-ljvm是要连接的具体库名称。具体路径需要换成你系统中的相应路径。至此,编译应该就可以完成了。但运行时回报找不到libhdfs.so.0和libjvm.so。解决办法是将相应库文件所在目录追加到到/etc/ld.so.conf文件中,然后执行ldconfig命令,这相当于在系统中注册了一下相应的库,运行时就不会找不到了。
相关文章推荐
- Hadoop通过C的API访问HDFS
- Hadoop通过C的API访问HDFS
- 很好-Hadoop通过C的API访问HDFS
- hadoop 集群 远程访问 mysql(通过sqoop从远程数据库服务器向hdfs迁移数据) 屡次失败的原因
- 通过HDFS的API访问文件系统的例子
- Python通过thrift访问hadoop:报错java.lang.IllegalArgumentException: Wrong FS: hdfs:/ expected file:///
- Hadoop通过url地址访问HDFS
- 使用Hadoop的JAVA API远程访问HDFS
- Java程序中不通过hadoop jar的方式访问hdfs
- 通过 HDFS 的 API 访问文件系
- hadoop学习;hdfs操作;运行抛出权限异常: Permission denied;api查看源码方法;源码不停的向里循环;抽象类通过debug查找源码
- hadoop学习笔记--5.HDFS的java api接口访问
- C语言中通过LUA API访问LUA脚本变量的简单例子
- hadoop之HDFS:通过Java API访问HDFS
- 使用Hadoop API访问Kerberos 安全HDFS
- Hadoop学习--通过API访问本地文件系统--day04
- Hadoop-2.6.0上的C的API访问HDFS
- 通过hadoopAPI访问文件
- 通过JAVA—API访问HDFS 上的文件
- 通过hadoopAPI访问文件