在不增加核心的情况下增加Spark Executor中的并行度

时间:2016-12-13 23:11:00

标签: oracle apache-spark spark-streaming

我正在运行一个带有4个执行器(每个1个核心)的Spark-Kafka Streaming作业。而kafka源主题有50个分区。

在流式java程序的foreachpartition中,我正在连接到oracle并做一些工作。 Apache DBCP2用于连接池。

Spark-streaming程序与数据库建立4个连接 - 每个执行程序可能为1。但是,我的期望是 - 由于有50个分区,应该有50个线程在运行并且存在50个数据库连接。

如何在不增加内核数量的情况下增加并行度。

2 个答案:

答案 0 :(得分:4)

你的期望是错误的。一个核心是Spark命名法中的一个可用线程和一个可以在当时处理的分区。

4“核心” - > 4个主题 - > 4个分区经过精心处理。

答案 1 :(得分:1)

在spark执行器中,每个核心逐个处理分区(一次一个)。由于您有4个执行程序,每个执行程序只有1个核心,这意味着您一次只能同时处理4个分区。因此,如果您的Kafka有50个分区,那么您的火花群需要运行13轮(每轮4个分区,50/4 = 12.5)来完成批处理作业。这也是为什么你只能看到4个数据库连接的原因。