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

我正在使用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?


素胚勾勒不出你
浏览 874回答 3
3回答

宝慕林4294392

当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个分区(惰性执行概念)

30秒到达战场

这里是快照“ 如何在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 

慕工程0101907

当使用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的代码库中找到,请参考此处。
打开App,查看更多内容
随时随地看视频慕课网APP