Apache Spark คืออะไร? แพลตฟอร์มข้อมูลขนาดใหญ่ที่บดขยี้ Hadoop

กำหนด Apache Spark

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

จากจุดเริ่มต้นที่ต่ำต้อยใน AMPLab ที่ UC Berkeley ในปี 2009 Apache Spark ได้กลายเป็นหนึ่งในกรอบการประมวลผลข้อมูลขนาดใหญ่ที่สำคัญในโลก Spark สามารถใช้งานได้หลายวิธีให้การเชื่อมโยงแบบเนทีฟสำหรับภาษาโปรแกรม Java, Scala, Python และ R และรองรับ SQL, ข้อมูลสตรีมมิ่ง, การเรียนรู้ของเครื่องและการประมวลผลกราฟ คุณจะพบว่ามันถูกใช้โดยธนาคาร บริษัท โทรคมนาคม บริษัท เกมรัฐบาลและ บริษัท เทคโนโลยียักษ์ใหญ่ทั้งหมดเช่น Apple, Facebook, IBM และ Microsoft

สถาปัตยกรรม Apache Spark

ในระดับพื้นฐานแอปพลิเคชัน Apache Spark ประกอบด้วยองค์ประกอบหลัก 2 ส่วน ได้แก่ไดรเวอร์ซึ่งจะแปลงรหัสของผู้ใช้เป็นงานหลายอย่างที่สามารถกระจายไปตามโหนดของผู้ปฏิบัติงานและตัวดำเนินการซึ่งทำงานบนโหนดเหล่านั้นและดำเนินการตามภารกิจที่ได้รับมอบหมาย ตัวจัดการคลัสเตอร์บางรูปแบบมีความจำเป็นในการเป็นสื่อกลางระหว่างทั้งสอง

นอกกรอบ Spark สามารถทำงานในโหมดคลัสเตอร์แบบสแตนด์อโลนที่ต้องใช้เฟรมเวิร์ก Apache Spark และ JVM บนแต่ละเครื่องในคลัสเตอร์ของคุณ อย่างไรก็ตามมีแนวโน้มว่าคุณจะต้องการใช้ประโยชน์จากทรัพยากรที่มีประสิทธิภาพมากขึ้นหรือระบบการจัดการคลัสเตอร์เพื่อดูแลการจัดสรรคนงานตามความต้องการให้กับคุณ ในองค์กรโดยปกติจะหมายถึงการทำงานบน Hadoop YARN (นี่คือวิธีที่การแจกแจงของ Cloudera และ Hortonworks เรียกใช้งาน Spark) แต่ Apache Spark ยังสามารถทำงานบน Apache Mesos, Kubernetes และ Docker Swarm

หากคุณต้องการโซลูชันที่มีการจัดการคุณสามารถพบ Apache Spark เป็นส่วนหนึ่งของ Amazon EMR, Google Cloud Dataproc และ Microsoft Azure HDInsight Databricks ซึ่งเป็น บริษัท ที่ว่าจ้างผู้ก่อตั้ง Apache Spark ยังนำเสนอ Databricks Unified Analytics Platform ซึ่งเป็นบริการที่มีการจัดการแบบครบวงจรที่นำเสนอคลัสเตอร์ Apache Spark การสนับสนุนสตรีมมิ่งการพัฒนาโน้ตบุ๊กบนเว็บแบบบูรณาการและประสิทธิภาพ I / O บนคลาวด์ที่ได้รับการปรับปรุง การกระจาย Apache Spark มาตรฐาน

Apache Spark สร้างคำสั่งการประมวลผลข้อมูลของผู้ใช้เป็นDirected Acyclic Graphหรือ DAG DAG คือเลเยอร์การตั้งเวลาของ Apache Spark จะกำหนดว่างานใดถูกดำเนินการบนโหนดใดและในลำดับใด  

Spark เทียบกับ Hadoop: ทำไมต้องใช้ Apache Spark?

