2015-10-07 90 views
1

我想弄清楚由Hadoop緩存支持目錄創建的符號鏈接。目錄是否由Hadoop緩存符號鏈接處理?

  • 它運作良好,在分佈式模式
  • 它無法在本地模式
  • 的Javadoc /文檔是很稀疏,說一無所知

短版

我希望DistributedCache.addCacheFile(URI.create("file:/tmp/myfile#foo/bar"), conf)到在當前工作目錄下以foo/bar的名稱提供/tmp/myfile

羣集上的一切都很好,但在本地模式下失敗。基本上,LocalDistributedCacheManager.setup嘗試使用ln -s /tmp/myfile $cwd/foo/bar創建符號鏈接,但foo從未創建。

具體要求

我要添加一個或幾個Avro的​​到Hadoop的分佈式緩存。

SortedKeyValueFile s與Hadoop MapFile s類似。它們實際上是一個由兩個文件構成的目錄:索引文件和數據文件。這兩個文件必須具有特定名稱(indexdata),並且必須位於相同的目錄中。

如果我希望能夠將至少兩個「文件」放入分佈式緩存中,我不能將這些文件壓扁到根目錄中。我必須保留/定義一個文件層次結構。

設置:Hadoop 2.6.0/CDH 5.4/Crunch。因爲我正在使用Crunch,所以我不得不使用已棄用的DistributedCache API,因爲Job.addCachefile()未公開。

問題需要回答

  • 是它在本地模式的錯誤還是我濫用分佈式緩存?
  • 人們如何將諸如MapFileSortedKeyValueFile之類的內容插入到Hadoop緩存中?

回答

0

這是一個本地模式的錯誤還是濫用分佈式緩存?

分佈式緩存在本地模式下不受支持。它只能以僞分佈模式或集羣模式運行。

人們如何將MapFile或SortedKeyValueFile等東西推入Hadoop緩存?

您必須將所有內容放在文件中並將其放在HDFS中,並在 mapside中從文件中讀取它並將其放入hashmap中。

如何從分佈式緩存讀取:

@Override 
     protected void setup(Context context) throws IOException,InterruptedException 
     { 
      Path[] filelist=DistributedCache.getLocalCacheFiles(context.getConfiguration()); 
      for(Path findlist:filelist) 
      { 
       if(findlist.getName().toString().trim().equals("mapmainfile.dat")) 
       { 

        fetchvalue(findlist,context); 
       } 
      } 

     } 
     public void fetchvalue(Path realfile,Context context) throws NumberFormatException, IOException 
     { 
      BufferedReader buff=new BufferedReader(new FileReader(realfile.toString())); 
      //read the file and put it in hashMap 
     } 

將文件添加分佈式緩存:

DistributedCache.addCacheFile(new URI("/user/hduser/test/mapmainfile.dat"),conf); 
+0

1 - 你可以把一個斷點'LocalDistributedCacheManager.setup()'來請參閱即使在本地模式下也配置分佈式緩存(也許這是一個Pig限制?)。 2- SortedKeyValueFile被故意使用,使用內存集合中沒有選項。我可以在每次嘗試的開始時自己複製本地文件系統上的兩個文件。但它破壞了分佈式緩存的有效性,並需要額外的代碼來清理本地混亂中的混亂。 –

+0

它無法處理這個問題,而不是說它是一個限制。當我們以本地模式運行作業時,它不會創建任何本地數據目錄,因此無法緩存文件。這就是文檔(https://developer.yahoo.com/hadoop/tutorial/module5.html#auxdata)所說的'作爲警告:如果您在Hadoop中使用本地JobRunner(即,如果您調用JobClient會發生什麼.runJob()在沒有或空的hadoop-conf.xml可訪問的程序中),則不會創建本地數據目錄; getLocalCacheFiles()調用將返回一組空的結果。' –

+0

的確,嘗試目錄不是在本地模式下創建的。但是,分佈式緩存支持符號鏈接,因爲一段時間(必須在MR1上啓用,默認情況下在MR2上啓用)。每個文件的當前目錄中都會創建一個符號鏈接。默認情況下,它具有與源文件相同的名稱;但是在URI中添加一個片段可以讓你改變它(也包括AFAIU *相對路徑)。在本地模式下,CWD是您啓動JVM的位置,而http://bit.ly/1NnyyHc創建符號鏈接。但是「#/ foo/name」由分佈式模式支持,但不支持本地模式(在ln之前需要一些mkdir)。 –