3 回答
TA贡献2021条经验 获得超8个赞
当Spark从HDFS读取文件时,它将为单个输入拆分创建一个分区。输入拆分由InputFormat
用于读取此文件的Hadoop设置。例如,如果您textFile()
将其TextInputFormat
用于Hadoop,它将为您返回单个HDFS块的单个分区(但是分区之间的拆分将按行拆分而不是精确的块拆分完成),除非您进行了压缩文本文件。如果是压缩文件,则将为单个文件获得单个分区(因为压缩文本文件不可拆分)。
当你调用rdd.repartition(x)
它会执行从数据的洗牌N
你有partititons rdd
到x
你想拥有的分区,分区将在循环赛的基础上进行。
如果您在HDFS上存储了30GB的未压缩文本文件,则使用默认的HDFS块大小设置(128MB),它将存储在235个块中,这意味着从该文件读取的RDD将具有235个分区。当您调用repartition(1000)
RDD时,它会被标记为要重新分区,但实际上,只有当您在此RDD之上执行操作时,它才会被改编为1000个分区(惰性执行概念)
TA贡献1828条经验 获得超6个赞
这里是快照“ 如何在HDFS块被装载到星火工人分区 ”
在此图像中,将4个HDFS块作为Spark分区加载到3个工作程序内存中
示例:我在HDFS系统上放置了一个30GB的文本文件,该文件正在10个节点上分发。
会火花
a)使用相同的10个分区?
Spark将相同的10个HDFS块作为分区加载到工作人员内存中。我假设30 GB文件的块大小应为3 GB,以获取10个分区/块(默认配置为conf)
b)当我调用repartition(1000)时,在整个群集上随机播放30GB?
是的,Spark会在工作程序节点之间随机播放数据,以便在工作程序内存中创建1000个分区。
注意:
HDFS Block -> Spark partition : One block can represent as One partition (by default)
Spark partition -> Workers : Many/One partitions can present in One workers
TA贡献1887条经验 获得超5个赞
当使用spark-sql读取未存储桶的HDFS文件(例如镶木地板)时,DataFrame分区的数量df.rdd.getNumPartitions取决于以下因素:
spark.default.parallelism (大致转化为该应用程序可用的#cores)
spark.sql.files.maxPartitionBytes (预设128MB)
spark.sql.files.openCostInBytes (默认为4MB)
分区数量的粗略估算为:
如果您有足够的内核来并行读取所有数据(即,每128MB数据至少有一个内核)
AveragePartitionSize ≈ min(4MB, TotalDataSize/#cores)
NumberOfPartitions ≈ TotalDataSize/AveragePartitionSize
如果您没有足够的核心,
AveragePartitionSize ≈ 128MB
NumberOfPartitions ≈ TotalDataSize/AveragePartitionSize
确切的计算有些复杂,可以在FileSourceScanExec的代码库中找到,请参考此处。
- 3 回答
- 0 关注
- 918 浏览
添加回答
举报