我有几个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程序无法在群集模式下正常运行的基本知识?