如何确保Spark DataFrame从Parquet加载是分布式和并行的



当Spark将源数据从文件加载到DataFrame中时,哪些因素决定了数据是在单个节点(很可能是驱动/主节点)上完全加载到内存中,还是在计算所需的最小并行子集(可能是在worker/executor节点上)上加载到内存中?

特别是,如果使用Parquet作为输入格式并通过Spark DataFrame API加载,为了确保从Parquet文件加载是并行的并延迟到执行器,并且将范围限制在执行器节点上计算所需的列上,需要考虑哪些因素?

(我希望了解Spark在分布式执行计划中调度源数据加载的机制,以避免通过加载完整数据集来耗尽任何一个节点上的内存。)

只要使用spark操作,所有的数据转换和聚合都只在执行器上执行。因此,不需要驱动程序加载数据,它的工作是管理处理流。驱动程序仅在使用某些终端操作时获取数据,如collect(), first(), show(), toPandas(), toLocalIterator()等。此外,executor不会将所有文件内容加载到内存中,而是获取尽可能小的块(称为分区)。

如果你使用列存储格式,如Parquet,只加载执行计划所需的列-这是spark的默认行为。

编辑:我只是看到,可能有一个错误的火花,如果你使用嵌套的列在你的模式,那么不必要的列可能会加载,参见:为什么Apache spark读取不必要的嵌套结构中的Parquet列?

相关内容

  • 没有找到相关文章

最新更新