Spark คืออะไร เกิดขึ้นมาได้ยังไง หัวข้อที่ Data Engineer ต้องรู้
บทความนี้เราจะมาเล่าหัวข้อหนึ่งที่สำคัญในสาย Data Engineer มากๆ คือ Spark นั่นเอง
Table of content:- Apache Spark คืออะไร?
- ที่มาของ Apache Spark และ Databricks
- เล่น Spark ยังไงได้บ้าง
- Core architecture
- Cluster
- Spark Applications คืออะไร
- SparkSesson คืออะไร
- 2 types of APIs
- Low-level API
- High-level API (Structured API)
- สรุป
- Further reading
Apache Spark คืออะไร ?
Apache Spark is a unified computing engine and a set of libraries for parallel data processing on computer cluster
Apache Spark คือเครื่องมือหนึ่งในการ process ข้อมูลขนาดใหญ่แบบ parallel โดยมันคือ Unified Platform ที่สามารถทำได้ตั้งแต่งาน data analytics, โหลดข้อมูลในรูปแบบที่หลากหลาย, ต่อได้กับ tools อื่นๆ, ทำ SQL query, Machine learning จนไปถึง streaming computing
ความ Unified ของ spark มีหลายอย่างไม่ว่าจะเป็น libraries API อย่าง
- Spark SQL — สำหรับ data processing ผ่าน SQL
- Pandas API on Spark — ถ้าเรารู้ pandas อยู่แล้วและยังใช้อยู่ แต่อยากใช้ความสามารถของ spark เพื่อ process ข้อมูลที่ใหญ่ขึ้นก็ย่อมได้
- MLlib — สำหรับทำ Machine Learning
- GraphX — ทำ graph analytics
- Structured Streaming — สำหรับการทำ streaming processing และ incremental computation
ซึ่งก่อนที่ Spark จะเกิด ก็ไม่มีใครพยายามสร้าง unified engine ไหนสำหรับ parallel data processing เลย
ผลประโยชน์ตรงนี้เลยทำให้สะดวกแก่คนที่ทำงานด้าน data engineering, data science, analyst มากๆ อย่าง data engineer ก็ใช้ spark ในการ transform ข้อมูล, data scientist ใช้ spark ที่เขียนได้ผ่านทั้ง Python และ R นำไปทำ modeling หรือ analyst ที่สามารถ query ข้อมูลผ่าน SQL ได้
Computing engine
Spark นั้น perform เรื่อง computation เพียงอย่างเดียว ไม่ได้ทำหน้าที่เป็น storage
ซึ่งแตกต่างจาก Hadoop เพราะ Hadoop จะมี computing system เรื่อง MapReduce และ storage system เป็นของตัวเองคือ Hadoop File System HDFS ซึ่ง integrate เข้าด้วยกันอย่างใกล้ชิด
แต่ถึงอย่างนั้นก็เถอะ Spark สามารถรันบน Hadoop storage ได้นะ
ที่มาของ Apache Spark และ Databricks
จุดเริ่มต้นของ Apache Spark เริ่มที่ UC Berkeley ในปี 2009 ซึ่งตอนนั้นเป็น research project ใน lab ที่ชื่อว่า AMPlab
ณ ขณะนั้นมีเพียง Hadoop MapReduce ที่ทำเรื่องของ parallel programming engine โดยเป็น opensource เดียวที่สามารถทำ data processing กระจายบนหลาย node ได้ ซึ่ง Hadoop เองก็มีข้อจำกัดบางอย่าง ดังนั้นทีมในแลปจึงได้คิดค้น Spark ขึ้นมา
Spark ได้นำข้อดีของ MapReduce — resilient distribute processing framework ซึ่งเป็น framework ที่ทำให้ Google สามารถ index ข้อมูลบน web ได้มหาศาลข้าม clusters เพื่อรองรับทั่วโลกมาแล้ว
ซึ่งข้อดีหลายอย่างนั้นจะเป็น scalable, distributed และ fault-tolerant processing แต่ตัว Spark ทำได้ดีกว่า MapReduce หนึ่งในนั้นคือ process ข้อมูลได้ไวกว่าเพราะ cache ข้อมูลใน memory แต่ MapReduce นั้น read และ write ข้อมูลจาก disk
Spark สร้างจากภาษา Scala ซึ่งใน version แรก Spark รองรับแค่ batch processing เท่านั้น
ต่อมา AMPlab ก็สร้าง Shark ขึ้น
Shark คือ engine ที่ทำให้รัน SQL query บน Spark ได้ ซึ่งมีประโยชน์กับ data scientist และ data analyst เป็นอย่างมาก ภายหลังก็ค่อยเกิด MLlib, Spark Streaming และ GraphX ซึ่งทำให้ Spark นั้นครอบคลุมการเป็น end-to-end big data applications
ภายหลังในปี 2013 พอ Spark เริ่มถูกใช้แพร่หลายและมีการ contributors มากมายหลายบริษัท ไม่เพียงใน UC berkeley เท่านั้น, AMPlab จึง contribute ตัว Spark มาเป็น Apache Software Foundation และคนที่อยู่ในทีม AMPlab ช่วงแรกก็ได้เริ่มสร้างบริษัทที่ชื่อว่า Databricks ขึ้น
ปัจจุบัน Spark ได้รับความนิยม และถูกใช้เพื่อประมวลผลข้อมูลขนาดใหญ่ในหลายบริษัท ไม่ว่า Uber, Netflix, NASA, CERN และสถาบันอย่าง MIT และ Harward ในการทำ scientific analysis
เล่น Spark ยังไงได้บ้าง
Spark เองสร้างจากภาษา Scala ที่รันบน Java Virtual Machine (JVM) ซึ่งเราสามารถใช้ Spark language API ทำให้เราสามารถรัน Spark code หลายๆภาษาได้ เช่น Scala, Java, Python, SQL และ R
หากอยากใช้ผ่าน Python ก็เพียงแค่มี Python, ถ้าอยากใช้ผ่าน R ก็แค่ลง R, แต่หากเป็น Scala หรือ Java ต้องลง Maven dependency เป็นตัว coordinate
หรืออีกทางเลือกคือสามารถเล่น Spark ผ่าน Databricks Community Edition ก็ได้ ซึ่งอันนี้ไม่ต้องเสียเวลาติดตั้ง environment เอง ก็สามารถเล่น Spark ได้เลย ข้อดีคือใช้ฟรี
Core Architecture
- Cluster
- Spark Application
- Structured API
Cluster
ลองจินตนาการว่าหากเราต้องการแค่เปิดยูทูป, ฟังเพลง, ดูหนัง ใช้เครื่อง computer 1 เครื่องก็เพียงพอแล้ว
แต่ในเรื่องของการ process ข้อมูลนั้น บางครั้งข้อมูลก็มีปริมาณที่เยอะเกินกว่า 1 เครื่องจะทำงานได้
cluster จึงเป็นรวมเครื่อง computer หลายเครื่อง ที่มีหลายๆ machine มาช่วยกัน process ข้อมูล
แต่อย่างไรก็ตาม มีแค่ cluster มันไม่พอ เราจำเป็นต้องมี framework ที่คอยจัดการให้เครื่องพวกนี้ทำงานร่วมกันได้ด้วย ซึ่งคือ cluster manager เพื่อคอยดู resource
ในพาร์ทของการรันบน cluster ตัว Spark เองสามารถรันได้ด้วยตัวเอง หรือจะผ่าน cluster managers ก็ได้
- Standalone Mode (วิธีที่ง่ายสุด Spark มี cluster manager ในตัวมันเอง)
- Apache Mesos (deprecated ไปใน Spark 3.2.0 แล้ว)
- Yarn
- Kubernetes (ซึ่งเราเคยเขียนวิธีติดตั้ง Spark on Kubernetes แบบเก็บ log ไปที่ Cloud Storage )
โดยหากเรา submit Spark applications ไปที่ cluster managers แล้ว ตัว cluster manager ก็จะทำหน้าที่จัดแจงงานให้
Spark Applications คืออะไร
Spark applications คือ user program ใน Spark ที่ประกอบไปด้วย driver process และ executor process
Driver process ทำหน้าที่เหมือนเป็นสมอง หน้าที่หลักในการรัน main() function ของ application, maintain information ต่างๆ, ตอบโต้ user’s program, กระจายงาน, สร้าง SparkContext
ส่วน Executor process จะเป็นแรงงาน เป็น process ที่อยู่บน worker node (node ที่รัน application code ใน cluster) Executor process นำงานที่ได้รับ assign จาก driver ไปทำ หน้าที่หลักคือ execute code ที่ถูก assign มา แล้วนำผลลัพท์ไป report กับ driver
Driver กับ executors สามารถอยู่บน machine เครื่องเดียวกัน หรือต่าง machine ก็ได้ ขึ้นอยู่กับ cluster mode
โลกของ Spark มี term เยอะมาก แนะนำให้อ่านหน้านี้ https://spark.apache.org/docs/latest/cluster-overview.html#glossary
คราวนี้ทุกคนพอเข้าใจศัพท์ต่างๆใน Spark แล้ว ยังเหลืออีกตัว
SparkSession คืออะไร
ก่อน Spark 2.0 นั้นตัว SparkContext จะเป็นช่องทางที่ทำให้เรา access Spark ได้ แต่ตั้งแต่ Spark 2.0 เป็นไปจะเป็น SparkSession ที่เป็นคนทำหน้าที่นี้แทน
Spark session is a unified entry point of a spark application from Spark 2.0
แต่ไม่ใช่ว่า SparkSession จะทดแทนแบบ 100% นะ เราก็ยังใช้ SparkContext ผ่าน SparkSession ได้อยู่
เราควบคุม Spark Application ผ่าน driver process ที่เรียกว่า SparkSession โดยที่ SparkSession instance จะเป็นวิธีที่ Spark execute user-defined manipulation ภายใน cluster
ยกตัวอย่างหน้าตา SparkSession ที่เราใช้ โดยเราเขียนเป็น Python
ส่วนด้านล่างเป็น SparkContext โดย config ด้านล่างเป็นการ connect ไป GCS
Spark มี API 2 รูปแบบคือ
- Low-level API (unstructured)
- High-level API (Spark’s structured API)
1. Low-level unstructured API
เช่น Resilient Distributed Datasets (RDDs) คือ collection ของ elements partitioned ที่กระจายไปตาม node ใน cluster ที่ทำงาน parallel กัน
RDDs นั้น support 2 operations
- transformations — สร้าง dataset ใหม่
- actions — return value ไปหา driver program หลัง compute dataset เสร็จ
ทุก transformations ใน spark จะ lazy คือมันจะไม่ compute ทันทีแต่จะจำไว้ว่า transformations นี้มันยุ่งกับ base dataset หรือไฟล์อะไร ถึงตอนที่มันจะ compute จริงๆ ถึงตอนนั้น action ค่อยเกิดขึ้นแล้ว return ค่าไปหา driver program ซึ่งเปรียบเทียบแล้ว transformations จึงเปรียบได้กับ map และ actions คือ reduce
หากมองในมุม End user เราจะไม่ได้ใช้ RDDs มากเท่าไร ยกเว้นในกรณีที่เราต้อง maintain old Spark code
2. High-level structured API (Spark’s structured API)
Structured API เป็นเครื่องมือในการ manipulate all sorts of data ตั้งแต่ unstructured, semi-structured, structured data
Structured API สามารถใช้ได้ทั้งกับ batch และ streaming computation ซึ่งคือ ฝั่ง Spark SQL, Dataframes, Datasets API ส่วนในฝั่ง streaming จะเป็น Spark Structured Streaming ซึ่งเราจะขออธิบายแค่ฝั่งแรก
Spark SQL
Spark SQL เป็นหนึ่งใน features ที่สำคัญที่สุดใน Spark เลย
Spark SQL เป็น module สำหรับการ process structured data- ข้อมูลที่อยู่ในรูปแบบ rows และ columns ที่ทำให้เรารัน SQL queries กับ views/tables ได้
หลายครั้ง Spark SQL มักถูกหยิบไปเปรียบเทียบกับ Hive เพราะก่อนสมัย Spark จะเกิดนั้น Hive นั้นเป็น SQL access layer (ใน Hadoop ecosystem) ที่ถูกคิดค้นโดย Facebook
ความพีคคือใน Spark 2.0 มีการ support Hive เพิ่มเข้ามา แล้วทาง Facebook จึงได้ลองเอา Spark ไปทดแทน Hive ที่ปกติเป็น pipeline รันใน production ขึ้นมา ผลคือ Spark-based pipeline นั้นมี performance ที่ดีกว่า Hive-based pipeline ซะอีก !
ถึงอย่างไรก็ตาม Spark กับ Hive นั้นก็เป็นมิตรรักต่อกัน เพราะ Spark สามารถต่อเข้ากับ Hive metastore ได้ ซึ่ง Hive metastore คือวิธีที่ Hive เก็บ table information ข้ามคนละ session กัน ซึ่งเหมาะกับคนที่ต้องการย้ายจาก legacy Hadoop มา Spark มากๆ
Datasets
A Dataset is a distributed collection of data
Dataset API จะมีแค่ใน Scala และ Java ดังนั้น Python จะไม่มี
แต่ด้วยความเทพของ Python บางคุณสมบัติของ Dataset API ที่ทำได้นั้น Python สามารถทำในลักษณะเดียวกันได้ เช่น การ access ชื่อ field ของ row นั้นๆ row.columnName
DataFrames
DataFrame เป็น Dataset organized into named columns
DataFrame ถือเป็น Structured API ตัวหนึ่งที่ represent ในรูปแบบของ rows และ columns หากนึกไม่ออกลองนึกถึง spreadsheet ได้
DataFrame API มีใน Scala, Java, Python และ R ครบเลย
ใน R และ Python ทำให้ Pandas DataFrame (Python) convert เป็น Spark DataFrames หรือ R DataFrames เป็น Spark DataFrames ได้ง่าย
df = spark.read.option("header",True).csv("path/to/iris.csv")df.createOrReplaceTempView("iris")spark.sql("SELECT * FROM iris").show(30)
สรุป
บทความนี้เราเล่ามหากาพย์ของ Spark ตั้งแต่ Spark คืออะไร ที่มาของ Spark เป็นมายังไง เขาตั้งใจสร้าง Spark เพื่ออะไร จนไปถึงองค์ประกอบต่างๆ Spark app, SparkContext, SparkSession ซึ่งทั้งหมดรวมกันเพื่อ support การใช้งานของ user ไม่ว่าจะเป็น Spark SQL, DataFrames API, หรือ API อื่นๆ ที่เขียนได้หลากหลายภาษาให้ Data Scientist, Data Engineer, SQL analyst ทำงานได้อย่างลื่นไหล ผ่าน programming language, SQL, และ DataFrame ที่คุ้นเคย
Further reading
เราไม่ได้ลงการ coding มากมายนักเพราะ Spark ทำ document แนะนำได้ดี (และเนื้อหาแค่นี้ก็อัดแน่นแล้ว) จึงแนะนำให้ไปดู code ตัวอย่างจาก Spark เลย
- Quickstart ของ Spark โดยเราจะเห็น Spark concept แบบ overall ทั้ง Scala, Java และ Python
- หากใครสาย Python ลองดู doc ตัว PySpark ได้ doc เขาคลีนมากๆๆ
ส่วนในชีวิตจริงสำหรับการใช้งาน Spark เว็บ Sparkbyexample ก็เป็นอีกเว็บที่ตัวอย่างเยอะเช่นกัน
Ref:
- Spark the definitive guide by Bill Chambers & Matei Zaharia
- https://spark.apache.org/docs/latest/cluster-overview.html
- https://spark.apache.org/docs/latest/index.html
- https://blog.knoldus.com/spark-why-should-we-use-sparksession/
- https://spark.apache.org/docs/latest/api/python/index.html