我正在使用ApacheSpark将数据从SQL Server读取到CSV,版本详细信息如下:
- 实施‘com.microsoft.azure:spark-mssql-connector_2.12:1.2.0’
- 实现‘org.apache.spark:spark-core_2.12:3.1.3’
- 实现组:‘org.apache.spark’,名称:‘spark-SQL_2.12’,版本:‘3.1.3’
这里,每个导出到CSV的表数据通过以下可配置选项进一步拆分成多个任务:
- “Low Bound”
- “上行”
- “numPartitions”
- “分区列”
因此,假设NumPartition为5,则1个作业下将有5个任务
在以下方面寻求帮助:
在每个任务完成时,我需要执行一些特定于任务的操作(使用一些特定于任务的数据),那么有没有办法将一些侦听器连接到每个任务或作业?
我知道有一种方法可以通过extends SparkListener
来挂钩侦听器,但这种方法可以与整个SparkContext挂钩,而SparkContext不能执行特定于任务的操作。
2条答案
按热度按时间de90aj5v1#
正如其他人已经指出的,没有办法将监听程序附加到特定的一组任务。但是,使用mapPartitions,您可以在处理数据集的分区之后(或之前)执行任意代码。正如所讨论的,in this answer分区和任务密切相关。
作为示例,使用了一个两列十行的简单CSV文件。目标是将第二列转换为大写,并在分区处理完成后立即打印一条消息。
代码:
产出:
mapPartitions
中的代码在执行器中运行,因此上面的输出将出现在执行器日志中。t98cgbkg2#
您无法将监听程序附加到任务。如果您有任何特定的逻辑要在作业完成后执行,那么最好将多个作业提交到Spark集群。希望这个能帮上忙!