Hadoop通过c语言API访问hdfs

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:

  1 #include <stdio.h>
  2
  3 #include <stdlib.h>
  4
  5 #include <string.h>
  6
  7 #include "hdfs.h"
  8
  9
 10
 11 int main(int argc, char **argv)
 12
 13 {
 14
 15     /*
 16
 17      * Connection to hdfs.
 18
 19      */
 20
 21     hdfsFS fs = hdfsConnect("127.0.0.1", 9000);
 22
 23     if(!fs)
 24
 25     {
 26
 27         fprintf(stderr, "Failed to connect to hdfs.\n");
 28
 29         exit(-1);
 30
 31     }
 32
 33     /*
 34
 35      * Create and open a file in hdfs.
 36
 37      */
 38
 39     const char* writePath = "/user/root/output/testfile.txt";
 40
 41     hdfsFile writeFile = hdfsOpenFile(fs, writePath, O_WRONLY|O_CREAT, 0, 0, 0);
 42
 43     if(!writeFile)
 44
 45     {
 46
 47         fprintf(stderr, "Failed to open %s for writing!\n", writePath);
 48
 49         exit(-1);
 50
 51     }
 52
 53     /*
 54
 55      * Write data to the file.
 56
 57      */
 58
 59     const char* buffer = "Hello, World!";
 60
 61     tSize num_written_bytes = hdfsWrite(fs, writeFile, (void*)buffer, strlen(buffer)+1);
 62
 63
 64
 65     /*
 66
 67      * Flush buffer.
 68
 69      */
 70
 71     if (hdfsFlush(fs, writeFile))
 72
 73     {
 74
 75         fprintf(stderr, "Failed to ‘flush‘ %s\n", writePath);
 76
 77         exit(-1);
 78
 79     }
 80
 81
 82
 83     /*
 84
 85      * Close the file.
 86
 87      */
 88
 89     hdfsCloseFile(fs, writeFile);
 90
 91
 92
 93     unsigned bufferSize=1024;
 94
 95     const char* readPath = "/user/root/output/testfile.txt";
 96
 97     hdfsFile readFile = hdfsOpenFile(fs, readPath, O_RDONLY, bufferSize, 0, 0);
 98
 99     if (!readFile) {
100
101         fprintf(stderr,"couldn‘t open file %s for reading\n",readPath);
102
103         exit(-2);
104
105     }
106
107     // data to be written to the file
108
109     char* rbuffer = (char*)malloc(sizeof(char) * (bufferSize+1));
110
111     if(rbuffer == NULL) {
112
113         return -2;
114
115     }
116
117
118
119     // read from the file
120
121     tSize curSize = bufferSize;
122
123     for (; curSize == bufferSize;) {
124
125         curSize = hdfsRead(fs, readFile, (void*)rbuffer, curSize);
126
127         rbuffer[curSize]=‘\0‘;
128
129         fprintf(stdout, "read ‘%s‘ from file!\n", rbuffer);
130
131     }
132
133
134
135     free(rbuffer);
136
137     hdfsCloseFile(fs, readFile);
138
139     /*
140
141      * Disconnect to hdfs.
142
143      */
144
145     hdfsDisconnect(fs);
146
147
148
149     return 0;
150
151 }

程序比较简单,重要的地方都有注释,这里就不一一解释了。程序所实现的主要功能为在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,布布扣,bubuko.com

时间: 2024-11-09 00:56:07

Hadoop通过c语言API访问hdfs的相关文章

【Hadoop】HA 场景下访问 HDFS JAVA API Client

客户端需要指定ns名称,节点配置,ConfiguredFailoverProxyProvider等信息. 代码示例: package cn.itacst.hadoop.hdfs; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import org.apache.hadoop.conf.Configuration; impor

hadoop 3.1.1 无法访问hdfs(50070)的web界面

