Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark Listener在OnJob上执行钩子在执行器上完成?_Scala_Apache Spark_Apache Spark Sql_Hdfs - Fatal编程技术网

Scala Spark Listener在OnJob上执行钩子在执行器上完成?

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

我有一个简单的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 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)意味着将所有数据移动到驱动程序,这将是一个非常昂贵的操作。