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