บทนำสู่ Apache Spark พร้อมตัวอย่างและกรณีการใช้งาน
เผยแพร่แล้ว: 2022-03-11ฉันได้ยินชื่อ Spark เป็นครั้งแรกเมื่อปลายปี 2013 เมื่อฉันเริ่มสนใจ Scala ซึ่งเป็นภาษาที่ใช้เขียน Spark ต่อมา ฉันได้ทำโครงงานวิทยาศาสตร์ข้อมูลสนุกๆ ที่พยายามทำนายการเอาชีวิตรอดบนเรือไททานิค นี่เป็นวิธีที่ยอดเยี่ยมในการแนะนำแนวคิดและการเขียนโปรแกรม Spark เพิ่มเติม ฉันขอแนะนำเป็นอย่างยิ่งสำหรับนักพัฒนา Spark ที่ต้องการหาสถานที่ในการเริ่มต้น
ปัจจุบัน Spark ได้รับการยอมรับจากผู้เล่นรายใหญ่อย่าง Amazon, eBay และ Yahoo! หลายองค์กรเรียกใช้ Spark บนคลัสเตอร์ที่มีโหนดหลายพันโหนด ตาม Spark FAQ คลัสเตอร์ที่ใหญ่ที่สุดที่รู้จักมีโหนดมากกว่า 8000 โหนด อันที่จริง Spark เป็นเทคโนโลยีที่ควรค่าแก่การจดจำและเรียนรู้
บทความนี้ให้ข้อมูลเบื้องต้นเกี่ยวกับ Spark รวมถึงกรณีการใช้งานและตัวอย่าง ประกอบด้วยข้อมูลจากเว็บไซต์ Apache Spark รวมถึงหนังสือ Learning Spark - Lightning-Fast Big Data Analysis
Apache Spark คืออะไร? การแนะนำ
Spark เป็นโปรเจ็กต์ Apache ที่โฆษณาว่า "การคำนวณคลัสเตอร์แบบรวดเร็วทันใจ" มีชุมชนโอเพ่นซอร์สที่เฟื่องฟูและเป็นโครงการ Apache ที่มีความเคลื่อนไหวมากที่สุดในขณะนี้
Spark มอบแพลตฟอร์มการประมวลผลข้อมูลที่รวดเร็วและทั่วถึงยิ่งขึ้น Spark ช่วยให้คุณรันโปรแกรมได้เร็วกว่าในหน่วยความจำถึง 100 เท่า หรือเร็วกว่าบนดิสก์ 10 เท่า เมื่อเทียบกับ Hadoop ปีที่แล้ว Spark เข้ามาแทนที่ Hadoop โดยทำการแข่งขัน 100 TB Daytona GreySort ให้เสร็จเร็วขึ้น 3 เท่าจากหนึ่งในสิบของจำนวนเครื่อง และกลายเป็นเอ็นจิ้นโอเพนซอร์สที่เร็วที่สุดสำหรับการจัดเรียงเพตาไบต์
Spark ยังทำให้สามารถเขียนโค้ดได้เร็วยิ่งขึ้น เนื่องจากคุณมีโอเปอเรเตอร์ระดับสูงมากกว่า 80 ตัวพร้อมให้คุณใช้งาน เพื่อสาธิตสิ่งนี้ มาดูที่ "สวัสดีชาวโลก!" ของ BigData: ตัวอย่างการนับจำนวนคำ เขียนใน Java สำหรับ MapReduce มีโค้ดประมาณ 50 บรรทัด ในขณะที่ Spark (และ Scala) คุณสามารถทำได้ง่ายๆ ดังนี้:
sparkContext.textFile("hdfs://...") .flatMap(line => line.split(" ")) .map(word => (word, 1)).reduceByKey(_ + _) .saveAsTextFile("hdfs://...")
สิ่งสำคัญอีกประการหนึ่งเมื่อเรียนรู้วิธีใช้ Apache Spark คือเชลล์แบบโต้ตอบ (REPL) ซึ่งมีให้ตั้งแต่แกะกล่อง เมื่อใช้ REPL เราสามารถทดสอบผลลัพธ์ของโค้ดแต่ละบรรทัดโดยไม่จำเป็นต้องโค้ดและรันงานทั้งหมดก่อน เส้นทางสู่รหัสการทำงานจึงสั้นกว่ามาก และทำการวิเคราะห์ข้อมูลเฉพาะกิจได้
คุณสมบัติหลักเพิ่มเติมของ Spark รวมถึง:
- ปัจจุบันให้บริการ API ใน Scala, Java และ Python พร้อมรองรับภาษาอื่นๆ (เช่น R) ระหว่างทาง
- ผสานรวมกับระบบนิเวศ Hadoop และแหล่งข้อมูลได้ดี (HDFS, Amazon S3, Hive, HBase, Cassandra เป็นต้น)
- สามารถทำงานบนคลัสเตอร์ที่จัดการโดย Hadoop YARN หรือ Apache Mesos และยังสามารถเรียกใช้แบบสแตนด์อโลนได้อีกด้วย
แกน Spark เสริมด้วยชุดไลบรารีระดับสูงที่มีประสิทธิภาพซึ่งสามารถใช้งานได้อย่างราบรื่นในแอปพลิเคชันเดียวกัน ไลบรารีเหล่านี้ในปัจจุบัน ได้แก่ SparkSQL, Spark Streaming, MLlib (สำหรับการเรียนรู้ของเครื่อง) และ GraphX ซึ่งแต่ละรายการมีรายละเอียดเพิ่มเติมในบทความนี้ ไลบรารีและส่วนขยายเพิ่มเติมของ Spark กำลังอยู่ระหว่างการพัฒนาเช่นกัน
Spark Core
Spark Core เป็นเอ็นจิ้นพื้นฐานสำหรับการประมวลผลข้อมูลแบบขนานและแบบกระจายขนาดใหญ่ มีหน้าที่รับผิดชอบ:
- การจัดการหน่วยความจำและการกู้คืนข้อผิดพลาด
- การจัดตารางเวลา การกระจาย และการตรวจสอบงานบนคลัสเตอร์
- โต้ตอบกับระบบจัดเก็บข้อมูล
Spark แนะนำแนวคิดของ RDD (Resilient Distributed Dataset) ซึ่งเป็นคอลเล็กชันออบเจ็กต์แบบกระจายที่ทนต่อข้อผิดพลาดและไม่เปลี่ยนรูปแบบซึ่งสามารถทำงานได้แบบคู่ขนาน RDD สามารถมีอ็อบเจ็กต์ประเภทใดก็ได้และสร้างขึ้นโดยการโหลดชุดข้อมูลภายนอกหรือแจกจ่ายคอลเล็กชันจากโปรแกรมไดรเวอร์
RDD รองรับการดำเนินการสองประเภท:
- การแปลงเป็นการดำเนินการ (เช่น แผนที่ ตัวกรอง การรวม การรวมกัน และอื่นๆ) ที่ดำเนินการบน RDD และให้ผลลัพธ์ RDD ใหม่ที่มีผลลัพธ์
- การดำเนินการคือการดำเนินการ (เช่น ลด นับ ก่อน และอื่นๆ) ที่คืนค่าหลังจากเรียกใช้การคำนวณบน RDD
การเปลี่ยนแปลงใน Spark นั้น “ขี้เกียจ” ซึ่งหมายความว่าพวกเขาจะไม่คำนวณผลลัพธ์ทันที แต่พวกเขาเพียงแค่ "จำ" การดำเนินการที่จะดำเนินการและชุดข้อมูล (เช่น ไฟล์) ที่จะดำเนินการนั้น การแปลงจะถูกคำนวณจริงเฉพาะเมื่อมีการเรียกการกระทำและผลลัพธ์จะถูกส่งกลับไปยังโปรแกรมไดรเวอร์ การออกแบบนี้ช่วยให้ Spark ทำงานได้อย่างมีประสิทธิภาพมากขึ้น ตัวอย่างเช่น หากไฟล์ขนาดใหญ่ถูกแปลงในรูปแบบต่างๆ และส่งต่อไปยังการกระทำแรก Spark จะประมวลผลและส่งคืนผลลัพธ์สำหรับบรรทัดแรกเท่านั้น แทนที่จะทำงานให้ทั้งไฟล์
ตามค่าเริ่มต้น RDD ที่แปลงแล้วแต่ละรายการอาจถูกคำนวณใหม่ทุกครั้งที่คุณดำเนินการกับ RDD อย่างไรก็ตาม คุณอาจเก็บ RDD ไว้ในหน่วยความจำได้โดยใช้วิธีการคงอยู่หรือแคช ซึ่งในกรณีนี้ Spark จะเก็บองค์ประกอบต่างๆ บนคลัสเตอร์ไว้เพื่อการเข้าถึงที่รวดเร็วยิ่งขึ้นในครั้งต่อไปที่คุณสืบค้น
SparkSQL
SparkSQL เป็นองค์ประกอบ Spark ที่รองรับการสืบค้นข้อมูลผ่าน SQL หรือผ่าน Hive Query Language มันมีต้นกำเนิดมาจากพอร์ต Apache Hive เพื่อทำงานบน Spark (แทนที่ MapReduce) และตอนนี้ถูกรวมเข้ากับ Spark stack นอกเหนือจากการให้การสนับสนุนแหล่งข้อมูลต่างๆ แล้ว ยังทำให้การสืบค้น SQL เป็นไปได้ด้วยการแปลงโค้ดซึ่งส่งผลให้มีเครื่องมือที่ทรงพลังมาก ด้านล่างนี้เป็นตัวอย่างของการสืบค้นที่เข้ากันได้กับ Hive:
// sc is an existing SparkContext. val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)") sqlContext.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src") // Queries are expressed in HiveQL sqlContext.sql("FROM src SELECT key, value").collect().foreach(println)
Spark สตรีมมิ่ง
Spark Streaming รองรับการประมวลผลข้อมูลการสตรีมแบบเรียลไทม์ เช่น ไฟล์บันทึกของเว็บเซิร์ฟเวอร์ที่ใช้งานจริง (เช่น Apache Flume และ HDFS/S3) โซเชียลมีเดีย เช่น Twitter และคิวการส่งข้อความต่างๆ เช่น Kafka ภายใต้ประทุน Spark Streaming รับกระแสข้อมูลอินพุตและแบ่งข้อมูลออกเป็นแบทช์ ถัดไป พวกมันจะถูกประมวลผลโดยเอ็นจิ้น Spark และสร้างสตรีมผลลัพธ์ขั้นสุดท้ายเป็นแบทช์ดังที่แสดงด้านล่าง

