需求
在c++程序中操作hdfs实现数据的读取和写入
写一个简单的c程序,将一句话写到hdfs上的一个文件中,并查看内容是否写进去了
虚拟机:centos6.7
jdk :1.8
gcc: 4.8.5
hadoop:hadoop-2.7.6.tar.gz 、文档doc
思路
安装hadoop
在hdfs上建立一个文件:/liang/hello.txt
编写writepro.c程序,程序中挪用hdfs API将“Hello, World!”写到上述文件中。
编译writepro.c成目标文件writepro
运行writepro
将hdfs上的/liang/hello.txt内容拷贝到本地,并使用cat命令查看内容。(完)
安装并运行
解压hadoop-2.7.6.tar.gz到/usr路径下
在etc/profile中配置HADOOP_HOME和 LD_LIBRARY_PATHJAVA_HOME=/usr/java/jdk1.8.0_151GCC_HOME=/usr/local/gcc-4.8.5HADOOP_HOME=/usr/hadoop-2.7.6PATH=$HADOOP_HOME/bin:$GCC_HOME/bin:$JAVA_HOME/bin:$PATHexport HADOOP_HOME GCC_HOME JAVA_HOME PATHexport LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64/server
在hdfs上建文件
伪散布式运行:Pseudo-Distributed Operation
运行成功在浏览器进入 http://ip:50070 页面。(要开启linux上的50070端口)
在hdfs上建立/liang/hello.txt文件
小白必冒泡——C语言操作hdfs-1.jpg (33.84 KB, 下载次数: 0)
2018-4-28 18:58 上传
小白必冒泡——C语言操作hdfs-2.jpg (17.47 KB, 下载次数: 0)
2018-4-28 18:58 上传
image.png#建立liang目录hdfs dfs -mkdir /liang#在本地建立hello.txt文件touch hello.txt#将hello.txt发送到/liang目录下hdfs dfs -put hello.txt /liang
验证文件已建立
小白必冒泡——C语言操作hdfs-3.jpg (22.97 KB, 下载次数: 0)
2018-4-28 18:58 上传
image.png
编写writepro.c程序
官方c api文档:C API libhdfs
博客文档:c++ 操作HDFS、c++ 操作HDFS
编程程序writepro.c,并将文件上传到linux上。//hdfs操作api头文件#include "hdfs.h"#include int main(int argc, char **argv) { //连接hdfs hdfsFS fs = hdfsConnect("default", 0); //要写的文件路径 const char* writePath = "/liang/hello.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); } //要写的内容 char* buffer = "Hello, World!"; //开始写内容 tSize num_written_bytes = hdfsWrite(fs, writeFile, (void*)buffer, strlen(buffer)+1); //flush一下 if (hdfsFlush(fs, writeFile)) { fprintf(stderr, "Failed to 'flush' %s\n", writePath); exit(-1); } //关闭连接 hdfsCloseFile(fs, writeFile);}
使用gcc编译成writepro
要编译成执行文件,就需要指定hdfs.h头文件的位置,以及头文件中声明的函数的实现(动态链接库libhdfs.so)的位置。动态链接库使用JNI技术实现了c挪用java。
hdfs.h头文件位置在$HADOOP_HOME/include 下,使用到的动态链接库在$HADOOP_HOME/lib/native目录下。
程序运行过程中需要挪用动态链接库,而动态链接库在磁盘中,而程序在内存中,速度不一致,所以要先将动态链接库先加载到高速缓存中。
动态链接库加载到缓存中
知识点:idconfig与/etc/ld.so.conf
idconfig会将id.so.conf中配置的目录下的动态链接库加载到高速缓存中
打开ld.so.conf,添加$HADOOP_HOME/lib/native目录
小白必冒泡——C语言操作hdfs-4.jpg (11.36 KB, 下载次数: 0)
2018-4-28 18:58 上传
使上面配置其作用
配置动态链接库#下面执行完后不会有任何信息显示idconfig
可以使用下面命令查看所有被加载的动态链接库idconfig -p显示格式:函数库名称 =》该函数库实际路径
编译成writepro文件
gcc writepro.c -I$HADOOP_HOME/include -L$HADOOP_HOME/lib/native -lhdfs -o writepro
-I指定"hdfs.h"头文件位置,-L指定使用到的动态链接库。
编译会有警告。
运行writepro
参考文档:CLASSPATH
libhdfs.so动态链接库实现了c挪用hdfs java程序,即其依赖于java,所以hadoop的jar包和相关配置文件也就需要加载到内存中。为此在运行前需要配置CLASSPAT环境变量,这样在程序运行过程中就可以根据CLASSPATH指定的路径去加载jar和相关配置到内存,以提供c通过JNI挪用。
配置临时classpath#hadoop classpath --glob命令会生成classpath所需内容[root@CentOS /]# export CLASSPATH=`hadoop classpath --glob`
运行程序[root@CentOS /]# ./usr/hello_hdfs 18/04/26 23:59:47 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
执行会有一个警告。
查看内容是否写入
将hdfs上hello.txt内容读取到helloresult.txt中[root@CentOS /]# hadoop fs -get /liang/hello.txt helloresult.txt[root@CentOS /]# cat helloresult.txtHello, World!
总结
不知道对不对
小白必冒泡——C语言操作hdfs-5.jpg (22.44 KB, 下载次数: 0)
2018-4-28 18:58 上传
c-hdfs挪用关系
如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习,也可以私信:资料 您的举手之劳,就是对小编最好的支持,很是感激!
更多内容回复查看:
游客,如果您要查看本帖隐藏内容请回复