【发布时间】:2015-07-18 07:14:52
【问题描述】:
我想在 Hadoop 中的 MapReduce 作业的工作目录中创建一个目录。
例如通过使用: 文件 setupFolder = new File(setupFolderName); setupFolder.mkdirs();
在我的映射器类中写入一些中间文件。这是正确的方法吗?
另外,在完成工作后,如果我愿意,我将如何再次访问该目录?
请指教。
【问题讨论】:
我想在 Hadoop 中的 MapReduce 作业的工作目录中创建一个目录。
例如通过使用: 文件 setupFolder = new File(setupFolderName); setupFolder.mkdirs();
在我的映射器类中写入一些中间文件。这是正确的方法吗?
另外,在完成工作后,如果我愿意,我将如何再次访问该目录?
请指教。
【问题讨论】:
如果您使用的是 java,您可以覆盖 setup 方法并在那里打开文件处理程序(并在 cleanup 中关闭它)。此句柄将可供所有映射器使用。
我假设您不是在此处编写所有地图输出,而是在此处编写一些调试/统计信息。使用此处理程序,您可以读取和写入,如本示例所示 (http://wiki.apache.org/hadoop/HadoopDfsReadWriteExample)
如果您想阅读整个目录,请查看此示例 https://sites.google.com/site/hadoopandhive/home/how-to-read-all-files-in-a-directory-in-hdfs-using-hadoop-filesystem-api
请记住,您将无法依赖写入文件的数据顺序。
【讨论】:
您可以在 reducer 类中覆盖 setupReduce(),使用 mkdirs() 创建文件夹并使用 create() 为输出流创建文件。
@Override
protected void setupReduce(Context context) throws IOException {
Configuration conf = context.getConfiguration();
FileSystem fs = FileSystem.get(conf);
fs.mkdirs(new Path("your_path_here"));
}
【讨论】: