1

リンク: https://stackoverflow.com/questions/18583242/funny-results-with-hadoop-will-having-a-single-input-file-cause-this

Hadoop に関するこの質問を投稿しましたが、問題を少し絞り込んだため、より具体的な質問を作成しています。

Hadoop Map/Reduce ジョブを作成しました。CSV を受け取り、それを defaultdict に読み込み、2 つのファイル (肯定的な言葉と否定的な言葉) をインポートしてから、csv のすべてのテキストに対して感情分析を実行します。次に、この結果 (リデューサーによって収集されたもの) を出力し、すべてのキーを結合します。

次のようにローカルで実行できます。

cat ~/Text/ListOfTexts.csv | python hadoop_map.py | sort | python hadoop_reduce.py 

これにより、意図した結果が問題なく生成されます。次に、次のように Hadoop Streaming を使用して実行しようとします。

bin/hadoop jar contrib/streaming/hadoop-streaming-1.1.2.jar 
-file positive_words.txt -file negative_words.txt 
-file hadoop_map.py -mapper hadoop_map.py 
-file hadoop_reduce.py -reducer hadoop_reduce.py 
-input /ListOfTexts.csv -output /OutputOfTexts.txt

これはすべての情報を処理しますが、何らかの理由で結果を適切に結合しません。「カウント」変数を実装して、スキャンしているドキュメントの数を確認しました (1199 である必要があります)。マッパーだけを実行すると、2 つの出力ファイルが得られます。1 つは 630 で、もう 1 つは 569 です (合計すると 1199 になります)。

ただし、ローカルで使用されているのと同じコードでレデューサーを使用すると、630 しかカウントされません。さらに、すべてのペアが組み合わされているわけではありません。これは、Hadoop が結果を適切に結合していないと思わせます。なぜこれが起こっているのか誰にも分かりますか?必要に応じてコードを投稿できますが、ここでは単語数を削減しようとしています。

4

1 に答える 1

2

私はこれを安価なハックで修正しました

レデューサーが機能し始める前に、マッパーは結果をソートしていませんでした。私はこのような方法を持っていました:

if currentKey == key:
    do something

問題は、これがいくつかの同一のキーに対して実行される一方で、他のキーは後で読み込まれるまで読み込まれず、その処理がこのステートメントで以前に行われたものに置き換わることでした。

これを修正するために、レデューサーへの入力のすべての行が新しいデフォルト dict に読み取られ、すべての同一のキーがまとめられるようになりました。

これが、ローカル マシンでのテストが機能した理由です。私はこれをしたので:

cat name_of_file.csv | python hadoop_map.py | sort | python hadoop_reducer.py

Hadoop は途中でソートを実行していませんでした。

なぜこれが Hadoop によって自動的に行われなかったのかはまだわかりません。前述のように、私の解決策は安価なハックです。

于 2013-09-03T15:51:19.667 に答える