Spark多线程写入在集群模式下无法正常工作

时间:2018-07-29 13:22:52

标签: scala apache-spark hdfs yarn

我有几个Hive表要转换为Parquet格式并记下HDFS。基本上,我将这些表中的每个表都加载到Spark DataFrame中,并以Parquet格式写回。为了并行化更多的写入阶段(由于我正在使用12个执行程序,每个执行程序使用5个核心,因此DataFrame的单次写入应该已经并行化),我尝试产生多个线程,每个线程都用于写一个子集的表。

    val outputPath = "/user/xyz/testdb/tables"
    val db = "testdb"
    val partitionField = "nominal_time"
    val partition = "20180729"
    val numQueues = 6

    for (i <- 0 until numQueues) {
        val thread = new Thread {
            override def run(): Unit = {

                val tablesToProcess = queues(i)

                tablesToProcess.foreach(t => {
                    val table = t.trim.toUpperCase
                    val tempTable = "tmp_" + table
                    val destTable = table

                    var dataFrame = sqc.read.table(s"$db.$tempTable")                    

                    // write
                    dataFrame.write.
                        mode("overwrite").
                        format("parquet").
                        save(s"$outputPath/$destTable/$partitionField=$partition")

                    println(s"\n\nWrite completed for table $table\n")
                })
            }
        }
        thread.start()
    }  

此代码在YARN-CLIENT模式下可以正常工作,我可以观察到该过程完成所需时间的显着减少。 我不了解的事情是,当我在YARN-CLUSTER模式下启动相同的代码时,该工作完成得非常快(我不得不说太快了),但是它什么也没写。 我是否在这里遗漏了一些导致多线程spark程序无法在群集模式下正常运行的基本知识?

0 个答案:

没有答案