将文本文件转换为镶木地板格式时,火花作业表现不佳

时间:2017-08-16 15:21:52

标签: performance scala apache-spark spark-streaming bigdata

我有一个火花流应用程序,它负责动态地将文本文件转换为镶木地板格式,然后将数据保存在外部配置单元表中。请参考上面提到的代码片段,它是处理文本文件的类之一:

object HistTableLogic {val logger = Logger.getLogger("file")
        def schemadef(batchId: String) {
    println("process started!")
    logger.debug("process started")
    val sourcePath = "some path"
    val destPath = "somepath"
    println(s"source path :${sourcePath}")
    println(s"dest path :${destPath}")
    logger.debug(s"source path :${sourcePath}")
    logger.debug(s"dest path :${destPath}")

    //  val sc = new SparkContext(new SparkConf().set("spark.driver.allowMultipleContexts", "true"))
    val conf = new Configuration()
    println("Spark Context created!!")
    logger.debug("Spark Context created!!")

    val spark = SparkSession.builder.enableHiveSupport().getOrCreate()
    println("Spark session created!")
    logger.debug("Spark session created!")

    val schema = StructType.apply(spark.read.table("hivetable").schema.fields.dropRight(2))
    try {
        val fs = FileSystem.get(conf)
                                spark.sql("ALTER table hivetable drop if exists partition (batch_run_dt='"+batchId.substring(1,9)+"', batchid='"+batchId+"')")

                fs.listStatus(new Path(sourcePath)).foreach(x => { 
                    val df = spark.read.format("com.databricks.spark.csv").option("inferSchema","true").option("delimiter","\u0001").
                    schema(schema).csv(s"${sourcePath}/"+batchId).na.fill("").repartition(50).write.mode("overwrite").option("compression", "gzip")
                    .parquet(s"${destPath}/batch_run_dt="+batchId.substring(1,9)+"/batchid="+batchId)

                    spark.sql("ALTER table hivetable add partition (batch_run_dt='"+batchId.substring(1,9)+"', batchid='"+batchId+"')")
                    logger.debug("Partition added")
                })

    } catch {
    case e: Exception => {
        println("---------Exception caught---------!")
        logger.debug("---------Exception caught---------!")
        e.printStackTrace()
        logger.debug(e.printStackTrace)
        logger.debug(e.getMessage)
    }
    }
}}

我在另一个java类的main方法中传递上面类的schemadef方法,该方法具有接收batchIds 24x7的逻辑,通过自定义接收器设置。 从功能上来说,应用程序运行良好,但需要大约15分钟来处理甚至1GB的数据。如果我尝试通过LOAD查询简单地将数据加载到hive表中,它会在一分钟内发生。

参考下面的火花作业配置:

SPARK_MASTER    YARN
SPARK_DEPLOY-MODE   CLUSTER
SPARK_DRIVER-MEMORY 13g
SPARK_NUM-EXECUTORS 6
SPARK_EXECUTOR-MEMORY   15g
SPARK_EXECUTOR-CORES    2

如果您发现我可以采取的此优化或任何其他优化措施中的任何缺陷,请通知我以加强此过程。谢谢

0 个答案:

没有答案