[英]Hadoop - How to get a Path object of an HDFS file
我正在嘗試找出將內容/文件寫入Hadoop集群中的HDFS的各種方法。
我知道有org.apache.hadoop.fs.FileSystem.get()
和org.apache.hadoop.fs.FileSystem.getLocal()
創建輸出流並逐字節寫入。 如果您正在使用OutputCollector.collect()
則似乎不是寫HDFS的預期方式。 我相信您在實現Outputcollector.collect()
和Outputcollector.collect()
時必須使用Outputcollector.collect()
,如果我做錯了,請糾正我嗎?
我知道您甚至可以在運行作業之前設置FileOutputFormat.setOutputPath()
,但看起來這只能接受Path類型的對象。
在查看org.apache.hadoop.fs.path並查看path類時,我看不到任何允許您指定遠程或本地的內容。 然后,當查找org.apache.hadoop.fs.FileSystem時,我看不到任何返回路徑類型的對象的東西。
FileOutputFormat.setOutputPath()
是否始終必須寫入本地文件系統? 我不認為這是真的,我隱約記得讀過一個作業的輸出可以用作另一個作業的輸入。 這使我相信,還有一種方法可以將其設置為HDFS。 org.apache.hadoop.fs.FileSystem.get
和org.apache.hadoop.FileSystem.getLocal
返回一個FileSystem
對象,該對象是通用的,既可以實現為本地文件系統,也可以實現為分布式文件系統。
OutputCollector
不會寫入hdfs。 它僅提供了一種collect
方法,供映射器和約簡器收集數據輸出(中間和最終)。 順便說一句,它不贊成使用Context對象。
FileOutputFormat.setOuptPath
通過設置mapred.output.dir
設置最終輸出目錄,該目錄可以在本地文件系統上,也可以在分布式文件系統上。
關於遠程或本地fs.default.name
設置這些值。 如果將其設置為file:///
,它將使用本地文件系統。 如果設置為hdfs://
,它將采用hdfs,依此類推。
關於寫入FSDataOuputStream
無論采用FSDataOuputStream
方法寫入hadoop中的文件,都將在下面使用FSDataOuputStream
。 FSDataOutputStrem
是java.io.OutputStream
包裝。 順便說一句,只要您想用Java寫入文件系統,就已經為此創建了一個流對象。
FileOutputFormat具有FileOutputFormat.setOutputPath(job, output_path)
方法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。 同樣,也可以按每個作業級別覆蓋輸入。 -
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.