这可能是一个愚蠢的问题。但是,我想知道我是否有这样的事情 - rdd.mapPartitions(func)
。 func
中的逻辑应该是线程安全吗?
由于
答案 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中没有意义。
如果您在本地模式下运行,并使用全局状态或线程不安全函数,则作业可能会按预期工作,但未定义或支持行为。