c/c++ 访问 hdfs
2014-04-29 10:25
441 查看
在hadoop安装的目录中,有include/目录,包括了使用c/c++访问hdfs的接口头文件hdfs.h
1.建立、关闭与HDFS连接:hdfsConnect()、hdfsConnectAuUser()、hdfsDisconnect()。hdfsConnect()实际上是直接调用hdfsConnectAsUser。
2.打开、关闭HDFS文件:hdfsOpenFile()、hdfsCloseFile().当用hdfsOpenFile()创建文件时,可以指定replication和blocksize参数。写打开一个文件时,隐含O_TRUNC标志,文件会被截断,写入是从文件头开始的。
3.读HDFS文件:hdfsRead(),hdfsPread.只要在两个函数返回零时,才能断点到了文件末尾。
4.写HDFS文件:hdfsWrite().HDFS不支持随机写,只能是从文件头顺序写入。
5.查询HDFS文件信息:hdfsGetPathInfo()
6.查询和设置HDFS文件读写偏移量:hdfsSeek(),hdfsTell()
7.查询数据块所在节点信息:hdfsGetHosts().返回一个或多个数据块所在数据节点的信息,一个数据块可能存在多个数据节点上。
8.libhdfs中的函数是通过jni调用JAVA虚拟机,在虚拟机中构造对应的HDFS的JAVA类,然后反射调用该类的功能函数。总会发生JVM和程序之间内存拷贝的动作,性能方面值得注意。
9.HDFS不支持多个客服端同时写入的操作,无文件或是记录锁的概念。
//一个简单示例
//opera_hdfs.h
#ifndef __OPERA_HDFS_H
#define __OPERA_HDFS_H
#include "hdfs.h"
class operahdfs
{
public:
operahdfs();
void operahdfs_conn(char *ip,int port);
void operahdfs_open(char *filename,hdfsFile *wirefile);
int operahdfs_wirte(unsigned char *buff,int bufflen);
void operahdfs_close(hdfsFile &writeFile);
void operahdfs_rename(const char * oldPath,const char * newPath);
};
#endif
//opera_hdfs.cpp
#include "opera_hdfs.h"
#include "stdio.h"
operahdfs::operahdfs()
{
}
void operahdfs::operahdfs_conn(char *ip,int port)
{
fs=hdfsConnect(ip,port);
if(!fs)
{
printf("connect hdfs error!\n");
}
}
void operahdfs::operahdfs_open(char * filename,hdfsFile *writeFile)
{
*writeFile=hdfsOpenFile(fs,filename,O_WRONLY|O_CREAT,0,0,0);
if(NULL==*writeFile)
{
printf("failed fs:%d open %s for writing !\n",fs,filename);
}
}
int operahdfs::operahdfs_wite(unsigned char *buff,int bufflen,hdfsFile &writeFile)
{
if(NULL==writeFile)
return 0;
int num_written_bytes=hdfsWrite(fs,writeFile,(void*)buff,bufflen);
if(hdfsFlush(fs,writeFile)){
printf("failed to flush\n");
return 0;
}
return num_written_bytes;
}
void operahdfs::operahdfs_close(hdfsFile &writeFile)
{
if(NULL!=writeFile)
hdfsCloseFile(fs,writeFile);
}
void oeprahdfs::oprahdfs_rename(const char* oldPath,const char* newPath)
{
int ret=0;
ret=hdfsRename(fs,oldPath,newPath);
}
/* test using
#include <iostrema>
#include <stdio.h>
#include <stdlib.h>
#Include <string.h>
using namespace std;
int main()
{
operahdfs ophd;
char writepath[]="/input/testfile.txt";
char writechar[]="this is test!";
ophd.operahdfs_conn("10.1.1.2",9000); //ip为安装hdfs的服务器,连接hdfs使用的端口
hdfsFile writeFile;
ophd.operahdfs_open(writepath,&writeFile);
int sul=ophd.operahdfs_write((unsigned char *)writechar,strlen(writechar),writeFile);
cout<<"success:"<<sul<<endl;
ophd.operadhfs_close(writeFile);
return 0;
}
*/ end test using
$g++ opera_hdfs.cpp -I$hadoop/include -lhdfs
1.建立、关闭与HDFS连接:hdfsConnect()、hdfsConnectAuUser()、hdfsDisconnect()。hdfsConnect()实际上是直接调用hdfsConnectAsUser。
2.打开、关闭HDFS文件:hdfsOpenFile()、hdfsCloseFile().当用hdfsOpenFile()创建文件时,可以指定replication和blocksize参数。写打开一个文件时,隐含O_TRUNC标志,文件会被截断,写入是从文件头开始的。
3.读HDFS文件:hdfsRead(),hdfsPread.只要在两个函数返回零时,才能断点到了文件末尾。
4.写HDFS文件:hdfsWrite().HDFS不支持随机写,只能是从文件头顺序写入。
5.查询HDFS文件信息:hdfsGetPathInfo()
6.查询和设置HDFS文件读写偏移量:hdfsSeek(),hdfsTell()
7.查询数据块所在节点信息:hdfsGetHosts().返回一个或多个数据块所在数据节点的信息,一个数据块可能存在多个数据节点上。
8.libhdfs中的函数是通过jni调用JAVA虚拟机,在虚拟机中构造对应的HDFS的JAVA类,然后反射调用该类的功能函数。总会发生JVM和程序之间内存拷贝的动作,性能方面值得注意。
9.HDFS不支持多个客服端同时写入的操作,无文件或是记录锁的概念。
//一个简单示例
//opera_hdfs.h
#ifndef __OPERA_HDFS_H
#define __OPERA_HDFS_H
#include "hdfs.h"
class operahdfs
{
public:
operahdfs();
void operahdfs_conn(char *ip,int port);
void operahdfs_open(char *filename,hdfsFile *wirefile);
int operahdfs_wirte(unsigned char *buff,int bufflen);
void operahdfs_close(hdfsFile &writeFile);
void operahdfs_rename(const char * oldPath,const char * newPath);
};
#endif
//opera_hdfs.cpp
#include "opera_hdfs.h"
#include "stdio.h"
operahdfs::operahdfs()
{
}
void operahdfs::operahdfs_conn(char *ip,int port)
{
fs=hdfsConnect(ip,port);
if(!fs)
{
printf("connect hdfs error!\n");
}
}
void operahdfs::operahdfs_open(char * filename,hdfsFile *writeFile)
{
*writeFile=hdfsOpenFile(fs,filename,O_WRONLY|O_CREAT,0,0,0);
if(NULL==*writeFile)
{
printf("failed fs:%d open %s for writing !\n",fs,filename);
}
}
int operahdfs::operahdfs_wite(unsigned char *buff,int bufflen,hdfsFile &writeFile)
{
if(NULL==writeFile)
return 0;
int num_written_bytes=hdfsWrite(fs,writeFile,(void*)buff,bufflen);
if(hdfsFlush(fs,writeFile)){
printf("failed to flush\n");
return 0;
}
return num_written_bytes;
}
void operahdfs::operahdfs_close(hdfsFile &writeFile)
{
if(NULL!=writeFile)
hdfsCloseFile(fs,writeFile);
}
void oeprahdfs::oprahdfs_rename(const char* oldPath,const char* newPath)
{
int ret=0;
ret=hdfsRename(fs,oldPath,newPath);
}
/* test using
#include <iostrema>
#include <stdio.h>
#include <stdlib.h>
#Include <string.h>
using namespace std;
int main()
{
operahdfs ophd;
char writepath[]="/input/testfile.txt";
char writechar[]="this is test!";
ophd.operahdfs_conn("10.1.1.2",9000); //ip为安装hdfs的服务器,连接hdfs使用的端口
hdfsFile writeFile;
ophd.operahdfs_open(writepath,&writeFile);
int sul=ophd.operahdfs_write((unsigned char *)writechar,strlen(writechar),writeFile);
cout<<"success:"<<sul<<endl;
ophd.operadhfs_close(writeFile);
return 0;
}
*/ end test using
$g++ opera_hdfs.cpp -I$hadoop/include -lhdfs
相关文章推荐
- 如何用opencv (c++)捕捉鼠标点击位置
- QML 访问C++中的 对象,以及函数
- C++拷贝构造函数(深拷贝,浅拷贝)
- C/C++程序员:排序算法之标准C语言qsort函数简单用法介绍
- 关于C++中的前置声明
- c++成员函数后的const
- C/C++程序员:排序算法之冒泡
- C/C++程序员:基本排序算法之选择排序
- C/C++程序员:基本排序算法之插入排序
- c语言实现冒泡排序、希尔排序等多种算法示例
- C/C++程序员:基本排序算法之快速排序
- c语言标准库中字符转换函数和数字转换函数
- 简单的结构体数组
- 《C语言入门经典第四版 》笔记1
- c++
- C++primer plus第六版课后编程题答案17.4
- 从零单排c++ primer(18)
- C++primer plus第六版课后编程题答案17.3
- 从C++到Qt开发过程
- C++primer plus第六版课后编程题答案17.2