5

通常、次のような方法で新しいファイルを開くことができます。

aDict = {}
with open('WordLists/positive_words.txt', 'r') as f:
    aDict['positive'] = {line.strip() for line in f}

with open('WordLists/negative_words.txt', 'r') as f:
    aDict['negative'] = {line.strip() for line in f}

これにより、WordLists フォルダー内の関連する 2 つのテキスト ファイルが開き、各行が正または負として辞書に追加されます。

ただし、Hadoop 内で mapreduce ジョブを実行したい場合、これは機能しないと思います。私は次のようにプログラムを実行しています:

./hadoop/bin/hadoop jar contrib/streaming/hadoop-streaming-1.1.2.jar -D mapred.reduce.tasks=0 -file hadoop_map.py -mapper hadoop_reduce.py -input /toBeProcessed -output /Completed

コードを次のように変更しようとしました。

with open('/mapreduce/WordLists/negative_words.txt', 'r')

ここで、mapreduce は HDFS 上のフォルダーで、WordLists は否定的な単語を含むサブフォルダーです。しかし、私のプログラムはこれを見つけられません。私がやっていることは可能ですか?もしそうなら、HDFSにファイルをロードする正しい方法は何ですか.

編集

私は今試しました:

with open('hdfs://localhost:9000/mapreduce/WordLists/negative_words.txt', 'r')

これは何かをしているように見えますが、今ではこのような出力が得られます:

13/08/27 21:18:50 INFO streaming.StreamJob:  map 0%  reduce 0%
13/08/27 21:18:50 INFO streaming.StreamJob:  map 50%  reduce 0%
13/08/27 21:18:50 INFO streaming.StreamJob:  map 0%  reduce 0%

その後、ジョブが失敗します。だからまだ正しくない。何か案は?

編集2:

API を読み直したところ-files、端末のオプションを使用してファイルを指定できることに気付きました。API は次のように述べています。

-files オプションは、ファイルのローカル コピーを指すタスクの現在の作業ディレクトリにシンボリック リンクを作成します。

この例では、Hadoop はタスクの現在の作業ディレクトリに testfile.txt という名前のシンボリック リンクを自動的に作成します。このシンボリック リンクは、testfile.txt のローカル コピーを指しています。

-files hdfs://host:fs_port/user/testfile.txt

したがって、私は実行します:

./hadoop/bin/hadoop jar contrib/streaming/hadoop-streaming-1.1.2.jar -D mapred.reduce.tasks=0 -files hdfs://localhost:54310/mapreduce/SentimentWordLists/positive_words.txt#positive_words -files hdfs://localhost:54310/mapreduce/SentimentWordLists/negative_words.txt#negative_words -file hadoop_map.py -mapper hadoop_map.py -input /toBeProcessed -output /Completed

API についての私の理解では、これによりシンボリック リンクが作成されるため、次のようにコードで「positive_words」と「negative_words」を使用できます。

with open('negative_words.txt', 'r')

ただし、これはまだ機能しません。これを解決するまで私はあまりできないので、誰かが提供できる助けは非常に高く評価されます。

編集3:

このコマンドを使用できます:

-file ~/Twitter/SentimentWordLists/positive_words.txt

Hadoop ジョブを実行するコマンドの残りの部分と一緒に。これにより、HDFS ではなくローカル システム上のファイルが検索されます。これはエラーをスローしないため、どこかでファイルとして受け入れられます。ただし、ファイルにアクセスする方法がわかりません。

4

2 に答える 2

2

たくさんのコメントの後の解決策:)

Python でデータ ファイルを読み取る: 送信し-file、スクリプトに次を追加します。

import sys

の後に追加する必要がある場合がありますimport

sys.path.append('.')

( Hadoop Streaming - Unable to find file エラーの @DrDee コメントに関連)

于 2013-08-28T09:12:58.667 に答える
0

HDFS をプログラムで処理する場合は、FileSystem、FileStatus、および Path を調べる必要があります。これらは、プログラム内で HDFS にアクセスできるようにする Hadoop API クラスです。

于 2013-08-28T00:26:05.810 に答える