c/c++ 访问 hdfs

By | 2019年2月2日

在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

发表评论