2012-06-21 32 views
3

我有權訪問具有基本R(2.14.1)但每個節點中未安裝附加軟件包的Hadoop集羣。我一直在編寫基本的R mapper和reducer流腳本來解決這個事實,即我沒有額外的軟件包。但是,我已經到了需要使用某些軟件包的地步,主要是rjson,作爲我的腳本的一部分。在Hadoop節點上臨時安裝R包以進行流式傳輸作業

我沒有羣集的管理員權限,並且用戶帳戶相當有限。讓集羣管理員在每個節點上安裝軟件包不是一個選項(現在),並且集羣沒有外部Internet訪問權限。

我已經將rjson_0.2.8.tar.gz源文件上傳到我的網關節點。是否可以通過在這些行中添加install.packages("rjson_0.2.8.tar.gz", repos = NULL, lib = /tmp)或某些東西來臨時安裝R包,以便在腳本啓動時安裝包,並通過流作業的-cacheArchive參數傳遞源代碼?我希望將軟件包安裝在臨時位置,以便在作業完成時消失。

這甚至可能嗎?

我知道我會得到一些「使用python」的答案,因爲它是用於處理JSON,這是一個選項,但問題是任何包。 :)

回答

1

您應該能夠按照您的建議使用-cacheArchive參數 - 但請注意,這已被棄用,您應該使用-archives來代替。

另一點需要注意的是,使用-archives而不是-files將意味着您的tar.gz文件將由任務跟蹤器解壓縮(而不是您必須手動解壓縮它)。

無論哪種方式,當您的代碼執行時,文件或解包文件將在當前工作目錄中可用,並且從那裏您將能夠根據R中可用的機制註冊模塊包(我從未使用過R,所以你從這裏你自己)

2

我是rmr(項目RHadoop)的作者。我們正在嘗試一種非常激進的方法,以避免安裝問題。我們將整個R發行版,軟件包和所有內容封裝在一個jar中,使用您所描述的流式特性,但具有一定程度的間接性。 R分發被加載到用戶hdfs目錄,而不是tmp目錄。流然後將其移動到每個節點。只要工作不存在,工作本身就會將其移至最終目的地。我們這樣做是因爲整個發行版並不是很小,我們希望利用流式傳輸的緩存功能,再加上R的組件不可重定位。所以,當你更新某個東西或添加一個包時,你會重建jar並將它移動到hdfs。其餘部分是自動的,只在需要時纔會發生(hdfs-> nodes-> final location)。我甚至從Hortonworks傢伙那裏得到了一些指導,做對了。我們在分支0安裝中有一個概念驗證,但它僅適用於ubuntu/EC2,顯然我設法硬編碼了一些我不應該擁有的路徑,並且我正在做一些其他假設,所以這只是對於願意參與的開發者來說,但主要成分都已到位。當然,這是有條件的,你用rmr編寫你的工作,這是一個單獨的決定,或者你可以看看代碼,併爲你的目的重現方法。但我寧願一勞永逸地爲所有人解決這個問題。腳本製備罐子是這樣的:https://github.com/RevolutionAnalytics/RHadoop/blob/0-install/rmr/pkg/tools/0-install/setup-jar和動作的其餘部分是在RMR ::: rhstream

+0

這聽起來像一個有趣的方法。我想了解更多。我的環境是RHEL。我實際上嘗試從網關源安裝一個軟件包,但由於用戶限制,我得到了「無法編譯」錯誤。我嘗試的另一種方法是在另一臺RHEL計算機上tar.gz軟件包的安裝目錄,並將其作爲歸檔文件提交,但是我還沒有能夠讓它工作。 – wahalulu

0

用戶可以創建一個臨時目錄(例如,使用臨時文件從řmkdtemp從蟒)。確保該目錄的名稱是唯一的,否則R將在多個映射器同時將軟件包安裝到同一位置時報告錯誤。該臨時目錄可用作install.packages的庫位置。該目錄位於由mapred.child.tmp屬性定義的位置中。在默認設置下,它將在相應的映射器完成後被刪除。您還可以將mapred.child.tmp設置爲特定位置(例如,-D mapred.child.tmp=/tmp/),但Hadoop可能不會刪除臨時目錄。