是什么决定了一个Spark执行器上可以并发运行多少任务?也许它是某种线程池和共享内存资源?
什么参数控制这种行为?
这是否意味着执行器中使用的代码应该始终是线程安全的?
是什么决定了一个Spark执行器可以同时运行多少任务?
Spark将特定Executor上的任务数映射到分配给它的核心数。默认情况下,Spark将一个核心分配给由默认为1的spark.task.cpus
参数控制的任务。
这是否意味着执行器中使用的代码应该始终是线程安全的?
没有。通常,使用RDD或DataFrame/Set是为了在转换内部进行本地工作,而不共享全局资源。当您有一个全局资源将在单个Executor进程内并行执行时,您应该考虑线程安全,当在同一个Executor上执行多个任务时,可能会发生这种情况。
控制并行执行的相关参数为:
spark.executor.instances
->执行的数量
spark.executor.cores
->每个执行器的核心数量
spark.task.cpus
->每cpu 的任务数
但是,并行执行多个任务并不意味着需要线程安全代码,因为这些任务彼此独立(它们不共享变量(