Hadoop 映射作业,将文件拆分为小文件,并在reduce阶段生成这些文件的名称

Hadoop 映射作业,将文件拆分为小文件,并在reduce阶段生成这些文件的名称,hadoop,mapreduce,Hadoop,Mapreduce,给定一个大文件,我需要迭代该文件的记录和每个记录 提取特定字段的值(状态) 将此记录添加到名为“status_u3;”+value的文件中 将该状态值发送到reducer 因此,输出将包含一组按状态分组的带有记录的文件,以及一些带有状态列表的文件 理想情况下,它应该 将具有状态的文件置于“输出目录/状态/状态”下(其中nnn是实际状态值) “输出目录/状态列表”将包含每行一个状态 这可能与hadoop有关吗?我发现了如何用这个方法生成每条记录的文件名,但不确定如何分离记录和枚举状态 我事

给定一个大文件,我需要迭代该文件的记录和每个记录

  • 提取特定字段的值(状态)
  • 将此记录添加到名为“status_u3;”+value的文件中
  • 将该状态值发送到reducer
因此,输出将包含一组按状态分组的带有记录的文件,以及一些带有状态列表的文件

理想情况下,它应该

  • 将具有状态的文件置于“输出目录/状态/状态”下(其中nnn是实际状态值)
  • “输出目录/状态列表”将包含每行一个状态
这可能与hadoop有关吗?我发现了如何用这个方法生成每条记录的文件名,但不确定如何分离记录和枚举状态


我事先不知道这些记录中可能存在哪些状态。

在映射阶段,每个记录可以执行2次发射:和
。“列表状态”必须是您事先选择的唯一键。然后在reduce阶段,您的行为取决于密钥,如果它等于您的特殊密钥,则您将发出一个带有状态的文件(例如,此reduce函数将所有状态存储在一个集合中),否则生成
文件


这对您有意义吗?

据我所知,不太有意义-我必须在reduce作业中创建文件,因此我将reducer的数量设置为1,或者我需要为每个reducer创建文件,这将需要稍后进行一些聚合。我真的不喜欢这两种方法。我不知道细节,但你可以明确地指定减速器的每个键都必须在一个单独的文件中结束:我想这篇文章解释了如何解决这个问题:在那个例子中,我需要提前知道状态的可能值,我不知道。不,你不知道。您使用reducer键来创建文件名,reducer键=状态?我认为这有点误解。我需要映射任务生成不同的文件,这取决于输入文件中记录的状态列,然后我想在单独的文件中聚合这些不同的状态值。因此,我可以在以后通过简单地迭代带有状态的文件内容并构建类似“status_255”的名称来查找带有记录的文件。