私たちは3人の顧客を持っているとし、それぞれに同じ作業を並行して実行したいと考えています。ドライバから複数のスパークジョブを同時に実行する
def doSparkJob(customerId: String) = {
spark
.read.json(s"$customerId/file.json")
.map(...)
.reduceByKey(...)
.write
.partitionBy("id")
.parquet("output/")
}
我々は同時に(スパークドライバからの)このようにそれを実行します。
val jobs: Future[(Unit, Unit, Unit)] = for {
f1 <- Future { doSparkJob("customer1") }
f2 <- Future { doSparkJob("customer1") }
f3 <- Future { doSparkJob("customer1") }
} yield (f1, f2, f3)
Await.ready(jobs, 5.hours)
は、私は、これは悪いアプローチであることを正しく理解していますか?多くのスパーク・ジョブは、エグゼクティブからお互いの文脈を押し出し、ディスクに溢れるデータが多数現れるようになります。どのようにスパークは並列ジョブからタスクを実行する管理ですか? 1人のドライバから3つの同時ジョブがあり、コアが1つのエグゼキュータが3人しかいない場合のシャッフルの表示方法。
良いアプローチは次のようになります: 私たちはすべての顧客のgroupByKeyすべてのデータをすべて読んで、私たちがしたいことをします。