3 回答

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個贊
當(dāng)Spark從HDFS讀取文件時,它將為單個輸入拆分創(chuàng)建一個分區(qū)。輸入拆分由InputFormat
用于讀取此文件的Hadoop設(shè)置。例如,如果您textFile()
將其TextInputFormat
用于Hadoop,它將為您返回單個HDFS塊的單個分區(qū)(但是分區(qū)之間的拆分將按行拆分而不是精確的塊拆分完成),除非您進(jìn)行了壓縮文本文件。如果是壓縮文件,則將為單個文件獲得單個分區(qū)(因?yàn)閴嚎s文本文件不可拆分)。
當(dāng)你調(diào)用rdd.repartition(x)
它會執(zhí)行從數(shù)據(jù)的洗牌N
你有partititons rdd
到x
你想擁有的分區(qū),分區(qū)將在循環(huán)賽的基礎(chǔ)上進(jìn)行。
如果您在HDFS上存儲了30GB的未壓縮文本文件,則使用默認(rèn)的HDFS塊大小設(shè)置(128MB),它將存儲在235個塊中,這意味著從該文件讀取的RDD將具有235個分區(qū)。當(dāng)您調(diào)用repartition(1000)
RDD時,它會被標(biāo)記為要重新分區(qū),但實(shí)際上,只有當(dāng)您在此RDD之上執(zhí)行操作時,它才會被改編為1000個分區(qū)(惰性執(zhí)行概念)

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個贊
這里是快照“ 如何在HDFS塊被裝載到星火工人分區(qū) ”
在此圖像中,將4個HDFS塊作為Spark分區(qū)加載到3個工作程序內(nèi)存中
示例:我在HDFS系統(tǒng)上放置了一個30GB的文本文件,該文件正在10個節(jié)點(diǎn)上分發(fā)。
會火花
a)使用相同的10個分區(qū)?
Spark將相同的10個HDFS塊作為分區(qū)加載到工作人員內(nèi)存中。我假設(shè)30 GB文件的塊大小應(yīng)為3 GB,以獲取10個分區(qū)/塊(默認(rèn)配置為conf)
b)當(dāng)我調(diào)用repartition(1000)時,在整個群集上隨機(jī)播放30GB?
是的,Spark會在工作程序節(jié)點(diǎn)之間隨機(jī)播放數(shù)據(jù),以便在工作程序內(nèi)存中創(chuàng)建1000個分區(qū)。
注意:
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貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個贊
當(dāng)使用spark-sql讀取未存儲桶的HDFS文件(例如鑲木地板)時,DataFrame分區(qū)的數(shù)量df.rdd.getNumPartitions取決于以下因素:
spark.default.parallelism (大致轉(zhuǎn)化為該應(yīng)用程序可用的#cores)
spark.sql.files.maxPartitionBytes (預(yù)設(shè)128MB)
spark.sql.files.openCostInBytes (默認(rèn)為4MB)
分區(qū)數(shù)量的粗略估算為:
如果您有足夠的內(nèi)核來并行讀取所有數(shù)據(jù)(即,每128MB數(shù)據(jù)至少有一個內(nèi)核)
AveragePartitionSize ≈ min(4MB, TotalDataSize/#cores)
NumberOfPartitions ≈ TotalDataSize/AveragePartitionSize
如果您沒有足夠的核心,
AveragePartitionSize ≈ 128MB
NumberOfPartitions ≈ TotalDataSize/AveragePartitionSize
確切的計(jì)算有些復(fù)雜,可以在FileSourceScanExec的代碼庫中找到,請參考此處。
- 3 回答
- 0 關(guān)注
- 976 瀏覽
添加回答
舉報(bào)