Spark分区:从单节点群集上的本地文件系统加载文件

时间:2018-07-28 13:22:31

标签: apache-spark

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

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

enter image description here

这里的逻辑是什么?

此外,我从文档中了解到,如果要从本地文件系统加载并使用群集,则文件必须位于属于该群集的所有计算机上的相同位置。这不会产生重复吗? Spark如何处理这种情况?如果您可以参考一些可以对此有所启发的文章,那将对您大有帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

引自:spark code

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

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

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

分区数等于defaultParallelism。您的情况是8。

从HDFS读取时,sc.textFile将取minPartitions和根据hadoop输入拆分大小除以块大小计算的拆分数之间的最大值。

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

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

文件必须在群集中的所有计算机上都可用,因为Spark可能会在群集中的计算机上启动执行程序,并且执行程序将使用(file://)读取文件。

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