Spark转换和动作的逻辑是否应该是线程安全的?

时间:2017-02-15 04:13:44

标签: java apache-spark thread-safety rdd

这可能是一个愚蠢的问题。但是,我想知道我是否有这样的事情 - rdd.mapPartitions(func)func中的逻辑应该是线程安全吗?

由于

3 个答案:

答案 0 :(得分:4)

简短的回答是否定的,它不一定是线程安全的。

原因是spark在分区之间划分数据。然后它为每个分区创建一个任务,并且您编写的函数将作为单个线程操作在该特定分区中运行(即,没有其他线程可以访问相同的数据)。

也就是说,您必须确保不通过访问不是RDD数据的资源手动创建线程“不安全”。例如,如果您创建静态对象并访问它,则可能会导致问题,因为多个任务可能在同一个执行程序(JVM)中运行并且也可以访问它。也就是说,除非你确切知道自己在做什么,否则你不应该做那样的事情......

答案 1 :(得分:1)

传递给 <security> <!-- change in 4.8: Disabled users are now showed dimmed and last in the tree. If you prefer not to display them set this to true --> <hideDisabledUsersInBackoffice>true</hideDisabledUsersInBackoffice> </security> (或任何其他操作或转换)的任何函数都必须是线程安全的。 JVM上的Spark(对于客户语言来说不一定如此)使用执行程序线程,并且不保证各个任务之间的任何隔离。

当您使用未在函数中初始化但通过闭包传递的资源时,这一点尤其重要,例如在main函数中初始化但在函数中引用的对象。

不言而喻,除非明确允许,否则不应修改任何参数。

答案 2 :(得分:-3)

当你执行&#34; rdd.mapPartitions(func)&#34;时,func实际上可能在不同的jvm中执行!线程在JVM中没有意义。

如果您在本地模式下运行,并使用全局状态或线程不安全函数,则作业可能会按预期工作,但未定义或支持行为。

相关问题