2009-10-07 61 views
18

我需要將數據寫入Hadoop(HDFS),以從外部來源(例如Windows窗口)進行。現在我一直在將數據拷貝到namenode上,並使用HDFS的put命令將其載入到羣集中。在瀏覽代碼時,我沒有看到用於執行此操作的API。我希望有人能告訴我我錯了,並且有一種簡單的方法可以將外部客戶端編碼爲HDFS。將數據寫入Hadoop

回答

11

安裝cygwin,安裝Hadoop的本地(你只需要指向你NN的二進制和CONFIGS - 無需實際運行的服務),運行hadoop fs -copyFromLocal /path/to/localfile /hdfs/path/

您也可以使用新的Cloudera的桌面上傳一個文件通過網絡用戶界面,雖然這可能不是一個很好的選擇巨型文件。

還有一個HDFS的WebDAV覆蓋,但我不知道它是多麼穩定/可靠。

17

Java中有一個API。您可以通過在項目中包含Hadoop代碼來使用它。 的Javadoc一般相當有幫助,當然,你要知道,你在找什麼* G * http://hadoop.apache.org/common/docs/

爲了您的具體問題,來看看: http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/fs/FileSystem.html (適用於最新的!釋放,參考其他JavaDoc中的不同版本)

一個典型的電話是: Filesystem.get(new JobConf()).create(new Path("however.file")); 它返回你可以用常規JavaIO處理流。

+3

更具體地說(並且使用Hadoop罐code.jar {類名}運行) org.apache.hadoop.fs.FileSystem.get(新org.apache.hadoop.mapred.JobConf())。創建(新的有機.apache.hadoop.fs.Path( 「however.file」)); – 2012-02-09 10:59:19

13

對於加載需要放入HDFS的數據的問題,我選擇解決問題。

而不是從它們所在的服務器上傳文件到HDFS,我寫了一個Java Map/Reduce作業,其中映射器從文件服務器(在這種情況下通過https)讀取文件,然後直接寫入HDFS (通過Java API)。

從輸入中讀取文件列表。然後我有一個外部腳本,用一個文件列表填充文件,將文件上傳到HDFS(使用hadoop dfs -put),然後用適當數量的映射器啓動map/reduce作業。

這給了我很好的傳輸性能,因爲多個文件同時被讀取/寫入。

也許不是你正在尋找的答案,但希望無論如何有幫助:-)。

12

大約兩年後,我的最後一個答案,現在有兩個新的選擇 - Hoop/HttpFS和WebHDFS。

關於Hoop,它首先在Cloudera's blog中公佈,並且可以從github repository下載。我已經設法讓這個版本至少成功地與Hadoop 0.20.1進行對話,它可能也會與稍舊的版本進行交流。

如果您正在運行Hadoop 0.23.1,但在編寫本文時尚未發佈,Hoop將作爲Hadoop的一部分,作爲它自己的組件HttpFS。這項工作是作爲HDFS-2178的一部分完成的。 Hoop/HttpFS不僅可以作爲HDFS的代理,還可以作爲其他與Hadoop兼容的文件系統(如Amazon S3)的代理。

Hoop/HttpFS作爲自己的獨立服務運行。

還有WebHDFS它運行爲的NameNode和DataNode會服務的一部分。它還提供了一個REST API,如果我理解正確,它與HttpFS API兼容。 WebHDFS是Hadoop 1.0的一部分,它的主要特點之一是它提供數據局部性 - 當你發出一個讀請求時,你將被重定向到數據所在數據節點上的WebHDFS組件。

要選擇哪個組件取決於您當前的設置以及您需要什麼。如果你現在需要一個HTTP REST接口到HDFS,並且你運行的版本不包括WebHDFS,那麼從github倉庫中的Hoop開始看起來就像是最簡單的選擇。如果你正在運行一個包含WebHDFS的版本,我會這樣做,除非你需要Hoop有一些WebHDFS缺乏的功能(訪問其他文件系統,帶寬限制等)

3

似乎有一個專門的頁面現在此在http://wiki.apache.org/hadoop/MountableHDFS

這些項目(下面列舉的)允許被安裝HDFS(在大多數 口味的Unix)作爲使用mount命令一個標準的文件系統。 一旦安裝,用戶可以使用標準的Unix工具(如'ls','cd','cp','mkdir','find', 'grep')或使用標準的Posix庫像打開,寫,讀,從C,C++,Python和Ruby,Perl和Java的,慶典等緊密

後來,它描述了這些項目

  • 的contrib /保險絲的DFS建立在保險絲,一些C膠水,libhdfs和hadoop-dev.jar上
  • 保險絲-J-HDFS是建立在保險絲,保險絲Java和Hadoop的dev.jar
  • HDFS熔絲 - 一個谷歌代碼項目是非常相似的contrib /保險絲的DFS
  • 的WebDAV - HDFS暴露WebDAV資源MAPR - 包含一個封閉源代碼的HDFS是支持讀/寫 NFS訪問
  • HDFS NFS代理兼容的文件系統 - 出口HDFS作爲NFS不使用保險絲。支持Kerberos並重新排序寫入,以便順序寫入hdfs 。

我還沒有嘗試過任何這些,但我會很快更新的答案,因爲我有同樣的需求爲OP

0

現在還可以嘗試使用了Talend,其中包括組件Hadoop集成。