Apache Spark: Repartition vs Coalesce
ตอนแรกว่าจะไม่ลง blog แล้ว คือมันสั้นมาก
ใน stackoverflow ยังมีคนถามเลย
แต่ก็เอามาลงแหละ น่าจะช่วยเหลือคนที่สงสัยได้
คือไม่เคยสงสัย จนมาสังสัย แล้วก็หาคำตอบได้
จุดประสงค์ของทั้ง 2 method นี้คือ ต้องการมี RDD ตามจำนวน partition ที่กำหนด
Repartition
repartition จะทำการ re-distribute(ปกติจะเรียกว่า shuffle) ข้อมูลในทุก partition ให้มารวมหรือกระจายออกตามจำนวน partition ที่กำหนด เพื่อที่จะ balance จำนวน data ในแต่ละ partitionโดยจะสร้าง partition มาใหม่
ลด และ เพิ่ม partition
สมมติเรามี 3 partition แล้วเรียก rdd.repartition(2)
สิ่งที่จะเกิดขึ้นคือ มันจะ shuffle กระจายข้อมูลไปอยู่ที่ 2 partition
ถ้าเราเรียก rdd.repartition(4)
ก็จะทำเหมือนกัน แต่จะ shuffle กระจายไปให้มี 4 partition
Coalesce
doc ของ spark เองบอกว่า เอาไว้ลดจำนวน partition กรณีที่ filter dataset แล้วเหลือจำนวนน้อยลง(partition มาก disk I/O และ network I/O ก็มาก)
coalesce จะทำการย้ายข้อมูลใน partition ให้น้อย partition ที่สุด ให้มารวมตามจำนวน partition ที่กำหนด
ลด partition
สมมติเรามี 3 partition แล้วเรียก rdd.coalesce(2)
สิ่งที่จะเกิดขึ้นคือ จะมี 2 partition อยู่เหมือนเดิม(ไม่ถูก shuffle) และจะมี 1 partition หายไป จะถูก shuffle ไปอยู่กับใน partition ที่ไม่ถูก shuffle
เพิ่ม partition
เคสนี้ทำไม่ได้ครับ สมมติเรามี 3 partition ถ้าเรียก rdd.coalesce(4)
มันจะไม่ raise error ด้วย แต่ partition จะยังอยู่เท่าเดิมคือ 3
สรุป
ความแตกต่างก็คือ coalesce จะพยายามย้ายข้อมูลให้น้อย partition ที่สุด ในขณะที่ repartition จะสร้าง partition มาใหม่เลย
ตาม document ของ spark เองก็บอกว่าการ shuffle นั้นมันมีราคาสูง ราคาในที่นี้หมายถึงเวลาและ resource ที่จะถูกใช้ไปกับ disk I/O, data serialization และ network I/O ก็พยายามหลีกเลี่ยงการ shuffle ละกันครับ