我有兴趣了解从本地文件系统加载文件时Spark如何创建分区。
我正在使用Databricks社区版来学习Spark。当我使用sc.textfile命令加载大小仅为几千字节(约300 kb)的文件时,spark默认情况下会创建2个分区(由partitions.length给出)。当我加载大约500 MB的文件时,它会创建8个分区(等于计算机中的内核数)。
这里的逻辑是什么?
此外,我从文档中了解到,如果要从本地文件系统加载并使用群集,则文件必须位于属于该群集的所有计算机上的相同位置。这不会产生重复吗? Spark如何处理这种情况?如果您可以参考一些可以对此有所启发的文章,那将对您大有帮助。
谢谢!
答案 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