Spark Streaming API ใกล้เคียงกับ Spark Core ทำให้ง่ายสำหรับโปรแกรมเมอร์ในการทำงานในโลกของทั้งชุดข้อมูลและการสตรีม
MLlib
MLlib เป็นไลบรารีแมชชีนเลิร์นนิงที่มีอัลกอริทึมต่างๆ ที่ออกแบบมาเพื่อขยายขนาดบนคลัสเตอร์สำหรับการจัดประเภท การถดถอย คลัสเตอร์ การกรองการทำงานร่วมกัน และอื่นๆ (ดูบทความของ Toptal เกี่ยวกับการเรียนรู้ของเครื่องสำหรับข้อมูลเพิ่มเติมในหัวข้อนั้น) อัลกอริธึมเหล่านี้บางตัวยังทำงานกับข้อมูลการสตรีม เช่น การถดถอยเชิงเส้นโดยใช้กำลังสองน้อยที่สุดปกติหรือการจัดกลุ่ม k-mean (และอื่นๆ ระหว่างทาง) Apache Mahout (ไลบรารีแมชชีนเลิร์นนิงสำหรับ Hadoop) ได้หันหลังให้กับ MapReduce และเข้าร่วมกับ Spark MLlib แล้ว
GraphX
GraphX เป็นไลบรารีสำหรับจัดการกราฟและดำเนินการกราฟแบบขนาน มีเครื่องมือที่สม่ำเสมอสำหรับ ETL การวิเคราะห์เชิงสำรวจ และการคำนวณกราฟแบบวนซ้ำ นอกเหนือจากการดำเนินการในตัวสำหรับการจัดการกราฟแล้ว ยังมีไลบรารีของอัลกอริธึมกราฟทั่วไป เช่น PageRank
วิธีใช้ Apache Spark: กรณีใช้การตรวจจับเหตุการณ์
ตอนนี้เราได้ตอบคำถามที่ว่า “ Apache Spark คืออะไร” มาลองคิดกันดูว่าปัญหาหรือความท้าทายประเภทใดที่สามารถนำมาใช้ให้เกิดประสิทธิภาพสูงสุดได้
ฉันเจอบทความหนึ่งเกี่ยวกับการทดลองตรวจจับแผ่นดินไหวโดยการวิเคราะห์สตรีม Twitter เมื่อเร็วๆ นี้ น่าสนใจ มันแสดงให้เห็นว่าเทคนิคนี้มีแนวโน้มที่จะแจ้งให้คุณทราบเกี่ยวกับแผ่นดินไหวในญี่ปุ่นได้เร็วกว่าสำนักงานอุตุนิยมวิทยาญี่ปุ่น แม้ว่าพวกเขาจะใช้เทคโนโลยีที่แตกต่างกันในบทความของพวกเขา แต่ฉันคิดว่านี่เป็นตัวอย่างที่ดีในการดูว่าเราจะนำ Spark ไปใช้อย่างไรกับข้อมูลโค้ดแบบง่ายและไม่มีโค้ดกาว
อันดับแรก เราจะต้องกรองทวีตที่ดูเหมือนเกี่ยวข้อง เช่น "แผ่นดินไหว" หรือ "การสั่น" เราสามารถใช้ Spark Streaming เพื่อจุดประสงค์นั้นได้อย่างง่ายดายดังนี้:
TwitterUtils.createStream(...) .filter(_.getText.contains("earthquake") || _.getText.contains("shaking"))
จากนั้น เราจะต้องเรียกใช้การวิเคราะห์เชิงความหมายบนทวีตเพื่อพิจารณาว่าทวีตเหล่านั้นดูเหมือนจะอ้างอิงถึงการเกิดแผ่นดินไหวในปัจจุบันหรือไม่ ทวีตเช่น ”แผ่นดินไหว!” ตัวอย่างเช่น หรือ "ตอนนี้กำลังสั่น" จะถือว่าเป็นการจับคู่เชิงบวก ในขณะที่ทวีตเช่น "เข้าร่วมการประชุมแผ่นดินไหว" หรือ "แผ่นดินไหวเมื่อวานนี้น่ากลัว" จะไม่เป็นเช่นนั้น ผู้เขียนบทความใช้ support vector machine (SVM) เพื่อจุดประสงค์นี้ เราจะทำเช่นเดียวกันที่นี่ แต่ยังสามารถลองใช้เวอร์ชันสตรีมมิงได้อีกด้วย ตัวอย่างโค้ดที่ได้จาก MLlib จะมีลักษณะดังนี้:
// We would prepare some earthquake tweet data and load it in LIBSVM format. val data = MLUtils.loadLibSVMFile(sc, "sample_earthquate_tweets.txt") // Split data into training (60%) and test (40%). val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L) val training = splits(0).cache() val test = splits(1) // Run training algorithm to build the model val numIterations = 100 val model = SVMWithSGD.train(training, numIterations) // Clear the default threshold. model.clearThreshold() // Compute raw scores on the test set. val scoreAndLabels = test.map { point => val score = model.predict(point.features) (score, point.label) } // Get evaluation metrics. val metrics = new BinaryClassificationMetrics(scoreAndLabels) val auROC = metrics.areaUnderROC() println("Area under ROC = " + auROC)
หากเราพอใจกับอัตราการทำนายของแบบจำลอง เราก็สามารถก้าวไปสู่ขั้นต่อไปและตอบสนองเมื่อใดก็ตามที่เราพบแผ่นดินไหว ในการตรวจจับ เราจำเป็นต้องมีทวีตเชิงบวกจำนวนหนึ่ง (เช่น ความหนาแน่น) ในกรอบเวลาที่กำหนด (ตามที่อธิบายไว้ในบทความ) โปรดทราบว่าสำหรับทวีตที่เปิดใช้งานบริการระบุตำแหน่งของ Twitter เราจะแยกตำแหน่งของแผ่นดินไหวด้วย ด้วยความรู้นี้ เราจึงสามารถใช้ SparkSQL และสืบค้นตาราง Hive ที่มีอยู่ (จัดเก็บผู้ใช้ที่สนใจรับการแจ้งเตือนแผ่นดินไหว) เพื่อดึงที่อยู่อีเมลของพวกเขาและส่งอีเมลคำเตือนส่วนบุคคลดังนี้:
// sc is an existing SparkContext. val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) // sendEmail is a custom function sqlContext.sql("FROM earthquake_warning_users SELECT firstName, lastName, city, email") .collect().foreach(sendEmail)
กรณีการใช้งาน Apache Spark อื่นๆ
กรณีการใช้งานที่เป็นไปได้สำหรับ Spark นั้นกว้างไกลเกินกว่าการตรวจจับแผ่นดินไหวแน่นอน
ต่อไปนี้คือตัวอย่างสั้นๆ (แต่แน่นอนว่าไม่มีข้อมูลที่ละเอียดถี่ถ้วน!) ของกรณีการใช้งานอื่นๆ ที่จำเป็นต้องจัดการกับความเร็ว ความหลากหลาย และปริมาณของ Big Data ซึ่ง Spark เหมาะสมอย่างยิ่ง:
ในอุตสาหกรรมเกม การประมวลผลและค้นพบรูปแบบจากเหตุการณ์ที่อาจจะเกิดขึ้นในเกมแบบเรียลไทม์และสามารถตอบสนองได้ทันทีเป็นความสามารถที่สามารถสร้างผลกำไรให้กับธุรกิจได้ เช่น การรักษาผู้เล่น การโฆษณาตามเป้าหมาย รถยนต์ -ปรับระดับความซับซ้อนเป็นต้น
ในอุตสาหกรรมอีคอมเมิร์ซ ข้อมูลธุรกรรมแบบเรียลไทม์สามารถส่งผ่านไปยังอัลกอริธึมการทำคลัสเตอร์สตรีมมิ่ง เช่น k-mean หรือการกรองการทำงานร่วมกัน เช่น ALS ผลลัพธ์สามารถรวมเข้ากับแหล่งข้อมูลที่ไม่มีโครงสร้างอื่นๆ ได้ เช่น ความคิดเห็นของลูกค้าหรือรีวิวผลิตภัณฑ์ และใช้เพื่อปรับปรุงและปรับเปลี่ยนคำแนะนำตลอดเวลาด้วยแนวโน้มใหม่
ในอุตสาหกรรมการเงินหรือความปลอดภัย Spark stack สามารถนำไปใช้กับระบบตรวจจับการฉ้อโกงหรือการบุกรุก หรือการรับรองความถูกต้องตามความเสี่ยง มันสามารถบรรลุผลลัพธ์ที่ยอดเยี่ยมโดยการเก็บเกี่ยวบันทึกที่เก็บถาวรจำนวนมาก รวมกับแหล่งข้อมูลภายนอก เช่น ข้อมูลเกี่ยวกับการละเมิดข้อมูลและบัญชีที่ถูกบุกรุก (ดู ตัวอย่างเช่น https://haveibenpwned.com/) และข้อมูลจากการเชื่อมต่อ/ คำขอเช่นตำแหน่งทางภูมิศาสตร์ IP หรือเวลา
บทสรุป
โดยสรุป Spark ช่วยลดความซับซ้อนของงานที่ท้าทายและเน้นการประมวลผลในการประมวลผลข้อมูลแบบเรียลไทม์หรือข้อมูลที่เก็บถาวรปริมาณมาก ทั้งที่มีโครงสร้างและไม่มีโครงสร้าง โดยผสานรวมความสามารถที่ซับซ้อนที่เกี่ยวข้องอย่างราบรื่น เช่น การเรียนรู้ของเครื่องและอัลกอริธึมกราฟ Spark นำการประมวลผล Big Data มาสู่มวลชน ตรวจสอบออก!