为了账号安全,请及时绑定邮箱和手机立即绑定

Spark分区如何在HDFS中的文件上工作?

Spark分区如何在HDFS中的文件上工作?

素胚勾勒不出你 2019-10-16 11:10:39
我正在使用HDFS在集群上使用Apache Spark。据我了解,HDFS在数据节点上分发文件。因此,如果在文件系统上放置“ file.txt”,它将被拆分为多个分区。现在我打电话rdd = SparkContext().textFile("hdfs://.../file.txt") 来自Apache Spark。rdd现在是否已自动与文件系统上的“ file.txt”分区相同?我打电话时会发生什么rdd.repartition(x)其中x>那么hdfs使用的分区?Spark会在物理上重新排列hdfs上的数据以在本地工作吗?示例:我在HDFS系统上放置了一个30GB的文本文件,该文件正在10个节点上分发。Spark是否会使用相同的10个分区?和b)当我调用repartition(1000)时,在整个集群上随机播放30GB?
查看完整描述

3 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

当Spark从HDFS读取文件时,它将为单个输入拆分创建一个分区。输入拆分由InputFormat用于读取此文件的Hadoop设置。例如,如果您textFile()将其TextInputFormat用于Hadoop,它将为您返回单个HDFS块的单个分区(但是分区之间的拆分将按行拆分而不是精确的块拆分完成),除非您进行了压缩文本文件。如果是压缩文件,则将为单个文件获得单个分区(因为压缩文本文件不可拆分)。

当你调用rdd.repartition(x)它会执行从数据的洗牌N你有partititons rddx你想拥有的分区,分区将在循环赛的基础上进行。

如果您在HDFS上存储了30GB的未压缩文本文件,则使用默认的HDFS块大小设置(128MB),它将存储在235个块中,这意味着从该文件读取的RDD将具有235个分区。当您调用repartition(1000)RDD时,它会被标记为要重新分区,但实际上,只有当您在此RDD之上执行操作时,它才会被改编为1000个分区(惰性执行概念)


查看完整回答
反对 回复 2019-10-16
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

这里是快照“ 如何在HDFS块被装载到星火工人分区 ”


在此图像中,将4个HDFS块作为Spark分区加载到3个工作程序内存中


//img1.sycdn.imooc.com//5da68a5700016d1407200542.jpg

示例:我在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 


查看完整回答
反对 回复 2019-10-16
?
慕工程0101907

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的代码库中找到,请参考此处。


查看完整回答
反对 回复 2019-10-16
  • 3 回答
  • 0 关注
  • 854 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信