Hive Story EP.3: Let’s Compare Hive with Spark SQL
Hive Story ของเราเดินทางมาจนถึง EP.3 ซึ่งเป็น EP สุดท้ายแล้วนะคะ สำหรับ EP นี้เราจะมาดูรายละเอียดการทำงานภายในของ Hive และการเปรียบเทียบระหว่าง Hive กับ Spark SQL กันค่ะ
สำหรับใครที่ยังไม่ได้อ่าน EP.1 หรือ EP.2 ของเรา ไปอ่านกันก่อนได้ที่ …
ก่อนอื่นเรามาทำความเข้าใจรายละเอียดการทำงานของ Hive กันก่อนดีกว่าว่า หลังจากเรา Query ไป จะเกิดอะไรขึ้นเบื้องหลังที่เราไม่เห็นกันบ้าง
Hive
จากที่เราทราบกันแล้วว่า Hive เป็น Tool ที่เป็นที่รู้จักในแง่ของการ Query ข้อมูล ซึ่ง Hive จะสามารถ Query ข้อมูลที่ถูกจัดเก็บอยู่ใน HDFS หรือในฐานข้อมูลอื่นๆที่สามารถเชื่อมต่อกับ Hadoop ได้ โดยใช้ภาษา HQL (Hive Query Language)
Job Execution Flow
Flow การทำงานของ Hive มีขั้นตอน ดังนี้
- Execute Query: Hive Web Interface, Hive Server หรือ Command Line Interface ส่งต่อ Request ที่ได้จาก Client ไปยัง Driver
- Get Plan: Driver ทำการส่ง Request ที่ได้ไปให้ Compiler ทำการตรวจสอบไวยากรณ์ของ Request และแปลง Request ให้เป็น Execution Plan (แผนการทำงาน)
- Get Metadata: Compiler ส่งคำขอ Metadata ไปที่ Metastore
- Send Metadata: Metastore ส่ง Metadata กลับไปให้ Compiler ตามที่ร้องขอ
- Send Plan: Compiler ตรวจสอบ Requirement และ Metadata อีกครั้งและส่ง Execution Plan ไปให้ Driver
- Execute Plan: Driver ส่ง Execution Plan ที่ได้รับจาก Compiler ไปให้ Execute Engine ทำงานตาม Plan ที่วางไว้
- Execute Job: Execute Engine ดำเนินการส่ง Job ตาม Execution Plan ไปยัง JobTracker ซึ่งอยู่ใน Name Node และ Name Node จะมอบหมาย Job ให้กับ TaskTracker ซึ่งอยู่ใน Data Node เพื่อรันงาน
- Metadata Operations (optional): ในขณะเดียวกัน Execute Engine ก็สามารถ Execute Metadata Operations กับ Metastore ได้
- Fetch Result: Execute Engine รับผลลัพธ์การทำงานจาก Data Nodes
- Send Results: Execute Engine ดำเนินการส่งต่อค่าผลลัพธ์ที่ได้จาก Data Nodes ไปยัง Driver
- Send Results: Driver ส่งต่อค่าผลลัพธ์ที่ได้จาก Execute Engine ไปยัง Interface
Partitioning
ด้วยในยุคปัจจุบันที่ข้อมูลมีจำนวนมหาศาล ซึ่งจากที่เราทราบกันดีแล้วว่าข้อมูลจะถูกเก็บลง HDFS โดย Hive จะแปลงการสืบค้น HQL เป็นงาน MapReduce แล้วส่งไปยังคลัสเตอร์ Hadoop เมื่อเราส่งคำขอการสืบค้น (query) Hive จะอ่านชุดข้อมูลทั้งหมดมาวิเคราะห์ ซึ่งการรันงาน MapReduce บนตารางขนาดใหญ่ย่อมไม่มีประสิทธิภาพ การแก้ไขปัญหานี้คือการทำ Partition ในตารางข้อมูล
การทำ Partition คือการแบ่งข้อมูลในตารางทั้งหมดออกเป็น Subset เป็นส่วนย่อยเพื่อให้เราสามารถเข้าไปอ่านแค่ข้อมูลใน Subset ใด Subset หนึ่งเพื่อมาวิเคราะห์แทนการอ่านข้อมูลทั้งหมด เช่น จากภาพด้านบน ข้อมูลทั้งหมดมี 1 พันล้าน record หากไม่มีการทำ Partition ในทุกๆครั้งที่มีการสืบค้น ก็จะต้องอ่านข้อมูลทั้ง 1 พันล้าน มาวิเคราะห์ แต่หากเราทำ Partition โดยแยก Partition จากปี จะกลายเป็น Subset แรกสำหรับปี 2012, Subset ที่ 2 สำหรับปี 2013, Subset ที่ 3 สำหรับปี 2014 และ Subset ที่ 4 สำหรับปี 2015 เมื่อเราแบ่ง Subset แบบนี้แล้ว หากการสืบค้นมีความเกี่ยวข้องกับปี 2012 เท่านั้น เราก็สามารถเข้าไปอ่านข้อมูลเฉพาะแค่ Subset ของปี 2012 มาวิเคราะห์ ซึ่งมีขนาดลดลงได้ และหากเราสามารถ Partition ลงไปได้อีก ก็จะช่วยให้การสืบค้นข้อมูลมาวิเคราะห์มีประสิทธิภาพและรวดเร็วมากยิ่งขึ้น
การทำ Partition ของ Hive แบ่งออกได้ 2 ประเภท คือ
- Static Partitioning เป็นการค่อยๆใส่ข้อมูลเข้าไปเองลงในแต่ละ Partition (เรากำหนดเองว่าไฟล์ไหนให้อยู่ Partition ไหน) ซึ่งเราควรใช้ Static Partition เมื่อโหลดไฟล์ขนาดใหญ่ลงในตาราง Hive โดย Static Partition จะช่วยประหยัดเวลาในการโหลดข้อมูลได้มากกว่าเมื่อเทียบกับ Dynamic Partitioning นอกจากนี้ยังสามารถใช้คำสั่งกลุ่ม alter ใน Static Partitioning ได้
- Dynamic Partitioning เป็นการโหลดข้อมูลจากตารางที่ไม่มีการแบ่ง Partition ไปยังตารางที่มีการแบ่ง Partition ซึ่งค่าในการแบ่ง Partition จะแบ่งให้อัตโนมัติตามคอลัมน์ที่เรากำหนดไว้ว่าต้องการให้ Partition จากคอลัมน์อะไร ซึ่งหากเราต้องการแบ่ง Partition ในตารางโดยไม่ทราบจำนวนคอลัมน์ เราสามารถใช้ Dynamic Partitioning ได้ นอกจากนี้ Dynamic Partitioning ยังมีข้อจำกัด คือ ไม่สามารถใช้คำสั่งกลุ่ม alter ได้
Features of Hive
- มีการทำงานที่รวดเร็ว สามารถปรับขนาดได้ตามการใช้งานขณะนั้น (scale-up, scale-out) และมีประสิทธิภาพ
- ใช้ HDFS เป็นส่วนจัดเก็บข้อมูล
- ใช้ภาษา HQL ซึ่งคล้ายกับ SQL มาก ทำให้ง่ายต่อการใช้งาน
- เหมาะกับการใช้งานที่เป็น OLAP (Online Analytical Processing)
- รองรับฐานข้อมูลและระบบไฟล์ที่เชื่อมต่อกับ Hadoop ได้ทั้งหมด
- รองรับประเภทของการเก็บข้อมูลหลายรูปแบบ เช่น ORC เป็นต้น
Limitations of Hive
- ไม่เหมาะกับการใช้งานที่เป็น OLTP (Online Transactional Processing)
- ไม่รองรับการแก้ไขและการลบข้อมูล แต่รองรับในลักษณะของการเขียนทับไปเลย
- ไม่รองรับการเขียน sub-queries หรือ การเขียน query ซ้อนใน query
- ไม่รองรับข้อมูลที่ไม่มีโครงสร้าง
Spark SQL
Spark เป็น Analytics Framework สำหรับการประมวลผลขนาดใหญ่ ซึ่งมี High Level APIs ของภาษาในการเขียนโปรแกรมต่างๆไว้ให้ เช่น Java, Python, Scala และ R เป็นต้น เพื่อให้มีความหลากหลายและง่ายต่อการใช้งาน นอกจากนี้ Spark ก็ยังรองรับเครื่องมือระดับสูง เช่น
- Spark SQL สำหรับการประมวลผลข้อมูลที่มีโครงสร้างด้วย SQL
- GraphX สำหรับการประมวลผลข้อมูลในลักษณะของการเชื่อมโยงแบบเครือข่ายหรือกราฟ
- MLlib สำหรับการใช้ Machine Learning Algorithm
- Spark Streaming สำหรับการประมวลผลข้อมูลที่มีลักษณะ near-real time
หลังจากทำความเข้าใจระหว่าง Hive และ Spark กันไปแล้ว ต่อมาเราลองมาเปรียบเทียบลักษณะของ Hive และ Spark SQL ในแต่ละแง่กันดีกว่าค่ะ
- Structure: Hive เป็น open source data warehousing ซึ่งอยู่ on top ของ Hadoop ในขณะที่ Spark SQL ใช้สำหรับการประมวลผลข้อมูลที่มีโครงสร้าง
- Processing: สำหรับ Hive ชุดข้อมูลขนาดใหญ่ที่ถูกเก็บไว้ใน HDFS จะถูก query เพื่อนำมาวิเคราะห์ โดยการประมวลผลจะดำเนินการโดยใช้ภาษา HQL ส่วนการประมวลผลของ Spark SQL จะเกี่ยวข้องกับงานที่ใช้โหลดในการประมวลผลจำนวนมาก โดยต้องใช้เทคนิคที่เหมาะสม
- Server Operating System: Hive รองรับทุกระบบปฏิบัติการที่มีสภาพแวดล้อมเครื่องเสมือน Java (Java Virtual machine environment) ในขณะที่ Spark SQL รองรับระบบปฏิบัติการหลายระบบ เช่น Windows, X, Linux เป็นต้น
- Access Methods: Hive รองรับ ODBC, JDBC และ Thrift ส่วน Spark SQL รองรับเฉพาะ ODBC และ JDBC
- Partitioning Methods: Hive มีการทำ Data Sharding เพื่อเก็บข้อมูลบนโหนดต่างๆ ในขณะที่ Spark SQL ใช้ประโยชน์จาก Apache Spark Core เพื่อจัดเก็บข้อมูลบนโหนดต่างๆ
จากทั้งหมดที่กล่าวมาข้างต้น จะเห็นว่าทั้ง Hive และ Spark SQL ต่างก็มีข้อดีข้อเสียแตกต่างกันไป โดย Spark SQL มี API ที่เป็นมิตรกับนักพัฒนาซึ่งมีจุดมุ่งหมายเพื่อทำให้การเขียนโปรแกรมง่ายขึ้น ในขณะที่ Hive เป็นเครื่องมือที่มีประสิทธิภาพสำหรับการสืบค้นชุดข้อมูลขนาดใหญ่ ซึ่งการเลือกใช้งานไม่ว่าจะเป็น Hive หรือ Spark SQL ก็ขึ้นอยู่กับเป้าหมายและ requirements ของงานนั้นๆ
สำหรับใครที่ต้องการศึกษาเพิ่มเติม สามารถ Click ไปที่ Link ด้านล่างได้เลยค่ะ
Hive Partitions, Types of Hive Partitioning with Examples — DataFlair (data-flair.training)
Hive vs Spark: Difference Between Hive & Spark [2022] | upGrad blog
Apache Hive vs Apache Spark SQL | 13 Awesome Comparison (educba.com)