当前位置: 首页 > 知识库问答 >
问题:

一个作业更新另一个作业输出的最佳方法

卢聪
2023-03-14

下面是我的场景。我的工作是处理大量的csv数据,并使用Avro将其写入按日期划分的文件中。我得到了一个小文件,我想用它来更新这些文件中的一些附加条目,第二个作业我可以在需要时运行,而不是再次重新处理整个数据集。

这个想法是这样的:

  • job1:处理大量的csv数据,将其写入压缩的Avro文件中,并按输入日期拆分为文件。源数据不按日期划分,因此此作业将做到这一点。
  • job2(在Job1运行之间根据需要运行):处理小的更新文件,并使用它将条目添加到适当的Avro文件中。如果它不存在,则创建一个新文件。
  • job3(始终运行):从Job1(可能还有job2)的输出中生成一些用于报告的度量。

所以,我必须这样写一个Java作业。我的第一份工作似乎很好。3也是。我不知道如何处理工作2。

以下是我的想法:

  • 使用分布式缓存传递更新文件。解析这个文件,在Job类中生成一个日期列表,并使用它来过滤来自Job1的文件,这将是这个作业的输入。
  • 在映射器中,访问分布式更新文件,并将它们添加到我读入的avro对象集合中。如果文件还不存在呢?这管用吗?
  • 使用Reducer写入新的对象集合

共有1个答案

燕玉堂
2023-03-14

您可以遵循以下方法:

1)在所有csv文件上运行job1

2)在小文件上运行job2并创建新的输出

3)对于update,需要再运行一个作业,在这个作业中,在setup()方法中加载job2的输出,并将job1的输出作为map()输入,然后编写update的逻辑,生成最终的输出。

4)然后运行job3进行处理。

按照我的说法,这会管用的。

 类似资料:
  • 我试图在Azure Devops管道中将一个变量值从一个作业传递到另一个作业。 我一直在努力学习Microsoft文档中的文档。 例如: https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2cbatch https://docs.microsof

  • 我有两个工作(工作1,工作2)工作2取决于工作1的结果,所以它必须等到工作1完成 我需要用链子把它们锁起来: 谢谢你。

  • 我试图在节点JS中的另一个cron作业中运行一个cron作业。外部cron作业在第1天只执行一次:内部cron作业在第2天执行1次:内部cron作业在第3天执行2次:内部cron作业执行3次 为什么它要多次执行,尽管我在cron作业中调用它一次

  • 我想用Quartz实现下面的算法,但不确定是否可以做到。这是我第一次尝试使用石英。 用户通知作业-此作业计算每月报告并向用户发送电子邮件,它需要用户id和用于生成自定义用户报告的其他参数 可能需要生成10,000多个这样的报告 null 如何确保每月作业在单个事务中执行,以便识别所有需要每月报告的用户,并安排作业通知他们 如何立即安排作业在创建它们的作业之后立即执行? 我用的是Spring 3.2

  • 问题内容: 我想创建一个Jenkins作业来启动其他Jenkins作业。那将非常容易,因为Jenkins模板项目插件允许我们创建一个类型为“使用来自另一个项目的构建器”的构建步骤。但是,使我的情况更难的是,我必须在其他计算机上开始Jenkins的工作。有什么标准方法可以做到吗? 问题答案: 万一您只想触发Job的新版本,您有多种方法可以完成它 您可以使用远程访问API并触发请求以从源Job构建目标

  • 如何在单个作业中使用Spark根据密钥写入多个输出。 相关:按键写入多个输出扩展Hadoop,一个MapRe员作业 例如。 将确保为 而将是 编辑:我最近添加了一个新的答案,包括完整的导入,皮条客和压缩编解码器,请参阅https://stackoverflow.com/a/46118044/1586965,这可能是有帮助的,除了早期的答案。