2014-05-07 44 views
0

我試圖找出在Hadoop集羣中將內容/文件寫入HDFS的各種方法。Hadoop - 如何獲取HDFS文件的路徑對象

我知道有org.apache.hadoop.fs.FileSystem.get()org.apache.hadoop.fs.FileSystem.getLocal()來創建一個輸出流並逐字節地寫入。如果您正在使用OutputCollector.collect(),它似乎不是寫入HDFS的預期方式。我相信你在使用Mappers和Reducers時必須使用Outputcollector.collect(),如果我錯了,請糾正我的錯誤?

我知道你甚至可以在運行作業之前設置FileOutputFormat.setOutputPath(),但它看起來像只能接受Path類型的對象。

在看org.apache.hadoop.fs.path並查看路徑類時,我沒有看到任何允許指定遠程或本地的東西。然後,當查找org.apache.hadoop.fs.FileSystem我看不到任何返回類型路徑的對象。

  1. 是否FileOutputFormat.setOutputPath()總是要寫入本地文件系統?我不認爲這是真的,我依稀記得,讀到一份工作的產出可以用作另一份工作的投入。這使我相信還有一種方法可以將它設置爲HDFS。
  2. 如上所述,寫入HDFS以使用數據流的唯一方法是?

回答

1

org.apache.hadoop.fs.FileSystem.getorg.apache.hadoop.FileSystem.getLocal返回FileSystem對象,它是指能夠實現既作爲本地文件系統或distibuted文件系統。
OutputCollector doest寫入hdfs。它僅爲映射器和縮減器提供了一種方法collect來收集數據輸出(中間和最終)。順便說一句,它不推薦使用Context對象。
FileOutputFormat.setOuptPath通過設置mapred.output.dir來設置最終輸出目錄,它可以位於本地文件系統或分佈式系統上。
關於遠程或本地 - fs.default.name設置這些值。如果您將其設置爲file:///它將採用本地文件系統。如果設置爲hdfs://它將採取hdfs等。
關於寫入hdfs - 不管寫入hadoop文件的方法如何,它都將使用下面的FSDataOuputStreamFSDataOutputStremjava.io.OutputStream的包裝。順便說一下,每當你想用java編寫一個文件系統時,你就已經爲它創建了一個流對象。
FileOutputFormat的方法FileOutputFormat.setOutputPath(job, output_path)代替output_path,您可以指定是否要使用本地文件系統或hdfs,覆蓋core-site.xml的設置。例如FileOutputFormat.setOutputPath(job, new Path("hdfs://localhost:9000/path_to_file"))將設置輸出以寫入hdfs。將其更改爲file:///,然後可以寫入本地文件系統。根據您的設置更改loclahost和portno。以同樣的方式,輸入也可以在每個工作級別被覆蓋。 -

+0

我現在在我的午餐/當我回家時給它一個鏡頭。這似乎解釋了我需要的一切。如果/當它工作,我會接受答案。謝謝你的幫助錢德拉。 –

+0

我剛剛檢查過我的'conf/core-site.xml'文件,我已經有'hdfs://'設置了。我的輸出到我的本地文件系統。如何在使用'FileOutputFormat.setOutputPath()時指定HDFS路徑'它必須接受像'new Path(fileVar)'這樣的東西,但似乎返回一個本地路徑而不是HDFS路徑,無論我在我的'conf/core-site.xml'文件。 –

+0

ok ..所以你的設置從core-site.xml不導入。使用conf.addResource(「path_to_core-site.xml」)。現在試試。順便說一句,你使用一些IDE或使用jar嗎?在jar的情況下,你不應該需要這個明確的設置。 –