hdfs c语言 windows,小白必冒泡——C语言操作hdfs

需求

在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挪用关系

如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习,也可以私信:资料 您的举手之劳,就是对小编最好的支持,很是感激!

更多内容回复查看:

游客,如果您要查看本帖隐藏内容请回复

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值