当Spark将源数据从文件加载到DataFrame时,哪些因素决定数据是完全加载到单个节点(很可能是驱动程序/主节点)上的内存中还是计算所需的最小并行子集中(大概是在工人/执行者节点上??
特别是,如果使用Parquet作为输入格式并通过Spark DataFrame API加载,需要考虑哪些因素以确保从Parquet文件加载并行化并延迟到执行程序,并且范围限于列有问题的执行程序节点上的计算需要什么?
(我希望了解Spark用于在分布式执行计划中安排源数据加载的机制,以避免因加载完整数据集而耗尽任何一个节点上的内存。)
答案 0 :(得分:1)
只要您使用spark操作,所有数据转换和聚合仅在执行程序上进行。因此不需要驱动程序加载数据,其工作是管理处理流程。驱动程序仅在您使用某些终端操作时获取数据,例如collect()
,first()
,show()
,toPandas()
,toLocalIterator()
等。此外,执行程序不会将所有文件内容加载到内存中,而是获取最小的可能块(称为分区)。
如果使用Parquet等列存储格式,则只加载执行计划所需的列 - 这是spark中的默认行为。
编辑:我刚看到spark中可能存在错误,如果您在架构中使用嵌套列,则可能会加载不必要的列,请参阅:Why does Apache Spark read unnecessary Parquet columns within nested structures?