Taiwan Hadoop Forum

台灣 Hadoop 技術討論區
現在的時間是 2018-10-21, 04:55

所有顯示的時間為 UTC + 8 小時




發表新文章 回覆主題  [ 3 篇文章 ] 
發表人 內容
 文章主題 : 使用Hadoop Streaming with C/C++
文章發表於 : 2015-08-26, 20:43 
離線

註冊時間: 2015-05-27, 15:25
文章: 8
各位大大好:

想請問C++在使用 Hadoop Streaming 的部分,本身的"mapper"和"reduce"中,可否加進開檔讀檔的功能?
我修改C++ wordcount的程式,希望mapper或reduce中可以fopen一個新文字檔,並且把<Key, Value>記錄在這個文字檔中,
實際直接測試C++的程式是OK的,但丟上Hadoop去執行,只有wordcount部分的結果可以成功執行,
我在hdfs中的input/output都沒有看到任何有關我開新的那一個文字檔的蹤跡。

想請問在hadoop streaming中,我用C++開檔讀檔的這個動作,是否不被接受?

謝謝!


//Mapper.cpp

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;
int main() {
string key;
FILE *pFile;
//char* libvar;

pFile = fopen ("hadoop_mapper_cpp.txt", "wa+");
//libvar = (char*) "echo 1234567";

fprintf(pFile, "mapper\n");
if (pFile == NULL) {
printf ("FAILED\n");
return 0;
}
while(cin >> key) {
cout << key << "\t" << "1" << endl;
fprintf(pFile,"%s\n", key.c_str());
}
fclose (pFile);
return 0;
}
//


//Reducer.cpp

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;
int main() {
string cur_key, last_key, value;
FILE *pFile;

cin >> cur_key >> value;
last_key = cur_key;

int n = 1;

pFile = fopen ("hadoop_mapper_cpp.txt", "a+");
fprintf(pFile, "\n\nreducer\n\n");

while(cin >> cur_key) {
cin >> value;
if(last_key != cur_key) {
cout << last_key << "\t" << n << endl;
last_key = cur_key;
n = 1;
} else {
n++;
}
fprintf(pFile,"5.Last Key: %s\t%d\n\n", last_key.c_str(), n);

}

fclose (pFile);
cout << last_key << "\t" << n << endl;
return 0;
}
//


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 使用Hadoop Streaming with C/C++
文章發表於 : 2015-08-30, 10:38 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
seasky 寫:
各位大大好:
想請問C++在使用 Hadoop Streaming 的部分,本身的"mapper"和"reduce"中,可否加進開檔讀檔的功能?
我修改C++ wordcount的程式,希望mapper或reduce中可以fopen一個新文字檔,並且把<Key, Value>記錄在這個文字檔中,
實際直接測試C++的程式是OK的,但丟上Hadoop去執行,只有wordcount部分的結果可以成功執行,
我在hdfs中的input/output都沒有看到任何有關我開新的那一個文字檔的蹤跡。
想請問在hadoop streaming中,我用C++開檔讀檔的這個動作,是否不被接受?
謝謝!


這是一個觀念上需要修改的地方。
由於 HDFS 是一個抽象的檔案系統,因此您必須透過 HDFS 的介面去寫,而不能用作業系統的 fopen 等函數去進行讀寫。
您的程式在 MapReduce 上執行時,會變成寫在每一台 TaskTracker 的本機暫存區。
假設您想驗證一下觀念的話,可以把路徑寫在 /tmp/ 底下。
代碼:
pFile = fopen ("/tmp/hadoop_mapper_cpp.txt", "wa+");

您會發現不是出現在 HDFS 的 /tmp 而是出現在作業系統的 /tmp (如果是 Linux 的話)
( 為什麼要改路徑呢?因為 MapReduce 在完成時,暫存區會被 TaskTracker 清掉,所以根本就不知道有寫檔案到本機作業系統 )

使用 C/C++ 想要存取 HDFS ,必須透過 Hadoop Pipes 的介面
類似以下這個問題中提到的方法,使用 libhdfs/hdfs.h 中定義的函數去做 HDFS 的讀寫。
http://stackoverflow.com/questions/5882481/hadoop-pipes-problem

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 使用Hadoop Streaming with C/C++
文章發表於 : 2015-08-30, 22:00 
離線

註冊時間: 2015-05-27, 15:25
文章: 8
非常感謝Jezz大
已測試過您提供的建議也了解了!

也在測試了解Hadoop FileSystem APIs中
謝謝!


回頂端
 個人資料 E-mail  
 
顯示文章 :  排序  
發表新文章 回覆主題  [ 3 篇文章 ] 

所有顯示的時間為 UTC + 8 小時


誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 2 位訪客


不能 在這個版面發表主題
不能 在這個版面回覆主題
不能 在這個版面編輯您的文章
不能 在這個版面刪除您的文章
不能 在這個版面上傳附加檔案

搜尋:
前往 :  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
正體中文語系由 竹貓星球 維護製作