RDD — หัวใจของ Spark

RDD ย่อมาจาก Resilient Distributed Datasets ซึ่งมีการกล่าวถึงอยู่บ่อยครั้งโดยเฉพาะงานของ Matei Zaharia ที่เป็นเปเปอร์ก็เช่น Spark: Cluster Computing with Working Sets ที่พูดถึงเรื่อง Spark ก็มีส่วนหนึ่งที่คุยเรื่อง RDD และ Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing ที่พูดถึงเรื่อง RDD นี้โดยเฉพาะเลย

RDD นี่เองที่ทำให้ Spark สามารถทำงานบน RAM ได้ เพราะมันเป็นตัวที่ Spark เอาไว้มองข้อมูลเป็น Abstraction Layer ทำให้ข้อมูลไม่จะเป็นต้องมีตัวตนบน RAM ตลอดเวลา RDD มันจะเก็บข้อข้อมูลที่เรียกว่า Lineage ซึ่งก็ไม่ได้มีอะไรซับซ้อนครับ ไอ้ Lineage นี่คือข้อมูลตัวมันมาได้ยังไง

$ ./bin/spark-shell
scala> val rdd0 = sc.parallelize(0 to 9)
scala> rdd0.toDebugString
res0: String = (2) ParallelCollectionRDD[0] at parallelize at <console>:24 []
scala> val rdd1 = rdd0.map(n => n*2)
scala> rdd1.toDebugString
res1: String = (2) MapPartitionsRDD[1] at map at <console>:26 []
| ParallelCollectionRDD[0] at parallelize at <console>:24 []
scala> val rdd2 = rdd1.map(n => n/2)
scala> rdd2.toDebugString
res2: String = (2) MapPartitionsRDD[2] at map at <console>:28 []
| MapPartitionsRDD[1] at map at <console>:26 []
| ParallelCollectionRDD[0] at parallelize at <console>:24 []

RDD เป็นลักษณะอ่านอย่างเดียวและทั้ง 3 RDD นี้จะรู้จักมามันเป็นใครมาจากไหนตาม rdd1 มาจากการสั่ง parallelize มันก็จะรู้ว่ามันสร้างมาจากคำสั่งนี้ ส่วน rdd1 จะรู้ว่ามันมาจาก rdd0 และเช่นเดียวกัน rdd2 มันจะรู้ว่ามันมาจาก rdd 1 กับ rdd0

ด้วยคุณสมบัตินี้ทำให้ RDD เก็บแค่วิธีที่จะได้ RDD ตัวมันมาต้องผ่านอะไรมาบ้างทำให้มันสามารถที่จะเริ่มคำนวณใหม่ในกรณีเกิดข้อผิดพลาดขึ้นได้ แถมตัวมันทำงานแบบ Lazy Evaluation คือถ้ามีเฉพาะ Transformation จะยังไม่ทำงานจนกว่าจะมี Action เกิดขึ้นถ้าจะว่าง่ายๆคือ RDD มันขี้เกียจจะทำงานก็ต่อเมื่อมีใครอยากได้ผลลัพธ์แล้ว ถ้าสั่งงานเฉยๆ มันจะโน๊ตไว้ยังไม่ทำ ถ้ายากรู้ว่าคำสั่งไหนเป็น Transformation คำสั่งไหนเป็น Action ลองหาอ่านเอกสารในเว็บของ Spark เพราะเปลี่ยนไปจากเดิมที่เขาสร้างหลายตัวโผล่เข้ามาจากที่เขียนเปเปอร์ตอนแรก ทีนี้เรามาดูว่าทำยังไงถึงจะได้ RDD มา

  1. File คืออ่านจากแหล่งเก็บเช่น HDFS
  2. Parallelizing มาจากการสร้างโดยใช้คำสั่ง parallelize ดูตัวอย่างด้านบนประกอบคือการสร้าง rdd0
  3. Transforming คือการที่เราสร้าง RDD ให้ม่จาก RDD ที่มีอยู่ก่อนแล้ว ในตัวอย่างคือ rdd1 และ rdd2 สร้างจาก rdd0 ที่มีอยู่ก่อนหน้าแล้ว
  4. Persistence มาจากการที่เรา Cache ข้อมูลหรือทำ Save ไว้แล้วเรียกมันกลับขึ้นมาอีกครั้ง

สรุปว่าเราจำเป็นต้องใช้ RDD แน่นอนถ้าเราต้องการใช้งาน Spark แต่ไม่ต้องกังวลไปครับการใช้งานมาตรฐานไม่มีอะไรซับซ้อนและหลายๆคำสั่งใช้แทนกันก็ยังไหว การทำงานพวกโปรแกรมพื้นฐานเช่นนับคำ sinvคำนวณง่ายๆ นี้แทบจะเรียกได้ว่าก๊อปวางจากอินเทอร์เน็ตได้เลย

References
[1]
https://jaceklaskowski.gitbooks.io/mastering-apache-spark
[2]
http://www-bcf.usc.edu/~minlanyu/teach/csci599-fall12/papers/nsdi_spark.pdf
[3]
https://people.csail.mit.edu/matei/papers/2010/hotcloud_spark.pdf

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.