gpt4 book ai didi

apache-spark - Spark分区: Loading a file from the local file system on a Single Node Cluster

转载 作者:行者123 更新时间:2023-12-02 03:32:03 25 4
gpt4 key购买 nike

我有兴趣了解 Spark 在从本地文件系统加载文件时如何创建分区。

我正在使用 Databricks 社区版来学习 Spark。当我使用 sc.textfile 命令加载一个大小只有几千字节(大约 300 kb)的文件时,spark 默认情况下会创建 2 个分区(由partitions.length 给出)。当我加载大约 500 MB 的文件时,它会创建 8 个分区(等于机器中的核心数量)。

enter image description here

这里的逻辑是什么?

此外,我从文档中了解到,如果我们从本地文件系统加载并使用集群,则该文件必须位于属于该集群的所有计算机上的同一位置。这不会创建重复项吗? Spark 如何处理这种场景?如果您能指出阐明这一点的文章,将会有很大帮助。

谢谢!

最佳答案

当 Spark 从本地文件系统读取时,默认的分区数量(由 defaultParallelism 标识)是所有可用核心的数量

sc.textFile 将分区数量计算为 defaultParallelism(本地 FS 情况下的可用核心数)和 2 之间的最小值。

def defaultMinPartitions: Int = math.min(defaultParallelism, 2)

引用自:spark code

第一种情况:文件大小 - 300KB

由于文件大小非常小,因此分区数计算为 2。

第二种情况:文件大小 - 500MB

分区数等于默认并行度。在你的例子中,它是 8。

从 HDFS 读取时,sc.textFile 将采用 minPartitions 和基于 hadoop 输入分割大小除以 block 大小计算得出的分割数之间的最大值。

但是,当将 textFile 与压缩文件(file.txt.gz 而不是 file.txt 或类似文件)一起使用时,Spark 会禁用拆分,从而导致 RDD 仅具有 1 个分区(因为对 gzip 压缩文件的读取无法并行化)。

对于有关从集群中的本地路径读取数据的第二个查询:

文件需要在集群中的所有机器上可用,因为 Spark 可能会在集群中的机器上启动执行器,并且执行器将使用 (file://) 读取文件。

为了避免将文件复制到所有机器,如果您的数据已经位于 NFS、AFS 和 MapR 的 NFS 层等网络文件系统之一中,那么您只需指定一个文件即可将其用作输入://小路;只要文件系统安装在每个节点上的相同路径上,Spark 就会处理它。每个节点都需要有相同的路径。请引用:https://community.hortonworks.com/questions/38482/loading-local-file-to-apache-spark.html

关于apache-spark - Spark分区: Loading a file from the local file system on a Single Node Cluster,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51571815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com