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 關注
- 969 瀏覽
添加回答
舉報