我正在尝试使用hadoop在分布式系统中运行图形验证器应用程序。 我有以下格式的输入:
directory1中
--- file1.dot
--- file2.dot
... ..
--- filen.dot
Directory2
--- file1.dot
--- file2.dot
... ..
--- filen.dot
Directory670
--- file1.dot
--- file2.dot
... ..
--- filen.dot
.dot文件是存储图形的文件。
使用FileInputFormat.addInputPath()
添加输入目录路径是否足够?
我希望hadoop处理同一节点中每个目录的内容,因为每个目录中存在的文件包含的数据取决于同一目录中其他文件的存在。
hadoop框架是否会将目录平均分配到集群的各个节点(例如,目录1到node1,目录2到node2 ......等等)并且并行处理?
每个目录中的文件相互依赖于数据(准确地说......
所以我的验证程序将遍历main.dot中存在的图形的每个顶点,在同一目录中搜索同名文件,如果找到则处理该文件中的数据。
同样会处理所有文件,并显示处理目录中每个文件后的合并输出,
相同的程序用于其余目录。)
长话短说 与着名的单词计数应用程序一样(如果输入是单本书),hadoop将拆分输入并将任务分配给集群中的每个节点,映射器处理每一行并计算相关单词。 我怎么能在这里拆分任务(顺便说一下,我需要分开吗?)
如何在这种情况下利用hadoop功能,一些示例代码模板将有助于确保:)
答案 0 :(得分:2)
Alexey Shestakov给出的解决方案将起作用。但它没有利用MapReduce的分布式处理框架。可能只有一个映射进程将读取该文件(包含所有输入文件的路径的文件),然后处理输入数据。 我们如何将目录中的所有文件分配给映射器,以便将有多个映射器等于目录数? 一个soln可能正在使用“org.apache.hadoop.mapred.lib.MultipleInputs”类。 使用MultipleInputs.addInputPath()为每个目录路径添加目录和映射类。现在每个映射器都可以获取一个目录并处理其中的所有文件。
答案 1 :(得分:1)
您可以创建一个包含要处理的所有目录列表的文件:
/path/to/directory1
/path/to/directory2
/path/to/directory3
每个映射器都会处理一个目录,例如:
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
FileSystem fs = FileSystem.get(context.getConfiguration());
for (FileStatus status : fs.listStatus(new Path(value.toString()))) {
// process file
}
}
答案 2 :(得分:0)
hadoop框架是否会将目录平均分配到集群的各个节点(例如,目录1到node1,目录2到node2 ......等等)并且并行处理?
不,它不会。在将文件复制到要处理的节点的意义上,文件不是分发到每个节点。相反,简单地说,每个节点都有一组文件路径要处理,不能保证位置或数据位置。然后,datanode从HDFS中提取该文件并对其进行处理。
没有理由不能直接从HDFS打开其他文件。