Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark多线程写入在群集模式下无法正常工作_Scala_Apache Spark_Hdfs_Yarn - Fatal编程技术网

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

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

我有几个表格要转换成格式并写下来。基本上,我将这些表格中的每一张装入Spark中,然后以拼花格式写回。为了进一步并行化写入阶段(一个数据帧的单次写入应该已经并行化,因为我使用12个执行器,每个执行器5个内核),我尝试生成几个线程,每个线程用于写入表的子集

    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的数据推送到基于拼花地板的数据中。