我使用Spark 2.1和Kafka 0.9。
在公平共享下,Spark以“循环”方式在作业之间分配任务,以便所有作业获得大致相等的群集资源份额。这意味着在长时间工作期间提交的短期工作可以立即开始接收资源,并且仍然可以获得良好的响应时间,而无需等待长时间的工作完成。
根据这个,如果我有来自多个线程的多个作业,在火花串流的情况下(来自每个线程的一个主题),如果我的集群中有足够的核心,或者它只是进行一轮,则可能同时运行多个主题知更鸟游泳池,但一次只能运行一份工作?
上下文:
我有两个主题T1和T2,都有一个1分区。我已将scheduleMode配置为FAIR的池。我有4个内核注册了spark。现在每个主题都有两个动作(因此有两个作业 - 主题共4个作业)假设J1和J2是T1和J3的作业,J4是主题T2的作业。在FAIR模式下正在执行的是执行J1 J3 J2 J4,但是在任何时候只执行一个作业。现在,由于每个主题只有一个分区,因此只使用一次核心而3个只是免费的。这是我不想要的。 我能避免这种情况吗?
答案 0 :(得分:2)
如果我有来自多个线程的多个作业......是否可以同时运行多个主题
是。这是FAIR调度模式的目的。
你可能已经注意到了,我删除了#34; Spark Streaming"从你的问题,因为它没有以任何方式贡献Spark如何安排Spark工作。是否从常规"开始你的Spark工作并不重要。应用程序或Spark Streaming。
引用Scheduling Within an Application(突出我的):
在给定的Spark应用程序(SparkContext实例)中,如果多个并行作业是从不同的线程提交的,则它们可以同时运行。
默认情况下,Spark的调度程序以FIFO方式运行作业。每项工作分为"阶段" (例如,映射和减少阶段),第一个作业优先处理所有可用资源,同时其阶段具有要启动的任务,然后第二个作业获得优先权等等。
然后你过去提出的问题现在应该更清楚。
还可以在作业之间配置公平共享。在公平分享下,Spark在“循环”中的作业之间分配任务。时尚,以便所有工作获得大致相等的集群资源份额。
因此,谈到Spark Streaming,您必须配置FAIR调度模式,Spark Streaming的JobScheduler应该并行提交每个主题的Spark作业(我们自己也没有对它进行测试,所以它&#39理论比实践更多。
答案 1 :(得分:0)
我认为公平的调度程序本身无济于事,因为它是负责提交Spark Jobs的Spark Streaming引擎,通常是以顺序模式执行。
Spark Streaming中有一个未记录的配置参数:spark.streaming.concurrentJobs
[1],默认设置为1
。它控制提交给Spark的作业的并行度。
通过增加此值,您可以看到并行处理流媒体作业的不同火花阶段。
我认为将此配置与Spark中的公平调度程序相结合,您将能够实现独立主题使用者的受控并行处理。这主要是未知领域。