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)