2017-01-02 54 views
1

我必須使用Map Reduce實現一個Graph算法。爲此我必須連鎖工作。
MAP1 -> REDUCE1 -> MAP2 -> REDUCE2 -> ...
我將讀取MAP1中文件的相鄰矩陣,並創建一個用戶定義的java類Node,它將包含數據和子信息。我想將這些信息傳遞給MAP2。
但是,當我寫使用用戶定義的類鏈接作業

context.write的降低1(節點,NullWritable.get());

節點數據使用Node類的toString()以文本格式保存在文件中。
當MAP2試圖讀取該節點的信息,

公共無效地圖(LongWritable鍵,節點的節點,上下文語境)拋出IOException異常,InterruptedException的

它說,它不能轉換文本該文件到節點。
我不確定在Map reduce中這種類型的鏈接作業​​的正確方法是什麼。

的降低1以這種格式寫入節點:

節點[NODEID = 1,adjacentNodes = [節點[NODEID = 2,adjacentNodes = []],節點[NODEID = 2,adjacentNodes = [] ]]]

實際的異常:

java.lang.Exception的:java.lang.ClassCastException: org.apache.hadoop.io.Text不能轉換爲custom.node.nauty。節點

+0

您必須定義自己的類(Node),它擴展了WritableComparable(Comparable,因爲它是關鍵)。然後,將outputKeyClass設置爲Node.class,而不是TextWritable.class – vefthym

+0

我已經完成了。從Map發送數據到Reduce時,您的方法是適當的。但是,看起來Reduce只能寫入文件。雖然鏈接第二張地圖只從第一張縮略圖寫入的文件中讀取。第一個reduce不能將節點(序列化)寫入文件。 – Dip

+0

你如何聲明reducer類和reduce方法?爲什麼在reducer1中使用該節點作爲關鍵字並將其作爲map2中的值?你應該使用mapper2中的sequencefileinputformat和reducer1中的sequencefileoutputformat,而不是textinputformat和textoutputformat。 – vefthym

回答

1

基礎上的意見,建議的更改,這將使你的代碼工作如下:

你應該mapper2和SequenceFileOutputFormat在reducer1分別使用SequenceFileInputFormat,而不是的TextInputFormat和TextOutputFormat。 TextInputFormat讀取一個LongWritable鍵和一個Text值,這就是爲什麼你會得到這個錯誤。

因此,您還應該更改映射器2的聲明,以接受節點鍵和NullWritable值。

請確保Node類擴展了Writable類(或者如果將它用作鍵的話,則爲WritableComparable)。然後,將第一個作業的outputKeyClass設置爲Node.class,而不是TextWritable.class。

+0

謝謝!我正在做你說的確切的事情,但是,在驅動程序文件中有一個錯誤。 – Dip

相關問題