amazon s3—spark和s3如何交互

zsohkypk  于 2021-07-13  发布在  Spark
关注(0)|答案(2)|浏览(493)

我想知道在下面的场景中,数据是如何加载到spark中的:
s3中以Parquet格式存储了10GB的事务数据,我将运行spark程序对10GBParquet文件中的每个记录进行分类(例如收入、购物、用餐)。
我有以下问题:
这10 gb是如何分配到spark集群中的不同工作区的?加载到spark master中的10gb文件是否会分割数据并发送给执行者?
如果这些都发生在记忆里?如果其中一个执行器在作业运行期间崩溃,那么主执行器是否会再次从s3加载10gb文件,并提取应该由崩溃的执行器处理的数据子集,然后发送给另一个执行器?

bybem2ql

bybem2ql1#

这10 gb是如何分配到spark集群中的不同工作区的?加载到spark master中的10gb文件是否会分割数据并发送给执行者?
答:spark遵循主从结构。我们有一个主节点(驱动程序/协调器)和多个分布式工作节点。驱动程序进程在主节点上运行,程序的主要方法在驱动程序进程中运行。驱动程序进程创建sparksession或sparkcontext。驱动程序进程根据沿袭图中代码中的转换和操作操作将用户代码转换为任务。驱动程序创建逻辑和物理计划,一旦物理计划就绪,它就会与集群管理器协调,让执行者完成任务。驱动程序只是跟踪每个执行器的数据(元数据)状态。
因此,10gb文件不会加载到主节点。s3是一个分布式存储,spark以分离的方式从中读取数据。驱动程序进程只是决定如何分割数据以及每个执行器需要处理什么。即使缓存数据,它也仅基于executors正在处理的分区/数据缓存在executors节点上。此外,除非调用count、collect等操作,否则不会触发任何操作。它会创建一个沿袭图和dag来跟踪此信息。
如果这些都发生在记忆里?如果其中一个执行器在作业运行期间崩溃,那么主执行器是否会再次从s3加载10gb文件,并提取应该由崩溃的执行器处理的数据子集,然后发送给另一个执行器?
答:正如第一个问题所回答的,任何东西只有在执行任何操作时才会被加载到内存中。加载到内存并不意味着它将被加载到驱动程序内存中。根据动作数据加载到驱动程序或执行程序的内存中。如果你用过 collect 操作所有内容都会加载到驱动程序内存中,但对于其他操作,如 count 如果缓存了dataframe,那么数据将加载到每个executor节点上的内存中。
现在,如果其中一个执行器在运行作业期间崩溃,那么驱动程序拥有崩溃执行器拥有的沿袭图信息和数据(元数据),因此它在其他执行器上运行相同的沿袭图并执行任务。这就是spark具有弹性和容错性的原因。

o2gm4chl

o2gm4chl2#

每个工人将发出1+get请求的范围内的Parquet文件,它已经给;它在文件中寻找更多的信息。整个10gb文件从未加载到任何地方。
每个工人都将对自己的分工进行自己的解读;这与存储/碎片的总体io容量有关。

相关问题