เป็นเรื่องที่ควรค่าแก่การชี้ให้เห็นว่า Apache Spark กับ Apache Hadoop เป็นการเรียกชื่อผิดเล็กน้อย คุณจะพบว่า Spark รวมอยู่ในการแจกแจง Hadoop ส่วนใหญ่ในทุกวันนี้ แต่เนื่องจากข้อดีสองประการ Spark จึงกลายเป็นตัวเลือกในการประมวลผลข้อมูลขนาดใหญ่แซงหน้ากระบวนทัศน์เก่า ๆ ของ MapReduce ที่ทำให้ Hadoop มีชื่อเสียง

ข้อดีประการแรกคือความเร็ว เครื่องมือข้อมูลในหน่วยความจำของ Spark หมายความว่าสามารถทำงานได้เร็วกว่า MapReduce ถึงหนึ่งร้อยเท่าในบางสถานการณ์โดยเฉพาะอย่างยิ่งเมื่อเทียบกับงานหลายขั้นตอนที่ต้องเขียนสถานะย้อนกลับไปยังดิสก์ระหว่างขั้นตอน โดยพื้นฐานแล้ว MapReduce จะสร้างกราฟการดำเนินการสองขั้นตอนซึ่งประกอบด้วยการแม็ปข้อมูลและการลดในขณะที่ DAG ของ Apache Spark มีหลายขั้นตอนที่สามารถกระจายได้อย่างมีประสิทธิภาพมากขึ้น แม้แต่งาน Apache Spark ที่ข้อมูลไม่สามารถบรรจุอยู่ในหน่วยความจำได้อย่างสมบูรณ์มักจะเร็วกว่างาน MapReduce ประมาณ 10 เท่า

ข้อดีประการที่สองคือ Spark API ที่เป็นมิตรกับนักพัฒนา สิ่งที่สำคัญพอ ๆ กับการเร่งความเร็วของ Spark อาจมีคนโต้แย้งว่าความเป็นมิตรของ Spark API นั้นสำคัญยิ่งกว่า

Spark Core

เมื่อเปรียบเทียบกับ MapReduce และส่วนประกอบอื่น ๆ ของ Apache Hadoop Apache Spark API นั้นเป็นมิตรกับนักพัฒนามากโดยซ่อนความซับซ้อนของระบบประมวลผลแบบกระจายไว้เบื้องหลังการเรียกใช้เมธอดง่ายๆ ตัวอย่างที่ยอมรับได้คือการที่โค้ด MapReduce เกือบ 50 บรรทัดในการนับจำนวนคำในเอกสารสามารถลดลงเหลือเพียงไม่กี่บรรทัดของ Apache Spark (ที่นี่แสดงใน Scala):

