我使用spark 2.1和kafka 0.9。
在公平共享下,spark以“循环”的方式在作业之间分配任务,这样所有作业都可以获得大致相等的集群资源份额。这意味着在长作业运行时提交的短作业可以立即开始接收资源,并且仍然可以获得良好的响应时间,而无需等待长作业完成。
根据这一点,如果在spark流中我有来自多个线程的多个作业(每个线程一个主题),那么如果我的集群中有足够的内核,多个主题是否可能同时运行,或者它只是在池之间进行循环,但一次只运行一个作业?
上下文:
我有两个主题t1和t2,都有一个分区。我已经用schedulemode配置了一个池来公平。我在spark注册了4个核。现在每个主题都有两个操作(因此有两个作业-跨主题共有4个作业),假设j1和j2是t1的作业,j3和j4是t2的作业。spark在fair模式下执行的是j1 j3 j2 j4,但在任何时候都只执行一个作业。现在由于每个主题只有一个分区,所以只有一个核心被使用,3个是空闲的。这是我不想要的。有什么办法可以避免吗?
2条答案
按热度按时间eyh26e7m1#
如果我有来自多个线程的多个作业…有可能多个主题可以同时运行吗
对。这就是公平调度模式的目的。
正如你可能已经注意到的,我从你的问题中删除了“Spark流”,因为它对Spark如何安排Spark工作没有任何帮助。不管你是从“常规”应用程序还是spark流媒体应用程序开始你的spark工作,这都无关紧要。
在应用程序中引用调度(突出显示):
在给定的spark应用程序(sparkcontext示例)中,如果多个并行作业是从不同的线程提交的,那么它们可以同时运行。
默认情况下,spark的调度程序以fifo方式运行作业。每个作业被划分为“阶段”(例如map和reduce阶段),第一个作业在所有可用资源上获得优先级,而其阶段有任务要启动,然后第二个作业获得优先级,等等。
然后引用你曾经问过的问题,现在应该更清楚了。
还可以配置作业之间的公平共享。在公平共享下,spark以“循环”的方式在作业之间分配任务,这样所有作业都可以获得大致相等的集群资源份额。
所以,谈到spark streaming,你必须配置公平调度模式,spark streaming的jobscheduler应该并行提交每个主题的spark作业(我自己还没有测试过,所以这更像是理论而不是实践)。
aij0ehis2#
我认为光靠fair调度器是没有帮助的,因为spark流引擎负责提交spark作业,而且通常是以顺序模式提交的。
spark streaming中有一个未记录的配置参数:
spark.streaming.concurrentJobs
[1] ,设置为1
默认情况下。它控制提交给spark的作业的并行级别。通过增加此值,您可能会看到流式处理作业的不同spark阶段的并行处理。
我认为,将此配置与spark中的公平调度器相结合,您将能够实现独立主题使用者的受控并行处理。这大部分是未知领域。