我想弄清楚由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類似。它們實際上是一個由兩個文件構成的目錄:索引文件和數據文件。這兩個文件必須具有特定名稱(index
和data
),並且必須位於相同的目錄中。
如果我希望能夠將至少兩個「文件」放入分佈式緩存中,我不能將這些文件壓扁到根目錄中。我必須保留/定義一個文件層次結構。
設置:Hadoop 2.6.0/CDH 5.4/Crunch。因爲我正在使用Crunch,所以我不得不使用已棄用的DistributedCache
API,因爲Job.addCachefile()
未公開。
問題需要回答
- 是它在本地模式的錯誤還是我濫用分佈式緩存?
- 人們如何將諸如
MapFile
或SortedKeyValueFile
之類的內容插入到Hadoop緩存中?
1 - 你可以把一個斷點'LocalDistributedCacheManager.setup()'來請參閱即使在本地模式下也配置分佈式緩存(也許這是一個Pig限制?)。 2- SortedKeyValueFile被故意使用,使用內存集合中沒有選項。我可以在每次嘗試的開始時自己複製本地文件系統上的兩個文件。但它破壞了分佈式緩存的有效性,並需要額外的代碼來清理本地混亂中的混亂。 –
它無法處理這個問題,而不是說它是一個限制。當我們以本地模式運行作業時,它不會創建任何本地數據目錄,因此無法緩存文件。這就是文檔(https://developer.yahoo.com/hadoop/tutorial/module5.html#auxdata)所說的'作爲警告:如果您在Hadoop中使用本地JobRunner(即,如果您調用JobClient會發生什麼.runJob()在沒有或空的hadoop-conf.xml可訪問的程序中),則不會創建本地數據目錄; getLocalCacheFiles()調用將返回一組空的結果。' –
的確,嘗試目錄不是在本地模式下創建的。但是,分佈式緩存支持符號鏈接,因爲一段時間(必須在MR1上啓用,默認情況下在MR2上啓用)。每個文件的當前目錄中都會創建一個符號鏈接。默認情況下,它具有與源文件相同的名稱;但是在URI中添加一個片段可以讓你改變它(也包括AFAIU *相對路徑)。在本地模式下,CWD是您啓動JVM的位置,而http://bit.ly/1NnyyHc創建符號鏈接。但是「#/ foo/name」由分佈式模式支持,但不支持本地模式(在ln之前需要一些mkdir)。 –