我有一个Spark 2.1作业,我在其中维护多个数据集对象/ RDD,它们代表我们底层的Hive / HDFS数据存储区的不同查询。我注意到,如果我只是遍历数据集列表,它们会一次执行一个。每个单独的查询都是并行运行的,但我觉得我们并没有通过不并行运行不同的数据集来最大化我们的资源。
关于这样做似乎并不是很多,因为大多数问题似乎是围绕并行化单个RDD或数据集,而不是在同一作业中并行化多个。
出于某种原因,这是不可取的吗?我可以只使用执行程序服务,线程池或期货来执行此操作吗?
谢谢!
答案 0 :(得分:2)
是的,您可以在驱动程序代码中使用多线程,但通常这不会提高性能,除非您的查询操作非常偏斜的数据和/或无法很好地并行化以充分利用资源。
你可以这样做:
val datasets : Seq[Dataset[_]] = ???
datasets
.par // transform to parallel Seq
.foreach(ds => ds.write.saveAsTable(...)