ทำความเข้าใจการทำงานแบบ Lazy Evaluation ใน PySpark

Jessada Weeradetkumpon
SCB TechX
Published in
2 min readSep 25, 2023
Photo by Daniel Bradley on Unsplash

การประมวลผลข้อมูลขนาดใหญ่ (Big Data) เป็นงานที่มีความซับซ้อนและต้องใช้ทรัพยากรในการประมวลผลมหาศาล ซึ่งเป็นสิ่งที่ท้าทายในการทำงานอย่างมาก การประมวลผลข้อมูลที่ใช้ PySpark จะมีสิ่งที่เรียกว่า Lazy Evaluation เป็นรูปแบบการทำงานที่จะทำให้การทำงานกับข้อมูลขนาดใหญ่มีประสิทธิภาพและประหยัดทรัพยากรที่ใช้ได้ดียิ่งขึ้น

ในบทความนี้จะพาไปรู้จัก Lazy Evaluation ใน PySpark เพื่อให้เข้าใจหลักการทำงานกับข้อมูลขนาดใหญ่ได้ดียิ่งขึ้น

Lazy evaluation: Postpone work until it’s truly needed, like a chef preparing dishes only when guests order. It’s efficient, resource-saving, and elegant in the world of programming.

What is Lazy Evaluation in PySpark?

Lazy Evaluation คือหลักการทำงานที่จะใช้ในการประมวลผล DataFrames ที่จะไม่ถูกประมวลผลทันทีที่มีการเรียกใช้คำสั่ง Transformation เพื่อคำนวณหรือดำเนินการกับข้อมูลแต่จะทำก็ต่อเมื่อมีการเรียกใช้คำสั่ง Actions เท่านั้น

Transformation — เป็นการดำเนินการที่ใช้กับ DataFrame เพื่อคำนวณหรือประมวลผลข้อมูล ตัวอย่างคำสั่งเช่น map, filter, flatMap และ groupBy เป็นต้น เมื่อมีการเรียกใช้คำสั่งเหล่านี้จะยังไม่มีการประมวลผลทันทีแต่จะมีการสร้างเป็นแผนลำดับการเรียกใช้คำสั่งในรูปแบบ directed acyclic graph (DAG)

Actions — เป็นการดำเนินการที่จะเริ่มต้นจากการวิเคราะห์แผนคำสั่งใน DAG ทั้งหมดที่สร้างขึ้นมาจากการเรียกใช้ Transformation เพื่อปรับลำดับของคำสั่งให้เหมาะสมว่าคำสั่งไหนควรจะดำเนินการก่อนหรือหลังเพื่อทำให้การประมวลผลข้อมูลขนาดใหญ่ทำได้อย่างมีประสิทธิภาพและลดการทำงานที่ไม่จำเป็น ยกตัวอย่างคำสั่งเช่น count, collect และ saveAsTextFile เป็นต้น

Example Code

เพื่อให้เห็นภาพการทำงานของ Lazy Evaluation มากขึ้นสามารถดูได้จากตัวอย่างโค้ดต่อไปนี้:

# Import needed libraries
from pyspark.sql.functions import col

# Create Dataframe
data = [("Alice", 1997, False),
("Bob", 1998, True),
("Charlie", 2000, True),
("David", 1999, True)]
columns = ["Name", "BirthYear", "Active"]
df = spark.createDataFrame(data, columns)

# Add new column Age
transform_df = df.withColumn("Age", (2023 - col("BirthYear")))

# Filter the DataFrame to select only rows with a Active is True
filtered_df = transform_df.filter(col("Active") == True)

# No computation has occurred yet

จากโค้ดด้านบนจะเห็นได้ว่ามีการเรียกใช้คำสั่ง Transformations (withColumn, filter) เพื่อทำการคำนวณหาอายุจากคอลัมน์ “BirthYear” แล้วเก็บไว้ในคอลัมน์ “Age” และมีการกรองข้อมูลที่ไม่ Active ออก แต่จากโค้ดชุดนี้จะยังไม่มีการดำเนินการคำนวณใด ๆ เกิดขึ้น เพียงแค่บันทึกคำสั่งไว้สร้างเป็น DAG

#Trigger and action (collect)
filtered_df.collect()

