使用Spark结构化流媒体将ssv文件转换为s3上的镶木地板

时间:2018-04-21 11:32:58

标签: apache-spark apache-spark-sql spark-structured-streaming

我正在尝试创建一个Spark应用程序,它将从s3读取我的csv文件,将其转换为镶木地板文件并将结果写入s3。

我每分钟有8个新的csv文件用gzip压缩(每个gzip文件大约60MB),每行有~200列,~99%是同一天(我的分区列)。

群集有3名工作人员,10个核心,每个内存20 GB。

这是我的代码:

val spark = SparkSession
    .builder()
    .appName("Csv2Parquet")
    .config("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
    .config("fs.s3a.access.key", "MY ACESS KEY")
    .config("fs.s3a.secret.key", "MY SECRET")
    .config("spark.executor.memory", "15G")
    .config("spark.driver.memory", "5G")
    .getOrCreate()

import spark.implicits._

val schema= StructType(Array(
    StructField("myDate", DateType, nullable=false),
    StructField("myTimestamp", TimestampType, nullable=true),
    ...
    ...
    ...
    StructField("myColumn200", StringType, nullable=true)
    ))

val df = spark.readStream
    .format("com.databricks.spark.csv")
    .schema(schema)
    .option("header", "false")
    .option("mode", "DROPMALFORMED")
    .option("delimiter","\t")
    .load("s3a://my-bucket/raw-data/*.gz")
    .withColumn("myPartitionDate", $"myDate")

val query = df.repartition($"myPartitionDate").writeStream
    .option("checkpointLocation", "/shared/checkpoints/csv2parquet")
    .trigger(Trigger.ProcessingTime(60000))
    .format("parquet")
    .option("path", "s3a://my-bucket/parquet-data")
    .partitionBy(myPartitionDate)
    .start("s3a://my-bucket/parquet-data")

query.awaitTermination()

问题是只有一个任务负责将“主”分区(包括99%的事件)写入s3,处理此任务需要约4分钟。我该如何改进呢?

first stage

second stage

0 个答案:

没有答案