从多线程驱动程序启动Apache Spark SQL作业

uh_*_*boi 2 java multithreading scala apache-spark apache-spark-2.0

我想使用Spark从约1500个远程Oracle表中提取数据,并且我想要一个多线程应用程序,该应用程序每个线程选择一个表,或者每个线程选择10个表,并启动一个Spark作业以从各自的表中读取数据。

从官方Spark网站https://spark.apache.org/docs/latest/job-scheduling.html来看,很明显它可以工作...

...运行Spark的集群管理器为跨应用程序调度提供了便利。其次,在每个Spark应用程序中,如果多个“作业”(Spark操作)是由不同的线程提交的,则它们可能同时运行。如果您的应用程序通过网络处理请求,则这很常见。Spark包含一个公平的调度程序,用于调度每个SparkContext中的资源。

但是,您可能已经在Spark中的此类SO 并发作业执行中注意到,该相似问题没有被接受的答案,而最受支持的答案始于

这实际上不是Spark的精神

  1. 每个人都知道这不是Spark的“精神”
  2. 谁在乎Spark的精神是什么?这实际上没有任何意义

有人以前有这样的东西可以工作吗?你有什么特别的事吗?在我浪费大量工作时间进行原型设计之前,只想提供一些建议。我真的很感谢任何帮助!

lev*_*lev 5

spark上下文是线程安全的,因此可以从多个线程并行调用它。(我正在生产中进行)

要注意的一件事是限制正在运行的线程数,因为:
1.执行程序内存在所有线程之间共享,并且您可能会获得OOM或不断从高速缓存中换入和换出内存
2. cpu是有限的,因此拥有比核心更多的任务不会有任何改善


YoY*_*oYo 5

您不需要在一个多线程应用程序中提交您的作业(尽管我确实认为您没有理由不能这样做)。只需将您的作业作为单独的流程提交即可。有一个脚本一次提交所有这些作业并将进程推送到后台,或者以纱线集群模式提交。您的调度程序(yarn、mesos、spark 集群)只会让您的某些作业等待,因为它没有空间让所有调度程序根据内存和/或 CPU 可用性同时运行。

请注意,如果您真正使用多个分区来处理您的表,我只会看到您的方法的好处 - 而不仅仅是我多次看到的一个。也因为您需要处理那么多表,我不确定您会受益多少(如果有的话)。根据您对表数据的处理方式,只运行多个单线程和非火花作业可能会更简单。

另请参阅@cowbert 他的笔记。