จากโค้ดด้านบนมีการเรียกใช้คำสั่ง Actions (count) ทำให้ Pyspark จะทำการวิเคราะห์คำสั่งทั้งหมดเพื่อเรียงลำดับแผนการดำเนินการคำสั่งในการประมวลผลข้อมูลโดย DAG และเริ่มทำการประมวลข้อมูลทันที

Output from example code
DAG from Spark Job

จากโค้ดตัวอย่างเมื่อทำการกดเข้าไปดูรายละเอียดการทำงานจาก Spark Job จะเห็นได้ว่าการทำงานเริ่มจากล่างขึ้นบนเริ่มต้นจากการอ่าน DataFrame (1) ถัดมาเป็นการ กรองข้อมูลออก (2) สุดท้ายจะเป็นการเพิ่มคอลัมน์ “Age” (3)

ซึ่งจะเห็นได้ว่าจาก DAG ใน Spark Job เมื่อเทียบกับโค้ดตัวอย่างจะสังเกตุได้ว่าการเขียนโค้ดได้มีการเรียกใช้คำสั่งให้เพิ่มคอลัมน์ก่อนที่จะกรองข้อมูล แต่พอเป็นการทำงานของ Lazy Evaluation จะทำการกรองข้อมูลออกก่อนเพื่อที่จะลดการคำนวณได้ทำให้ลำดับการทำงานจึงเปลี่ยนไป ด้วยเหตุนี้เองจึงทำให้การประมวลผลข้อมูลขนาดใหญ่มีประสิทธิภาพมากขึ้น

Advantages of Lazy Evaluation in PySpark

  • Optimization Opportunities — PySpark สามารถวิเคราะห์ลำดับของการประมวลผลคำสั่ง Transformation ทั้งหมดก่อนดำเนินการกับข้อมูลได้ทำให้สามารถมีการจัดการกับข้อมูลขนาดใหญ่ได้อย่างมีประสิทธิภาพ
  • Efficient Resource Usage — เนื่องจากการ Transformation จะไม่ดำเนินการทันที ทำให้ PySpark จึงสามารถหลีกเลี่ยงการคำนวณที่ไม่จำเป็นและลดการใช้หน่วยความจำโดยการตัดข้อมูลที่ไม่จำเป็นออกตั้งแต่เนิ่นๆ ก่อนเริ่มการประมวลผลข้อมูล
  • Fault Tolerance — ด้วยการที่มีการสร้าง DAG ก่อนการทำงานทุกครั้ง ทำให้ PySpark สามารถกู้คืนข้อมูลที่สูญหายและคำนวณใหม่เฉพาะส่วนที่จำเป็นในกรณีที่ระหว่างการประมวลผลข้อมูลเกิดความผิดพลาด ด้วยเหตุนี้เองจึงรับประกันว่าข้อมูลจะมีความถูกต้องสมบูรณ์ได้

Conclusion

Lazy Evaluation ใน PySpark มีข้อดีที่จะช่วยลดการใช้งานหน่วยความจำ โดยที่ไม่จำเป็นต้องเก็บข้อมูลทุกอย่างไว้พร้อมกันเพื่อใช้ในการประมวลผลและช่วยลดการทำงานซ้ำซ้อนของโปรแกรมเนื่องจากจะมีการวางแผนก่อนการประมวลผลทุกครั้งทำให้ลดการคำนวณที่ไม่จำเป็นได้ แต่อาจเกิดความยุ่งยากจากการที่จะไม่สามารถตรวจสอบได้ทันทีว่าคำสั่ง Transformation ที่ใช้ในการประมวลผลข้อมูลมีความถูกต้องหรือไม่ จากการที่คำสั่ง Transformation จะไม่ถูกดำเนินการจนกว่าจะมีการเรียกใช้คำสั่ง Action ดังนั้นการทำความเข้าใจการทำงานในลักษณะนี้ก่อนนำไปใช้งานจะทำให้สามารถจัดการข้อมูลขนาดใหญ่ได้อย่างมีประสิทธิภาพมากยิ่งขึ้น

ท้ายนี้ SCB TechX พร้อมให้คำปรึกษาและบริการด้าน Data Platform แบบครบวงจร จากผู้เชี่ยวชาญมืออาชีพผู้มีประสบการณ์ด้าน Data ให้แก่บริษัทชั้นนำมากมาย สนใจสอบถามข้อมูลเพิ่มเติมโปรดส่งรายละเอียดมาได้เลยที่ contact@scbtechx.io 😊

--

--