java—hadoop map reduce中多个目录作为输入格式

tquggr8v  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(317)

我正在尝试使用hadoop在分布式系统中运行一个图形验证程序。我的输入格式如下:
目录1
---文件1.dot
---文件2.dot
…..
---文件.dot
目录2
---文件1.dot
---文件2.dot
…..
---文件.dot
目录670
---文件1.dot
---文件2.dot
…..
---文件.dot
.dot文件是存储图形的文件。
对我来说,使用路径添加输入目录就足够了吗 FileInputFormat.addInputPath() ?
我希望hadoop处理同一节点中每个目录的内容,因为每个目录中的文件包含的数据依赖于同一目录中其他文件的存在。
hadoop框架是否会将目录平均分配到集群的各个节点(例如,目录1到node1,目录2到node2……等等)并并行处理?
每个目录中的文件对于数据是相互依赖的(准确地说。。。
每个目录都包含一个文件(main.dot,它有一个非循环图,其顶点是其余文件的名称,
因此,我的验证器将遍历main.dot中存在的图的每个顶点,在同一目录中搜索同名文件,如果找到,则处理该文件中的数据。
同样地,所有文件都将被处理,并且显示处理目录中每个文件后的组合输出,
其余的目录也是这样。)
长话短说,就像著名的字数计算应用程序(如果输入是一本书)一样,hadoop将分割输入,并将任务分发到集群中的每个节点,Map程序在其中处理每一行并计算相关的字数。我如何在这里分割任务(顺便问一下,我需要分割吗?)
如何在这个场景中利用hadoop的强大功能,一些示例代码模板肯定会有所帮助:)

ie3xauqp

ie3xauqp1#

阿列克谢·谢斯塔科夫给出的解决方案将会奏效。但它并没有利用mapreduce的分布式处理框架。可能只有一个map进程将读取文件(包含所有输入文件路径的文件),然后处理输入数据。如何将目录中的所有文件分配给Map器,使Map器的数量等于目录的数量?一个解决方案可以使用“org.apache.hadoop.mapred.lib.multipleinputs”类。使用multipleinputs.addinputpath()为每个目录路径添加目录和Map类。现在,每个Map器可以获得一个目录并处理其中的所有文件。

k3fezbri

k3fezbri2#

您可以创建一个包含要处理的所有目录列表的文件:

/path/to/directory1
/path/to/directory2
/path/to/directory3

每个Map器将处理一个目录,例如:

@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
            }
        }
c90pui9n

c90pui9n3#

hadoop框架是否会将目录平均分配到集群的各个节点(例如,目录1到node1,目录2到node2……等等)并并行处理?
不,不会的。文件不会分发到每个节点,因为文件会复制到要处理的节点。相反,简单地说,每个节点都有一组要处理的文件路径,而不保证位置或数据局部性。然后datanode从hdfs中提取该文件并对其进行处理。
没有理由不直接从hdfs打开可能需要的其他文件。

相关问题