Scala Spark多线程写入在群集模式下无法正常工作
我有几个表格要转换成格式并写下来。基本上,我将这些表格中的每一张装入Spark中,然后以拼花格式写回。为了进一步并行化写入阶段(一个数据帧的单次写入应该已经并行化,因为我使用12个执行器,每个执行器5个内核),我尝试生成几个线程,每个线程用于写入表的子集Scala Spark多线程写入在群集模式下无法正常工作,scala,apache-spark,hdfs,yarn,Scala,Apache Spark,Hdfs,Yarn,我有几个表格要转换成格式并写下来。基本上,我将这些表格中的每一张装入Spark中,然后以拼花格式写回。为了进一步并行化写入阶段(一个数据帧的单次写入应该已经并行化,因为我使用12个执行器,每个执行器5个内核),我尝试生成几个线程,每个线程用于写入表的子集 val outputPath = "/user/xyz/testdb/tables" val db = "testdb" val partitionField = "nominal_time" val parti
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()
}
val outputPath=“/user/xyz/testdb/tables”
val db=“testdb”
val partitionField=“标称时间”
val partition=“20180729”
val numQueues=6
为了{
val table=t.trim.toUpperCase
val tentable=“tmp_389;”+表格
val destTable=表格
var dataFrame=sqc.read.table(s“$db.$tentable”)
//写
dataFrame.write。
模式(“覆盖”)。
格式(“拼花地板”)。
保存(s“$outputPath/$destTable/$partitionField=$partition”)
println(s“\n\n表$table的写入已完成\n”)
})
}
}
thread.start()
}
该代码在Thread-CLIENT模式下运行良好,我可以观察到完成该过程所需的时间显著减少。
我不明白的是,当我在纱线集群模式下启动相同的代码时,作业完成得非常快(我不得不说太快了),但它什么也没写。
我是否遗漏了导致多线程spark程序在群集模式下无法正常工作的一些基本问题?此问题可能导致大量问题。您真的应该查看日志,了解它崩溃的原因。因为如果所有配置都正确,没有真正的理由说明作业将在客户端模式下工作,而不是在群集模式下。@IlyaBrodezki所有配置都应该正确,因为我可以在客户端和群集模式下运行多个Spark程序,并获得相同的结果。只有在我使用多线程的特定情况下,我才会在客户端和群集模式之间体验到不同的行为。正如我所说的,可能会有很多问题,例如,spark中hdfs连接的定义可能依赖于群集没有的本地内容。我有一些代码可以完成您在集群模式下尝试执行的大部分操作。你看过日志了吗?如果运行:纱线日志-applicationId | grep ERROR,您会看到什么?你的跑步是否以成功结束?你所说的“蜂巢桌”与“拼花格式”是什么意思?!?一个简单的配置单元查询就足以将原始的基于CSV的数据推送到基于拼花地板的数据中。