mapreduce api的不同版本對于實作DistributedCache略有差異。
1.DistributedCache.addCacheFile(new URI("檔案在HDFS中的位置"), conf);
這裡需要注意:首先,conf指Configuration;其次,這句話必須寫在Job job=new Job(conf,"作業名")之前!!
2.Path[] files=DistributedCache.getLocalCacheFiles(context.getConfiguration());
獲得此Configuration的所有緩存檔案本地位址,我們不需要管本地位址是什麼,拿來用就行了。(最後解釋原理)
這裡有個大坑:getLocalCacheFiles傳回的是本地副本的位址,而getCacheFiles傳回的是HDFS檔案位址,是以普通Java I/O是讀不到的!
多說一句,舊版api使用JobConf獲得緩存檔案。
3.使用各個檔案的位址讀寫檔案即可,即基本java I/O
DistributedCache原理:
所謂緩存,就是将HDFS上的檔案下載下傳備份到各個節點供本地使用,也是以,修改本地檔案是沒有意義的(它隻是一個副本)。