0

Hadoop プログラムを Amazon Elastic MapReduce システムで実行しようとしています。私のプログラムは、プログラムの実行に必要なパラメーターを含むローカル ファイル システムから入力ファイルを取得します。ただし、ファイルは通常ローカル ファイル システムから読み込まれるためFileInputStream、AWS 環境でタスクを実行すると、パラメータ ファイルが見つからないというエラーが発生して失敗します。ファイルはすでに Amazon S3 にアップロードされていることに注意してください。この問題を解決するにはどうすればよいですか? ありがとう。以下は、パラメーター ファイルを読み取り、その結果、ファイル内のパラメーターを読み取るために使用するコードです。

FileInputStream fstream = new FileInputStream(path);
            FileInputStream os = new FileInputStream(fstream);
            DataInputStream datain = new DataInputStream(os);
            BufferedReader br = new BufferedReader(new InputStreamReader(datain));

            String[] args = new String[7];

            int i = 0;
            String strLine;
            while ((strLine = br.readLine()) != null) {
                args[i++] = strLine;
            }
4

3 に答える 3

1

ローカル ファイル システムからファイルを読み取る必要がある場合は、ブーストラップ アクションで実行するように EMR ジョブを設定できます。そのアクションでは、 s3cmdなどを使用してファイルを S3 からローカル ファイルにコピーするだけです。

EMR がこのような直接アクセスをサポートしていると確信しているため、Hadoop FileSystem クラスを介してファイルを読み取ることもできます。例えば:

FileSystem fs = FileSystem.get(new URI("s3://my.bucket.name/"), conf);
DataInputStream in = fs.open(new Path("/my/parameter/file"));
于 2012-12-14T20:29:41.923 に答える
0

次のようにして、このファイルを分散キャッシュに追加できます。

...
String s3FilePath = args[0];
DistributedCache.addCacheFile(new URI(s3FilePath), conf);
...

後で、マッパー/リデューサーの configure() で、次のことができます。

...
Path s3FilePath;
@Override
public void configure(JobConf job) {
s3FilePath = DistributedCache.getLocalCacheFiles(job)[0];
FileInputStream fstream = new FileInputStream(s3FilePath.toString());
...
}
于 2012-12-16T20:51:18.307 に答える
0

Amazon Elastic はまだ試していませんが、分散キャッシュの古典的なアプリケーションのようです。-filesオプション ( Tool/を実装する場合ToolRunner) またはメソッドを使用して file do cache を追加job.addCacheFile(URI uri)し、ローカルに存在するかのようにアクセスします。

于 2012-12-16T01:14:53.023 に答える