Taiwan Hadoop Forum http://forum.hadoop.tw/ |
|
使用Hadoop Streaming with C/C++ http://forum.hadoop.tw/viewtopic.php?f=7&t=38285 |
第 1 頁 (共 1 頁) |
發表人: | seasky [ 2015-08-26, 20:43 ] |
文章主題 : | 使用Hadoop Streaming with C/C++ |
各位大大好: 想請問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; } // |
發表人: | jazz [ 2015-08-30, 10:38 ] |
文章主題 : | Re: 使用Hadoop Streaming with C/C++ |
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 |
發表人: | seasky [ 2015-08-30, 22:00 ] |
文章主題 : | Re: 使用Hadoop Streaming with C/C++ |
非常感謝Jezz大 已測試過您提供的建議也了解了! 也在測試了解Hadoop FileSystem APIs中 謝謝! |
第 1 頁 (共 1 頁) | 所有顯示的時間為 UTC + 8 小時 |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |