我必須使用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。節點
您必須定義自己的類(Node),它擴展了WritableComparable(Comparable,因爲它是關鍵)。然後,將outputKeyClass設置爲Node.class,而不是TextWritable.class – vefthym
我已經完成了。從Map發送數據到Reduce時,您的方法是適當的。但是,看起來Reduce只能寫入文件。雖然鏈接第二張地圖只從第一張縮略圖寫入的文件中讀取。第一個reduce不能將節點(序列化)寫入文件。 – Dip
你如何聲明reducer類和reduce方法?爲什麼在reducer1中使用該節點作爲關鍵字並將其作爲map2中的值?你應該使用mapper2中的sequencefileinputformat和reducer1中的sequencefileoutputformat,而不是textinputformat和textoutputformat。 – vefthym