Hadoop - 如何获取HDFS文件的Path对象

时间:2014-05-07 01:15:54

标签: java hadoop

我正在尝试找出在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 个答案:

答案 0 :(得分:1)

org.apache.hadoop.fs.FileSystem.getorg.apache.hadoop.FileSystem.getLocal返回一个FileSystem对象,该对象是可以作为本地文件系统或分布式文件系统实现的通用对象。
OutputCollector doest写信给hdfs。它只为映射器和缩减器提供了一个方法collect来收集数据输出(中间和最终)。顺便说一下,它不赞成使用Context对象。
FileOutputFormat.setOuptPath通过设置mapred.output.dir设置最终输出目录,fs.default.name可以在本地文件系统上或分发。
关于远程或本地 - file:///设置这些值。如果您将其设置为hdfs://,则将采用本地文件系统。如果设置为FSDataOuputStream,它将采用hdfs,依此类推。
关于写入hdfs - 无论你采用什么方法写入hadoop中的文件,它都会在下面使用FSDataOutputStremjava.io.OutputStreamFileOutputFormat.setOutputPath(job, output_path) 的包装。顺便说一句,无论何时你想写入java中的文件系统,你都要为它创建一个流对象。
FileOutputFormat有方法FileOutputFormat.setOutputPath(job, new Path("hdfs://localhost:9000/path_to_file")) 代替output_path,你可以指定,是否你想要使用本地文件系统或hdfs,覆盖core-site.xml的设置。例如{{1}}将设置要写入hdfs的输出。将其更改为file:///,您可以写入本地文件系统。根据您的设置更改loclahost和portno。同样,也可以在每个作业级别覆盖输入。 -