Dataframe spark executor在切换到处理其他分区时如何持久化数据?

Dataframe spark executor在切换到处理其他分区时如何持久化数据?,dataframe,apache-spark,Dataframe,Apache Spark,例如,我只有一个具有4G内存的执行器和100个分区。每个分区最多需要处理2G数据 我将在dataframe上调用map函数。在map函数中,它将从s3存储器中读取拼花地板文件,将其反序列化为对象(通过thrift api),并返回对象的成员变量(类型为bytearray) 最后,我将调用df.write.mode(“overwrite”).parquet(write\u path)来写入另一个parquet文件 我的问题是,当executor切换到另一个分区来运行map函数时,它是否需要将当前分

例如,我只有一个具有4G内存的执行器和100个分区。每个分区最多需要处理2G数据

我将在dataframe上调用map函数。在map函数中,它将从s3存储器中读取拼花地板文件,将其反序列化为对象(通过thrift api),并返回对象的成员变量(类型为bytearray)

最后,我将调用
df.write.mode(“overwrite”).parquet(write\u path)
来写入另一个parquet文件

我的问题是,当executor切换到另一个分区来运行map函数时,它是否需要将当前分区数据“保存”到内存或磁盘中

我猜它会直接将数据写入新的拼花文件,而不是保存当前的分区数据(拼花写入也是一个类似于映射的函数?)


否则我不知道它如何保存如此巨大的数据量(100x2g=200G)

Apache spark操作是开始运行您的spark作业,每个执行器将读取几个数据块(块数将等于执行器中的内核数)并并行处理它们

ApacheSpark不会加载内存中的所有内容来处理它。这是因为当ApacheSpark读取文件(逐块并分布在您的节点上)时,Spark会将数据划分为更小的块,并分别对这些块进行操作,在内存中处理数据映射,然后再次将其保存到存储器中


    • 这里有两个独立的问题

    • 当executor切换到另一个分区以运行映射功能时,是否需要将当前分区数据“保存”到内存或磁盘中
    • 答案是肯定的。Spark需要一个单独的分区才能装入内存,也就是说,当执行器在某个分区上工作时,它将完全加载该分区。以前的进程分区将以易失性格式保存在内存/磁盘中,这意味着它们将不可用于不同的转换(请参阅以修复它)

    • 我猜它会直接将数据写入新的拼花文件,而不是保存当前的分区数据(拼花写入也是一个类似于映射的函数?)

    • 问题不在于拼花是否是类似于贴图的函数,而在于转换和写入之间是否存在一个洗牌边界。它们的工作方式是,所有不需要洗牌的后续转换形成一个阶段,每次将分区加载到内存中时,执行者都会在整个阶段中运行分区。因此,如果转换和写入之间没有无序边界,那么每个分区都将分别写入。这可以用Spark的(谷歌上的第一次点击)很容易地验证。

      你的意思是当它切换到处理另一个分区时,它仍然需要保存到存储中?我说的存储可以是内存或磁盘,对吗?在加载另一个要处理的分区之前,是否有一个配置来指定在哪里存储已处理的分区?我有一个spark作业,在处理一些分区后总是抛出OOM异常,所以我想这可能与此类配置有关。