0

Hadoop 1.0.4 コードを Hadoop 2.3 プラットフォームに移行していて、DistributedCache の奇妙な動作変更に遭遇しました。

Hadoop 1 では、ファイルを にキャッシュする場合/user/foo/file/bar/name.avro、DistributedCache はこのファイルをローカル キャッシュ フォルダーにコピーし、それに応じて同じサブ ディレクトリを作成します。したがって、ファイルは に保存され/[ROOT_OF_TMP_CACHE_DIR]/user/foo/file/bar/name.avroます。

現在、Hadoop 2 の同じコードは、サブディレクトリを作成せずにファイルをルート フォルダーに直接配置します。したがって、キャッシュされたファイルは次の場所に保存されます/[ROOT_OF_TMP_CACHE_DIR]/name.avro

複数のファイルをキャッシュしている場合、特にファイル名がpart-r-00000.avro.

もちろん、リンクを適用し、キャッシュされたファイルの名前を一意の名前に変更することは、この問題を解決する 1 つの方法です。しかし、より一般的には、一意の名前を作成することは、多くの場合、特に異なるマッパー/リデューサー間で一意の名前を保証する必要がある場合は簡単に思えます。tmp ディレクトリ内にフォルダーを作成するか、mapreduce 構成パラメーターを調整するなど、この動作を変更する他の方法があるかどうか疑問に思っています。

私が試した 1 つの方法は、URI を「path#path」にしようとすることです。そのため、自分自身にリンクしていますが、次の例外が発生するようです。

14-10-2014 16:05:41 PDT admm_train INFO - Caused by: java.lang.IllegalArgumentException: Resource name must be relative
14-10-2014 16:05:41 PDT admm_train INFO -   at org.apache.hadoop.mapreduce.v2.util.MRApps.parseDistributedCacheArtifacts(MRApps.java:489)
14-10-2014 16:05:41 PDT admm_train INFO -   at org.apache.hadoop.mapreduce.v2.util.MRApps.setupDistributedCache(MRApps.java:430)
14-10-2014 16:05:41 PDT admm_train INFO -   at org.apache.hadoop.mapred.YARNRunner.createApplicationSubmissionContext(YARNRunner.java:455)
14-10-2014 16:05:41 PDT admm_train INFO -   at org.apache.hadoop.mapred.YARNRunner.submitJob(YARNRunner.java:283)
14-10-2014 16:05:41 PDT admm_train INFO -   at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:432)
4

1 に答える 1

1

このバグは、Hadoop 1 および 2 での DistributedCache の内部動作の変更が原因です。

Hadoop 1 では、キャッシュされるファイルはローカルの tmp ディレクトリに保存され、以前のパス構造がすべて保持されます。たとえば、hdfs:///foo/bar/file1 を Hadoop1 にキャッシュしている場合、それは /[some tmp path]/foo/bar/file1 に保存されます。

Hadoop 2 では、DistributeCache はパス構造を剥がして hdfs:///foo/bar/file1 を保存し、/[何らかの tmp パス]/file1 に直接保存します。

また、シンボリックリンク名を使用している場合、Hadoop 2 はファイルの名前をリンク名に変更しますが、Hadoop 1 は変更しません。これにより、Hadoop 1 から Hadoop 2 に切り替える際に互換性の競合が発生します。

これに対する簡単な解決策は、常にシンボリックリンク名を使用し、名前を介してファイルにアクセスすることです。これにより、保存方法が異なっていても、同じ方法でアクセスできます。

于 2015-04-30T00:26:06.623 に答える