Hadoop通過c語言API訪問hdfs

來源:互聯網
上載者:User

標籤:style   blog   java   color   使用   檔案   

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 file108 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 file120 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命令,這相當於在系統中註冊了一下相應的庫,運行時就不會找不到了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.