Apache Spark: Repartition vs Coalesce

Neng Liangpornrattana
1 min readOct 10, 2018

--

ตอนแรกว่าจะไม่ลง 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 ละกันครับ

References

--

--

Neng Liangpornrattana

A data plumber, basketballer, workout addicted, dog and cat lover