val textFile = sparkSession.sparkContext.textFile (“ hdfs: /// tmp / คำ”)

val counts = textFile.flatMap (line => line.split (““))

                      .map (word => (คำ, 1))

                      .reduceByKey (_ + _)

counts.saveAsTextFile (“ hdfs: /// tmp / words_agg”)

ด้วยการเชื่อมโยงกับภาษายอดนิยมสำหรับการวิเคราะห์ข้อมูลเช่น Python และ R ตลอดจน Java และ Scala ที่เป็นมิตรกับองค์กรมากขึ้น Apache Spark ช่วยให้ทุกคนตั้งแต่นักพัฒนาแอปพลิเคชันไปจนถึงนักวิทยาศาสตร์ข้อมูลสามารถควบคุมความสามารถในการปรับขนาดและความเร็วในลักษณะที่เข้าถึงได้

สปาร์ค RDD

หัวใจสำคัญของ Apache Spark คือแนวคิดของ Resilient Distributed Dataset (RDD) ซึ่งเป็นนามธรรมการเขียนโปรแกรมที่แสดงถึงคอลเลกชันของวัตถุที่ไม่เปลี่ยนรูปซึ่งสามารถแบ่งออกเป็นคลัสเตอร์คอมพิวเตอร์ได้ การดำเนินการบน RDD ยังสามารถแบ่งออกจากคลัสเตอร์และดำเนินการในกระบวนการแบตช์คู่ขนานซึ่งนำไปสู่การประมวลผลแบบขนานที่รวดเร็วและปรับขนาดได้

RDD สามารถสร้างได้จากไฟล์ข้อความธรรมดาฐานข้อมูล SQL ร้านค้า NoSQL (เช่น Cassandra และ MongoDB) บัคเก็ต Amazon S3 และอื่น ๆ อีกมากมาย Spark Core API ส่วนใหญ่สร้างขึ้นจากแนวคิด RDD นี้ทำให้สามารถใช้แผนที่แบบเดิมและลดฟังก์ชันการทำงานได้ แต่ยังให้การสนับสนุนในตัวสำหรับการรวมชุดข้อมูลการกรองการสุ่มตัวอย่างและการรวม

Spark ทำงานในรูปแบบที่กระจายโดยการรวมกระบวนการหลักของไดรเวอร์ที่แยกแอปพลิเคชัน Spark ออกเป็นงานและแจกจ่ายให้กับกระบวนการดำเนินการจำนวนมากที่ทำงานได้ ตัวดำเนินการเหล่านี้สามารถปรับขนาดขึ้นและลงได้ตามความต้องการของแอปพลิเคชัน

Spark SQL

แต่เดิมรู้จักกันในชื่อ Shark Spark SQL มีความสำคัญต่อโครงการ Apache Spark มากขึ้นเรื่อย ๆ น่าจะเป็นอินเทอร์เฟซที่นักพัฒนาในปัจจุบันนิยมใช้มากที่สุดเมื่อสร้างแอปพลิเคชัน Spark SQL มุ่งเน้นไปที่การประมวลผลข้อมูลที่มีโครงสร้างโดยใช้วิธีดาต้าเฟรมที่ยืมมาจาก R และ Python (ใน Pandas) แต่ตามชื่อที่แนะนำ Spark SQL ยังมีอินเทอร์เฟซที่รองรับ SQL2003 สำหรับการสืบค้นข้อมูลซึ่งจะนำพลังของ Apache Spark มาสู่นักวิเคราะห์และนักพัฒนา

นอกเหนือจากการรองรับ SQL มาตรฐานแล้ว Spark SQL ยังมีอินเทอร์เฟซมาตรฐานสำหรับการอ่านและเขียนไปยังแหล่งข้อมูลอื่น ๆ เช่น JSON, HDFS, Apache Hive, JDBC, Apache ORC และ Apache Parquet ซึ่งทั้งหมดนี้ได้รับการสนับสนุนนอกกรอบ ร้านค้ายอดนิยมอื่น ๆ เช่น Apache Cassandra, MongoDB, Apache HBase และอื่น ๆ อีกมากมายสามารถใช้ได้โดยดึงตัวเชื่อมต่อที่แยกจากระบบนิเวศของ Spark Packages

การเลือกคอลัมน์บางส่วนจากดาต้าเฟรมทำได้ง่ายๆเพียงแค่บรรทัดนี้:

CitiesDF.select (“ ชื่อ”,“ ป๊อป”)

เมื่อใช้อินเทอร์เฟซ SQL เราจะลงทะเบียน dataframe เป็นตารางชั่วคราวหลังจากนั้นเราสามารถออกแบบสอบถาม SQL กับมันได้:

CitiesDF.createOrReplaceTempView (“ เมือง”)

spark.sql (“ ชื่อเลือกป๊อปจากเมือง”)

เบื้องหลัง Apache Spark ใช้เครื่องมือเพิ่มประสิทธิภาพการสืบค้นที่เรียกว่า Catalyst ที่ตรวจสอบข้อมูลและการสืบค้นเพื่อสร้างแผนการสืบค้นที่มีประสิทธิภาพสำหรับพื้นที่ข้อมูลและการคำนวณซึ่งจะทำการคำนวณที่จำเป็นในคลัสเตอร์ ในยุค Apache Spark 2.x อินเทอร์เฟซ Spark SQL ของดาต้าเฟรมและชุดข้อมูล (โดยพื้นฐานแล้วคือดาต้าเฟรมที่พิมพ์ซึ่งสามารถตรวจสอบได้ในเวลาคอมไพล์เพื่อความถูกต้องและใช้ประโยชน์จากหน่วยความจำเพิ่มเติมและการเพิ่มประสิทธิภาพการคำนวณ ณ รันไทม์) เป็นแนวทางที่แนะนำสำหรับการพัฒนา . อินเทอร์เฟซ RDD ยังคงใช้งานได้ แต่แนะนำให้ใช้เฉพาะในกรณีที่ความต้องการของคุณไม่สามารถแก้ไขได้ภายในกระบวนทัศน์ Spark SQL

Spark 2.4 นำเสนอชุดฟังก์ชันลำดับที่สูงขึ้นในตัวสำหรับการจัดการอาร์เรย์และชนิดข้อมูลลำดับสูงอื่น ๆ โดยตรง

สปาร์ค MLlib

Apache Spark ยังรวมไลบรารีสำหรับการประยุกต์ใช้เทคนิคการเรียนรู้ของเครื่องและการวิเคราะห์กราฟกับข้อมูลตามขนาด Spark MLlib มีกรอบการทำงานสำหรับการสร้างไปป์ไลน์การเรียนรู้ของเครื่องช่วยให้สามารถใช้งานการแยกคุณลักษณะการเลือกและการเปลี่ยนแปลงบนชุดข้อมูลที่มีโครงสร้างได้อย่างง่ายดาย MLlib มาพร้อมกับการใช้งานอัลกอริธึมการจัดกลุ่มและการจำแนกแบบกระจายเช่นการจัดกลุ่ม k-mean และฟอเรสต์แบบสุ่มที่สามารถสลับเข้าและออกจากท่อที่กำหนดเองได้อย่างง่ายดาย โมเดลสามารถฝึกอบรมโดยนักวิทยาศาสตร์ข้อมูลใน Apache Spark โดยใช้ R หรือ Python บันทึกโดยใช้ MLlib จากนั้นนำเข้าสู่ไปป์ไลน์ที่ใช้ Java หรือ Scala เพื่อใช้ในการผลิต

โปรดทราบว่าในขณะที่ Spark MLlib ครอบคลุมการเรียนรู้ของเครื่องขั้นพื้นฐานซึ่งรวมถึงการจำแนกการถดถอยการจัดกลุ่มและการกรอง แต่ไม่รวมสิ่งอำนวยความสะดวกสำหรับการสร้างแบบจำลองและการฝึกอบรมเครือข่ายประสาทเทียม (สำหรับรายละเอียดโปรดดูการทบทวน Spark MLlib) อย่างไรก็ตาม Deep Learning Pipelines กำลังดำเนินการอยู่

Spark GraphX

Spark GraphX ​​มาพร้อมกับอัลกอริทึมแบบกระจายสำหรับการประมวลผลโครงสร้างกราฟรวมถึงการใช้งานเพจแรงก์ของ Google อัลกอริทึมเหล่านี้ใช้แนวทาง RDD ของ Spark Core ในการสร้างแบบจำลองข้อมูล แพคเกจ GraphFrames ช่วยให้คุณสามารถดำเนินการกราฟบนดาต้าเฟรมรวมถึงการใช้ประโยชน์จากเครื่องมือเพิ่มประสิทธิภาพตัวเร่งปฏิกิริยาสำหรับการสืบค้นกราฟ

Spark Streaming

Spark Streaming เป็นส่วนเสริมแรกของ Apache Spark ที่ช่วยให้ได้รับแรงฉุดในสภาพแวดล้อมที่ต้องใช้การประมวลผลแบบเรียลไทม์หรือใกล้เคียงกับเวลาจริง ก่อนหน้านี้การประมวลผลแบบแบตช์และสตรีมในโลกของ Apache Hadoop เป็นสิ่งที่แยกจากกัน คุณจะต้องเขียนโค้ด MapReduce สำหรับความต้องการในการประมวลผลแบทช์ของคุณและใช้บางอย่างเช่น Apache Storm สำหรับข้อกำหนดการสตรีมแบบเรียลไทม์ของคุณ เห็นได้ชัดว่าสิ่งนี้นำไปสู่ฐานรหัสที่แตกต่างกันซึ่งจำเป็นต้องได้รับการซิงค์สำหรับโดเมนแอปพลิเคชันแม้ว่าจะใช้กรอบงานที่แตกต่างกันอย่างสิ้นเชิงโดยต้องใช้ทรัพยากรที่แตกต่างกันและเกี่ยวข้องกับข้อกังวลในการดำเนินงานที่แตกต่างกันสำหรับการเรียกใช้

Spark Streaming ขยายแนวคิด Apache Spark ของการประมวลผลแบบแบตช์ไปสู่การสตรีมโดยแยกสตรีมออกเป็นชุดไมโครแบทช์ต่อเนื่องซึ่งสามารถจัดการได้โดยใช้ Apache Spark API ด้วยวิธีนี้โค้ดในการดำเนินการแบทช์และสตรีมมิ่งสามารถแชร์โค้ดเดียวกัน (ส่วนใหญ่) ทำงานบนเฟรมเวิร์กเดียวกันซึ่งจะช่วยลดค่าใช้จ่ายของทั้งผู้พัฒนาและผู้ให้บริการ ทุกคนชนะ

คำวิจารณ์เกี่ยวกับแนวทาง Spark Streaming คือการใช้ microbatching ในสถานการณ์ที่ต้องการการตอบสนองต่อข้อมูลขาเข้าต่ำอาจไม่สามารถจับคู่ประสิทธิภาพของเฟรมเวิร์กที่รองรับการสตรีมอื่น ๆ เช่น Apache Storm, Apache Flink และ Apache Apex ซึ่งทั้งหมดนี้ใช้วิธีการสตรีมแบบบริสุทธิ์มากกว่าไมโครแบทช์

การสตรีมแบบมีโครงสร้าง

การสตรีมแบบมีโครงสร้าง (เพิ่มใน Spark 2.x) คือ Spark Streaming สิ่งที่ Spark SQL ใช้กับ Spark Core APIs: API ระดับสูงขึ้นและนามธรรมที่ง่ายกว่าสำหรับการเขียนแอปพลิเคชัน ในกรณีของ Structure Streaming นั้น API ระดับที่สูงกว่าจะช่วยให้นักพัฒนาสามารถสร้างดาต้าเฟรมและชุดข้อมูลสตรีมมิ่งได้ไม่ จำกัด นอกจากนี้ยังแก้ปัญหาความเจ็บปวดที่แท้จริงบางประการที่ผู้ใช้ประสบในกรอบการทำงานก่อนหน้านี้โดยเฉพาะอย่างยิ่งเกี่ยวกับการจัดการกับการรวบรวมเวลาเหตุการณ์และการส่งข้อความล่าช้า คำค้นหาทั้งหมดในสตรีมที่มีโครงสร้างจะต้องใช้เครื่องมือเพิ่มประสิทธิภาพการสืบค้นของ Catalyst และยังสามารถเรียกใช้ในลักษณะโต้ตอบได้อีกด้วยซึ่งช่วยให้ผู้ใช้ดำเนินการสืบค้น SQL กับข้อมูลสตรีมมิงแบบสดได้

การสตรีมแบบมีโครงสร้างเดิมอาศัยรูปแบบไมโครแบทช์ของ Spark Streaming ในการจัดการข้อมูลสตรีมมิ่ง แต่ใน Spark 2.3 ทีม Apache Spark ได้เพิ่มโหมดการประมวลผลต่อเนื่องที่มีเวลาแฝงต่ำให้กับการสตรีมแบบมีโครงสร้างซึ่งช่วยให้สามารถจัดการการตอบสนองที่มีเวลาแฝงต่ำถึง 1ms ซึ่งน่าประทับใจมาก สำหรับ Spark 2.4 การประมวลผลแบบต่อเนื่องยังถือว่าเป็นการทดลอง ในขณะที่การสตรีมแบบมีโครงสร้างถูกสร้างขึ้นบนเอ็นจิน Spark SQL แต่การสตรีมแบบต่อเนื่องรองรับเฉพาะชุดคำค้นหาที่ จำกัด เท่านั้น

การสตรีมแบบมีโครงสร้างเป็นอนาคตของแอปพลิเคชันสตรีมมิงด้วยแพลตฟอร์มดังนั้นหากคุณกำลังสร้างแอปพลิเคชันสตรีมมิงใหม่คุณควรใช้การสตรีมแบบมีโครงสร้าง Spark Streaming API แบบเดิมจะยังคงได้รับการสนับสนุนต่อไป แต่โครงการแนะนำให้ย้ายไปที่ Structured Streaming เนื่องจากวิธีการใหม่นี้ทำให้การเขียนและการบำรุงรักษาโค้ดสตรีมทำได้ง่ายขึ้นมาก

ท่อส่งการเรียนรู้เชิงลึก

Apache Spark รองรับการเรียนรู้เชิงลึกผ่าน Deep Learning Pipelines ด้วยการใช้โครงสร้างไปป์ไลน์ที่มีอยู่ของ MLlib คุณสามารถโทรเข้าสู่ไลบรารีการเรียนรู้เชิงลึกระดับล่างและสร้างตัวแยกประเภทได้ในโค้ดเพียงไม่กี่บรรทัดรวมทั้งใช้กราฟ TensorFlow ที่กำหนดเองหรือโมเดล Keras กับข้อมูลขาเข้า กราฟและโมเดลเหล่านี้สามารถลงทะเบียนเป็น Spark SQL UDF แบบกำหนดเอง (ฟังก์ชันที่ผู้ใช้กำหนดเอง) เพื่อให้โมเดลการเรียนรู้เชิงลึกสามารถนำไปใช้กับข้อมูลโดยเป็นส่วนหนึ่งของคำสั่ง SQL

บทเรียน Apache Spark

พร้อมที่จะดำน้ำและเรียนรู้ Apache Spark แล้วหรือยัง? เราขอแนะนำ A Neanderthal's Guide to Apache Spark ใน Python ของ Evan Heitman ซึ่งไม่เพียง แต่ให้ข้อมูลพื้นฐานเกี่ยวกับการทำงานของ Apache Spark ในแง่ที่ค่อนข้างง่าย แต่ยังแนะนำคุณตลอดขั้นตอนการเขียนแอปพลิเคชัน Python แบบง่ายๆที่ใช้ประโยชน์จากเฟรมเวิร์ก . บทความนี้เขียนขึ้นจากมุมมองของนักวิทยาศาสตร์ข้อมูลซึ่งเป็นเรื่องที่สมเหตุสมผลเนื่องจากวิทยาศาสตร์ข้อมูลเป็นโลกที่ข้อมูลขนาดใหญ่และการเรียนรู้ของเครื่องมีความสำคัญมากขึ้น

หากคุณกำลังมองหาตัวอย่าง Apache Spark เพื่อให้คุณเข้าใจว่าแพลตฟอร์มสามารถทำอะไรได้บ้างและทำงานอย่างไรโปรดดู Spark By {example} มีโค้ดตัวอย่างมากมายที่นี่สำหรับงานพื้นฐานจำนวนมากที่ประกอบเป็นส่วนประกอบพื้นฐานของการเขียนโปรแกรม Spark ดังนั้นคุณสามารถดูส่วนประกอบที่ประกอบขึ้นเป็นงานขนาดใหญ่ที่ Apache Spark สร้างขึ้น

ต้องลงลึกกว่านี้ไหม? DZone มีสิ่งที่อ้างถึงอย่างสุภาพว่า The Complete Apache Spark Collection ซึ่งประกอบด้วยบทช่วยสอนที่เป็นประโยชน์มากมายในหัวข้อ Apache Spark มากมาย มีความสุขในการเรียนรู้!