1.启动hadoop.然后netstat -nltp|grep 50070,如果,没有找到进程,说明没有配置web界面的端口修改hdfs-site,xml中加上如下配置 如果你用的主机名:端口号,先去检查下/etc/hosts下的主机名的ip,是否配置的和你当前的ip相同,然后重新启动hadoop 2.现在虚拟机内尝试访问hadoop002:50070,如果访问不了,估计是sellinux的问题执行以下命令setenforce 0(设置为permissive模式)接着重新在虚拟机内访问,此时应该

HDFS简介及用C语言访问HDFS接口操作实践

一.概述 近年来,大数据技术如火如荼,如何存储海量数据也成了当今的热点和难点问题,而HDFS分布式文件系统作为Hadoop项目的分布式存储基础,也为HBASE提供数据持久化功能,它在大数据项目中有非常广泛的应用. Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.HDFS是Hadoop项目的核心子项目,是一种具有高容错性.高可靠性.高可扩展性.高吞吐量等特征的分

hadoop的API对HDFS上的文件访问

这篇文章主要介绍了使用hadoop的API对HDFS上的文件访问,其中包括上传文件到HDFS上.从HDFS上下载文件和删除HDFS上的文件,需要的朋友可以参考下hdfs文件操作操作示例,包括上传文件到HDFS上.从HDFS上下载文件和删除HDFS上的文件,大家参考使用吧 复制代码 代码如下:import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.*; import java.io.File;import ja

centos6.5下部署用于生产的hadoop,并使用C语言API连接hadoop

##### ####安装hadoop2.6.0完全分布式集群 ##### ####文件及系统版本: #### hadoop-2.6.0 Java version 1.8.0_77 centos 64位 ####预备 #### 在/home/hadoop/下:mkdir Cloud 把java和hadoop安装包放在/home/hadoop/Cloud下 ####配置静态ip #### master192.168.116.100 slave1192.168.116.110 slave2192.16

Hadoop HDFS (3) JAVA访问HDFS

现在我们来深入了解一下Hadoop的FileSystem类.这个类是用来跟Hadoop的文件系统进行交互的.虽然我们这里主要是针对HDFS,但是我们还是应该让我们的代码只使用抽象类FileSystem,这样我们的代码就可以跟任何一个Hadoop的文件系统交互了.在写测试代码时,我们可以用本地文件系统测试,部署时使用HDFS,只需配置一下,不需要修改代码了. 在Hadoop 1.x以后的版本中引入了一个新的文件系统接口叫FileContext,一个FileContext实例可以处理多种文件系统,而

Alex 的 Hadoop 菜鸟教程: 第18课 用Http的方式访问HDFS - HttpFs 教程

声明 本文基于Centos 6.x + CDH 5.x HttpFs 有啥用 HttpFs可以干这两件事情 通过HttpFs你可以在浏览器里面管理HDFS上的文件 HttpFs还提供了一套REST 风格的API可以用来管理HDFS 其实很简单的一个东西嘛,但是很实用 安装HttpFs 在集群里面找一台可以访问hdfs的机器安装HttpFs $ sudo yum install hadoop-httpfs 配置 编辑/etc/hadoop/conf/core-site.xml <property>

Hadoop读书笔记(三)Java API操作HDFS

Hadoop读书笔记(一)Hadoop介绍:http://blog.csdn.net/caicongyang/article/details/39898629 Hadoop读书笔记(二)HDFS的shell操作:http://blog.csdn.net/caicongyang/article/details/41253927 JAVA URL 操作HDFS OperateByURL.java package hdfs; import java.io.InputStream; import jav

【异常】访问HDFS权限异常:Permission denied: user=С&#206;&#247;?&#206;&#232;, access=WRITE, inode=&quot;/&quot;:hadoop:supergroup:drwx

IDEA中的scala项目访问HDFS,程序运行,可能出现的异常: 权限问题:Permission denied: user=СÎ÷?Îè, access=WRITE, inode="/":hadoop:supergroup:drwxr-xr-x 修改运行时参数,因为HDFS上的文件所属的用户是hadoop,所以这里的用户也改成hadoop: ? -DHADOOP_USER_NAME=hadoop: ? 原文地址:https://www.cnblogs.com/huomei/p/121