2017-01-02 4 views
1

Map Reduceを使用してグラフアルゴリズムを実装する必要があります。このため私は仕事を連鎖させなければならない。

MAP1のファイルから隣接する行列を読み取り、データと子情報を含むユーザー定義のJavaクラスNodeを作成します。私はこの情報をMAP2に渡したいと思います。
しかし、私はユーザー定義クラスを使用したジョブの連結

context.writeを書き込むREDUCE1に(ノード、NullWritable.get())。

ノードデータは、Nodeクラスの toString()を使用してテキスト形式でファイルに保存されます。
MAP2は、このノード情報を読み取ろうとすると、

ます。public voidマップ(LongWritableキー、ノードノード、コンテキストコンテキスト)はIOExceptionがスローは、InterruptedExceptionある

それは内のテキストを変換することはできませんと言っていますノードへのファイル
Map reduceのジョブの連鎖のこのタイプの正しいアプローチは何か分かりません。

REDUCE1この形式でノードを書き込む:

ノード〔のnodeId = 1、adjacentNodes = [ノード〔のnodeId = 2、adjacentNodes = []、ノード[のnodeId = 2、adjacentNodes = [] ]]]

実際の例外:

のjava.lang.Exception:java.lang.ClassCastExceptionが: org.apache.hadoop.io.Textはcustom.node.nautyにキャストすることはできません。ノードコメントに基づい

+0

WritableComparable(キーであるため、Comparable)を拡張する独自のクラス(Node)を定義する必要があります。次に、TextWritable.classではなくNode.classにoutputKeyClassを設定します。 – vefthym

+0

私はそれを行いました。 MapからReduceにデータを送信するときのアプローチは適切です。しかし、Reduceはファイルに書き込むことしかできないようです。 2番目のマップを連鎖させるのは、1番目のreduceが書いたファイルからのみ読み込みます。第1回目のreduceは、Node(直列化)をファイルに書き込むことはできません。 – Dip

+0

レデューサークラスとreduceメソッドをどのように宣言しますか?なぜ、ノードを減速機1のキーとして使用し、map2の値として使用するのですか?mapper2ではsequencefileinputformat、reducer1ではsequencefileoutputformatを使用し、textinputformatおよびtextoutputformatは使用しないでください。 – vefthym

答えて

1

、あなたのコードの作業を行います提案された変更は次のとおりです。

あなたは、それぞれ、TextInputFormatとTextOutputFormat reducer1にmapper2とSequenceFileOutputFormatでSequenceFileInputFormatを使用し、そしてべきではありません。 TextInputFormatは、LongWritableキーとText値を読み取ります。このため、このエラーが発生します。

したがって、ノードキーとNullWritable値を受け入れるように、マッパー2の宣言も変更する必要があります。

NodeクラスがWritableクラス(またはキーとして使用する場合はWritableComparable)を拡張していることを確認してください。次に、最初のジョブのoutputKeyClassをTextWritable.classの代わりにNode.classに設定します。

+0

ありがとう!私はあなたが言った正確なことをやっていたが、ドライバーファイルに間違いがあった。 – Dip

関連する問題