Scala Spark Listener在OnJob上执行钩子在执行器上完成?
我有一个简单的spark任务,它从S3读取csv数据,对其进行转换、分区并将其保存到本地文件系统 我在s3上有csv文件,内容如下 样本输入:日本,01-01-2020,天气,供应商,设备Scala Spark Listener在OnJob上执行钩子在执行器上完成?,scala,apache-spark,apache-spark-sql,hdfs,Scala,Apache Spark,Apache Spark Sql,Hdfs,我有一个简单的spark任务,它从S3读取csv数据,对其进行转换、分区并将其保存到本地文件系统 我在s3上有csv文件,内容如下 样本输入:日本,01-01-2020,天气,供应商,设备 case class WeatherReport(country:String, date:String, event:String, provide:String, device:String ) object SampleSpark extends App{ val conf = new S
case class WeatherReport(country:String, date:String, event:String, provide:String, device:String )
object SampleSpark extends App{
val conf = new SparkConf()
.setAppName("processing")
.setIfMissing("spark.master", "local[*]")
.setIfMissing("spark.driver.host", "localhost")
val sc = new SparkContext(conf)
val baseRdd = sc.textFile("s3a://mybucket/sample/*.csv")
val weatherDataFrame = baseRdd
.filter(_.trim.nonEmpty)
.map(x => WeatherReport(x))
.toDF()
df.write.partitionBy("date")
.mode(SaveMode.Append)
.format("com.databricks.spark.csv")
.save("outputDirectory")
}
文件保存在“outputDirectory/date=01-01-2020/part-”中,包含多个零件文件。
我想合并零件文件并删除前缀date=
name,比如“outputDirectory/01-01-2020/output.csv”,然后将其复制到S3
怎么可能做到呢
我曾想过像下面这样使用SparkListener,但我想它只会在驱动器上运行,但文件会出现在执行器上
sparkContext.addListener(new SparkListener {
override def onJobEnd(jobEnd: SparkListenerJobEnd) {
renameDirectory()
mergePartFilesToSingleFiles()
uploadFileToS3()
}
})
是否有一种方法可以在执行器和驱动程序上运行作业完成后挂钩,从而将其上的所有本地文件同步到S3?您可以使用
coalesce(1)
将文件合并到1。您可以从驱动程序本身调用renameDirectory()
。我认为你不需要一个监听器。我有巨大的文件,使用coalesce(1)意味着将所有数据移动到驱动程序,这将是一个非常昂贵的操作。