Apache Spark: ผลกระทบของการแบ่งพาร์ติชันใหม่การเรียงลำดับและการแคชกับการเข้าร่วม


10

ฉันกำลังสำรวจพฤติกรรมของ Spark เมื่อเข้าร่วมโต๊ะกับตัวเอง ฉันกำลังใช้ Databricks

สถานการณ์จำลองของฉันคือ:

  1. อ่านตารางภายนอกเป็น dataframe A (ไฟล์อ้างอิงอยู่ในรูปแบบของเดลต้า)

  2. กำหนด dataframe B เป็น dataframe A โดยเลือกคอลัมน์บางคอลัมน์เท่านั้น

  3. เข้าร่วม dataframes A และ B ในคอลัมน์ 1 และคอลัมน์ 2

(ใช่มันไม่สมเหตุสมผลมากนักฉันแค่ทดลองทำความเข้าใจกลไกพื้นฐานของ Spark)

a = spark.read.table("table") \
.select("column1", "column2", "column3", "column4") \
.withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5")))))

b = a.select("column1", "column2", "columnA")

c= a.join(b, how="left", on = ["column1", "column2"])

ความพยายามครั้งแรกของฉันคือเรียกใช้รหัสตามเดิม (พยายาม 1) ฉันพยายามแบ่งพาร์ติชั่นและแคช (พยายาม 2)

a = spark.read.table("table") \
.select("column1", "column2", "column3", "column4") \
.withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5")))))
.repartition(col("column1"), col("column2")).cache()

ในที่สุดฉันก็แบ่งพาร์ทิชันเรียงและเก็บไว้

 a = spark.read.table("table") \
.select("column1", "column2", "column3", "column4") \
.withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5")))))
.repartition(col("column1"), col("column2")).sortWithinPartitions(col("column1"), col("column2")).cache()

หมุดที่เกี่ยวข้องที่สร้างขึ้นนั้นเป็นสิ่งที่แนบมา

คำถามของฉันคือ:

  1. เหตุใดในความพยายาม 1 ตารางจึงถูกแคชแม้ว่าจะไม่ได้ระบุแคชอย่างชัดเจน

  2. ทำไม InMemoreTableScan จึงตามมาด้วยโหนดอื่นของประเภทนี้เสมอ

  3. เหตุใดในการพยายามแคช 3 จึงปรากฏขึ้นในสองขั้นตอน

  4. เหตุใดในความพยายาม 3 WholeStageCodegen จึงติดตาม InMemoreTableScan หนึ่งเดียว (และเพียงอันเดียว)

พยายาม 1

พยายาม 2

ป้อนคำอธิบายรูปภาพที่นี่


ฉันสงสัยว่าตัวอ่าน DataFrame จะแคชข้อมูลโดยอัตโนมัติเมื่อแหล่งที่มาเป็นตารางภายนอก ฉันมีสถานการณ์ที่คล้ายกันซึ่งฉันกำลังอ่านข้อมูลจากตารางฐานข้อมูลในขณะที่สามารถดาวน์โหลดแท็บ "SQL" ใน 'Application details UI' แสดงจำนวนแถวที่ดาวน์โหลด แต่ไม่มีไฟล์ที่ถูกบันทึกในตำแหน่งที่ระบุ . ฉันเดาว่าจะรู้การนับเพราะแคชข้อมูลอยู่ที่ไหนสักแห่งและนั่นคือสิ่งที่ปรากฏบน DAG หากคุณอ่านข้อมูลจากไฟล์ข้อความในเครื่องคุณจะไม่เห็นสถานะแคช
ซาลิม

คำตอบ:


4

สิ่งที่คุณกำลังสังเกตใน 3 แผนนี้คือส่วนผสมของ DataBricks runtime และ Spark

ก่อนอื่นขณะที่เรียกใช้ DataBricks runtime 3.3+ การแคชจะถูกเปิดใช้งานโดยอัตโนมัติสำหรับไฟล์ปาร์เก้ทั้งหมด การกำหนดค่าที่สอดคล้องกันสำหรับสิ่งนั้น: spark.databricks.io.cache.enabled true

สำหรับแบบสอบถามที่สองของคุณInMemoryTableScanจะเกิดขึ้นสองครั้งเพราะถูกเรียกเมื่อเข้าร่วม spark พยายามคำนวณชุดข้อมูล A และชุดข้อมูล B แบบขนาน สมมติว่าผู้บริหารที่แตกต่างกันได้รับมอบหมายงานดังกล่าวข้างต้นทั้งคู่จะต้องสแกนตารางจากแคช (DataBricks)

สำหรับอันที่สามInMemoryTableScanไม่ได้อ้างถึงการแคชในตัวเอง หมายความว่าแผนตัวเร่งปฏิกิริยาอะไรก็ตามที่เกี่ยวข้องกับการสแกนตารางแคชหลายครั้ง

PS: ฉันมองไม่เห็นจุดที่ 4 :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.