当前位置: 首页 > 知识库问答 >
问题:

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

顾跃
2023-03-14

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

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

最后,我将调用df。写模式(“覆盖”)。拼花(write\u path)写入另一个拼花文件。

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

我猜想它会直接将数据写入新的拼花文件,而不是保存当前的分区数据,(拼花写入也是一个类似地图的功能?)

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

共有2个答案

贺立果
2023-03-14

Apache火花动作是开始运行您的Spark作业,每个执行程序将读取几个数据块(块的数量将等于执行程序中的内核数量)并并行处理它们。

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

  • https://www2.eecs.berkeley.edu/Pubs/TechRpts/2014/EECS-2014-12.pdf
傅英喆
2023-03-14

这里有两个独立的问题。

  1. 当执行程序切换到另一个分区运行map函数时,是否需要将当前分区数据“保存”在内存或磁盘中?

答案是肯定的。Spark需要一个单独的分区来适应内存,即当执行程序将在一个分区上工作时,它将完全加载它。之前处理的分区将以易失性格式保存在内存/磁盘中,这意味着它们将无法用于不同的转换(请参阅缓存以修复它)。

问题不在于拼花是否是映射式函数,而在于转换和写入之间是否存在无序边界。它们的工作方式是,所有不需要洗牌的后续转换形成一个阶段,每次将分区加载到内存中时,执行者都会在整个阶段中运行分区。因此,如果转换和写入之间没有无序边界,那么每个分区都将单独写入。这可以通过Spark的执行图(首次在Google上找到)轻松验证。

 类似资料:
  • 其实相对于VIP的切换,动态修改持久化则是比较常见的一个需求,一般在一主多从多Sentinel的HA环境中,为了性能常常在Master上关闭持久化,而在Slave上开启持久化,但是如果发生切换就必须有人工干预才能实现这个功能。可以利用client-reconfig-script自动化该进程,无需人工守护,我们就以RDB的动态控制为例: Sentinel配置文件如下: sentinel client

  • 将SQL插入/更新表达式嵌入到刷新中 此功能允许将数据库列的值设置为SQL表达式,而不是文字值。它对于原子更新、调用存储过程等特别有用。您所要做的就是为属性分配一个表达式:: class SomeClass(Base): __tablename__ = "some_table" # ... value = Column(Integer) someobject = se

  • 我有一个Spring批处理作业,它从DB读取并写入CSV。批处理作业正在尝试使用我正在从中读取的数据库来保存批处理的状态。我不希望这种事发生。我正在使用Spring4。 经过大量的搜索,我尝试了两种方法,但都失败了。 方法1: null 我得到的例外情况如下。虽然例外并不是一个节目停止,我想摆脱它。 错误日志:

  • 本文向大家介绍svn 将工作副本切换到其他分支,包括了svn 将工作副本切换到其他分支的使用技巧和注意事项,需要的朋友参考一下 示例 可以快速转换现有的工作副本以反映同一存储库中不同分支的内容。例如,您可能有主干的工作副本,现在需要在开发分支上工作。您可以使用以下svn switch命令来有效地修改现有的工作副本,而不必检出一个全新的工作副本(这会浪费大量时间和磁盘空间): 现在,您的工作副本将反

  • 问题内容: 人们如何处理Docker容器的持久性存储? 我当前正在使用这种方法:构建映像(例如针对PostgreSQL),然后使用以下命令启动容器 恕我直言,这有一个缺点,我绝对不能(偶然)删除容器“ c0dbc34fd631”。 另一个想法是将主机卷“-v”安装到容器中,但是, 用户ID 的容器内不一定匹配 用户ID 从主机,然后权限可能会混乱。 注意:例如,您可以使用where 是分配给仅数据

  • 不幸的是只返回“{}”,这意味着在还原时a将变成空对象。 我发现es6 mapify允许在映射和普通对象之间进行上/下转换,所以这可能是一种解决方案,但我希望我需要借助外部依赖来保持映射。