ฉันได้ยิน Spark ครั้งแรกเมื่อปลายปี 2013 เมื่อฉันเริ่มสนใจ Scala ซึ่งเป็นภาษาที่ใช้เขียน Spark หลังจากนั้นไม่นานฉันได้ทำโครงงานวิทยาศาสตร์ข้อมูลแสนสนุกที่พยายามทำ ทำนายการอยู่รอดของเรือไททานิก . วิธีนี้กลายเป็นวิธีที่ดีเยี่ยมในการแนะนำแนวคิดและการเขียนโปรแกรมของ Spark เพิ่มเติม ฉันขอแนะนำอย่างยิ่งสำหรับผู้ที่ต้องการ จุดประกายนักพัฒนา กำลังมองหาสถานที่เพื่อเริ่มต้น
วันนี้ Spark ถูกนำมาใช้โดยผู้เล่นรายใหญ่เช่น Amazon, eBay และ Yahoo! หลายองค์กรเรียกใช้ Spark บนคลัสเตอร์ที่มีโหนดหลายพันโหนด ตามคำถามที่พบบ่อยของ Spark คลัสเตอร์ที่รู้จักกันมากที่สุดมีมากกว่า 8000 โหนด อันที่จริง Spark เป็นเทคโนโลยีที่ควรค่าแก่การจดบันทึกและเรียนรู้
คืออุตสาหกรรมดนตรีที่กำลังเติบโต
บทความนี้ให้ข้อมูลเบื้องต้นเกี่ยวกับ Spark รวมถึงกรณีการใช้งานและตัวอย่าง มีข้อมูลจากเว็บไซต์ Apache Spark รวมทั้งหนังสือ Learning Spark - การวิเคราะห์ข้อมูลขนาดใหญ่ที่รวดเร็วทันใจ .
จุดประกาย เป็นโปรเจ็กต์ Apache ที่โฆษณาว่า 'การประมวลผลคลัสเตอร์ที่รวดเร็วปานสายฟ้า' มีชุมชนโอเพ่นซอร์สที่เฟื่องฟูและเป็นโครงการ Apache ที่มีการใช้งานมากที่สุดในขณะนี้
Spark มอบแพลตฟอร์มการประมวลผลข้อมูลที่รวดเร็วและทั่วไปมากขึ้น Spark ช่วยให้คุณรันโปรแกรมในหน่วยความจำได้เร็วขึ้นถึง 100 เท่าหรือเร็วกว่าบนดิสก์ถึง 10 เท่าเมื่อเทียบกับ Hadoop เมื่อปีที่แล้ว Spark เข้าครอบครอง Hadoop โดยการแข่งขัน Daytona GraySort 100 TB เร็วขึ้น 3 เท่าจากจำนวนเครื่องหนึ่งในสิบและยังกลายเป็น เครื่องมือโอเพ่นซอร์สที่เร็วที่สุดสำหรับการจัดเรียงเพตะไบต์ .
นอกจากนี้ Spark ยังช่วยให้เขียนโค้ดได้เร็วขึ้นเนื่องจากคุณมีตัวดำเนินการระดับสูงกว่า 80 ตัวที่คุณต้องการ เพื่อสาธิตสิ่งนี้มาดูที่“ Hello World!” ของ BigData: ตัวอย่าง Word Count เขียนด้วย Java สำหรับ MapReduce มีโค้ดประมาณ 50 บรรทัดในขณะที่ใน Spark (และ Scala) คุณสามารถทำได้ง่ายๆดังนี้:
sparkContext.textFile('hdfs://...') .flatMap(line => line.split(' ')) .map(word => (word, 1)).reduceByKey(_ + _) .saveAsTextFile('hdfs://...')
สิ่งสำคัญอีกประการหนึ่งในการเรียนรู้วิธีใช้ Apache Spark คือเชลล์แบบโต้ตอบ (REPL) ซึ่งจัดเตรียมไว้ให้นอกกรอบ การใช้ REPL เราสามารถทดสอบผลลัพธ์ของโค้ดแต่ละบรรทัดได้โดยไม่จำเป็นต้องเขียนโค้ดและรันงานทั้งหมดก่อน เส้นทางไปสู่โค้ดการทำงานจึงสั้นกว่ามากและสามารถวิเคราะห์ข้อมูลแบบเฉพาะกิจได้
คุณสมบัติที่สำคัญเพิ่มเติมของ Spark ได้แก่ :
Spark core เสริมด้วยชุดไลบรารีระดับสูงที่ทรงพลังซึ่งสามารถใช้ในแอปพลิเคชันเดียวกันได้อย่างราบรื่น ปัจจุบันไลบรารีเหล่านี้ประกอบด้วย SparkSQL, Spark Streaming, MLlib (สำหรับการเรียนรู้ของเครื่อง) และ GraphX ซึ่งแต่ละไลบรารีมีรายละเอียดเพิ่มเติมในบทความนี้ ขณะนี้ไลบรารีและส่วนขยาย Spark เพิ่มเติมอยู่ระหว่างการพัฒนาเช่นกัน
Spark Core เป็นกลไกพื้นฐานสำหรับการประมวลผลข้อมูลแบบขนานและแบบกระจายขนาดใหญ่ มีหน้าที่รับผิดชอบ:
Spark แนะนำแนวคิดของไฟล์ RDD (ชุดข้อมูลแบบกระจายที่ยืดหยุ่น) ซึ่งเป็นคอลเลกชันของวัตถุแบบกระจายที่ไม่เปลี่ยนรูปที่ทนต่อความผิดพลาดซึ่งสามารถทำงานแบบขนานได้ RDD สามารถมีอ็อบเจ็กต์ประเภทใดก็ได้และสร้างขึ้นโดยการโหลดชุดข้อมูลภายนอกหรือแจกจ่ายคอลเล็กชันจากโปรแกรมไดรเวอร์
RDD รองรับการดำเนินการสองประเภท:
การแปลงใน Spark นั้น“ ขี้เกียจ” ซึ่งหมายความว่าพวกเขาไม่ได้คำนวณผลลัพธ์ในทันที แต่พวกเขาเพียงแค่ 'จำ' การดำเนินการที่จะดำเนินการและชุดข้อมูล (เช่นไฟล์) ที่จะดำเนินการ การแปลงจะคำนวณจริงก็ต่อเมื่อมีการเรียกการดำเนินการและผลลัพธ์จะถูกส่งกลับไปยังโปรแกรมไดรเวอร์ การออกแบบนี้ช่วยให้ Spark ทำงานได้อย่างมีประสิทธิภาพมากขึ้น ตัวอย่างเช่นหากไฟล์ขนาดใหญ่ถูกแปลงในรูปแบบต่างๆและส่งผ่านไปยังการกระทำแรก Spark จะประมวลผลและส่งคืนผลลัพธ์สำหรับบรรทัดแรกเท่านั้นแทนที่จะทำงานกับไฟล์ทั้งหมด
webpack แก้ไข node_modules
ตามค่าเริ่มต้น RDD ที่แปลงแล้วแต่ละรายการอาจได้รับการคำนวณใหม่ทุกครั้งที่คุณดำเนินการกับมัน อย่างไรก็ตามคุณอาจยังคงมี RDD ในหน่วยความจำโดยใช้วิธีการคงอยู่หรือแคชซึ่งในกรณีนี้ Spark จะเก็บองค์ประกอบต่างๆไว้ในคลัสเตอร์เพื่อให้เข้าถึงได้เร็วขึ้นมากในครั้งต่อไปที่คุณค้นหา
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 Streaming รองรับการประมวลผลข้อมูลสตรีมมิ่งแบบเรียลไทม์เช่นไฟล์บันทึกการใช้งานเว็บเซิร์ฟเวอร์ (เช่น Apache Flume และ HDFS / S3) โซเชียลมีเดียเช่น Twitter และคิวการส่งข้อความต่างๆเช่น Kafka ภายใต้ฝากระโปรง Spark Streaming จะรับสตรีมข้อมูลอินพุตและแบ่งข้อมูลออกเป็นแบทช์ จากนั้นพวกเขาจะได้รับการประมวลผลโดย Spark engine และสร้างผลลัพธ์สุดท้ายเป็นชุดดังที่แสดงด้านล่าง
Spark Streaming API ตรงกับ Spark Core อย่างใกล้ชิดทำให้โปรแกรมเมอร์ทำงานในโลกของทั้งข้อมูลแบทช์และสตรีมมิ่งได้ง่าย
วิธีการตั้งค่าผังบัญชี
มลลิบ เป็นไลบรารีแมชชีนเลิร์นนิงที่มีอัลกอริทึมต่างๆที่ออกแบบมาเพื่อขยายขนาดในคลัสเตอร์สำหรับการจัดหมวดหมู่การถดถอยการจัดกลุ่มการกรองการทำงานร่วมกันและอื่น ๆ (ดูบทความของ ApeeScape ใน การเรียนรู้ของเครื่อง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนั้น) อัลกอริทึมเหล่านี้บางส่วนยังทำงานร่วมกับข้อมูลการสตรีมเช่นการถดถอยเชิงเส้นโดยใช้กำลังสองน้อยที่สุดหรือการจัดกลุ่ม k-mean (และอื่น ๆ อีกมากมายระหว่างทาง) Apache ควาญช้าง (ไลบรารีการเรียนรู้ของเครื่องสำหรับ Hadoop) ได้เลิกใช้ MapReduce แล้วและเข้าร่วมกับ Spark MLlib
GraphX เป็นไลบรารีสำหรับจัดการกราฟและดำเนินการกราฟขนาน เป็นเครื่องมือที่สม่ำเสมอสำหรับ ETL การวิเคราะห์เชิงสำรวจและการคำนวณกราฟแบบวนซ้ำ นอกเหนือจากการดำเนินการในตัวสำหรับการจัดการกราฟแล้วยังมีไลบรารีของอัลกอริทึมกราฟทั่วไปเช่นเพจแรงก์
ตอนนี้เราได้ตอบคำถาม“ Apache Spark คืออะไร” แล้วเรามาลองคิดดูว่าปัญหาหรือความท้าทายแบบใดที่สามารถนำไปใช้ได้อย่างมีประสิทธิภาพสูงสุด
ฉันเจอบทความเกี่ยวกับการทดลองเมื่อเร็ว ๆ นี้ ตรวจจับแผ่นดินไหวโดยการวิเคราะห์สตรีม Twitter . สิ่งที่น่าสนใจแสดงให้เห็นว่าเทคนิคนี้มีแนวโน้มที่จะแจ้งให้คุณทราบว่าเกิดแผ่นดินไหวในญี่ปุ่นเร็วกว่าสำนักงานอุตุนิยมวิทยาของญี่ปุ่น แม้ว่าพวกเขาจะใช้เทคโนโลยีที่แตกต่างกันในบทความของพวกเขา แต่ฉันคิดว่ามันเป็นตัวอย่างที่ดีในการดูว่าเราจะนำ Spark ไปใช้กับข้อมูลโค้ดแบบง่ายได้อย่างไรและไม่ต้องใช้โค้ดกาว
ขั้นแรกเราจะต้องกรองทวีตที่ดูเหมือนว่าเกี่ยวข้องเช่น 'แผ่นดินไหว' หรือ 'สั่น' เราสามารถใช้ Spark Streaming เพื่อจุดประสงค์ดังกล่าวได้อย่างง่ายดายดังนี้:
อะไรคือข้อจำกัดทั่วไปของผลิตภัณฑ์
TwitterUtils.createStream(...) .filter(_.getText.contains('earthquake') || _.getText.contains('shaking'))
จากนั้นเราจะต้องเรียกใช้การวิเคราะห์เชิงความหมายบางอย่างในทวีตเพื่อตรวจสอบว่าดูเหมือนว่าพวกเขาอ้างถึงเหตุการณ์แผ่นดินไหวในปัจจุบันหรือไม่ ทวีตเช่น 'แผ่นดินไหว!' หรือ 'ตอนนี้กำลังสั่น' เช่นจะพิจารณาการจับคู่ในเชิงบวกในขณะที่ทวีตเช่น 'การเข้าร่วมการประชุมแผ่นดินไหว' หรือ 'แผ่นดินไหวเมื่อวานนี้น่ากลัว' จะไม่ ผู้เขียนบทความนี้ใช้เครื่องสนับสนุนเวกเตอร์ (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)
กรณีการใช้งานที่เป็นไปได้สำหรับ Spark นั้นขยายไปไกลเกินกว่าที่จะตรวจจับแผ่นดินไหวได้
ต่อไปนี้เป็นการสุ่มตัวอย่างอย่างรวดเร็ว (แต่ไม่มีที่ไหนเลยที่ใกล้หมดจด!) สำหรับกรณีการใช้งานอื่น ๆ ที่ต้องจัดการกับความเร็วความหลากหลายและปริมาณของ Big Data ซึ่ง Spark เหมาะสมอย่างยิ่ง:
ในอุตสาหกรรมเกมการประมวลผลและการค้นพบรูปแบบจากผู้ที่อาจเกิดขึ้นจากเหตุการณ์ในเกมแบบเรียลไทม์และสามารถตอบสนองต่อเหตุการณ์เหล่านี้ได้ทันทีเป็นความสามารถที่สามารถสร้างผลกำไรให้กับธุรกิจได้ตามวัตถุประสงค์เช่นการรักษาผู้เล่นการโฆษณาแบบกำหนดเป้าหมายอัตโนมัติ - การปรับระดับความซับซ้อนและอื่น ๆ
ทำความเข้าใจรหัส c ++
ในอุตสาหกรรมอีคอมเมิร์ซข้อมูลธุรกรรมแบบเรียลไทม์สามารถส่งผ่านไปยังอัลกอริทึมการทำคลัสเตอร์สตรีมมิ่งเช่น k- หมายถึง หรือการกรองร่วมกันเช่น เมื่อไหร่ . จากนั้นคุณสามารถนำผลลัพธ์ไปรวมกับแหล่งข้อมูลอื่น ๆ ที่ไม่มีโครงสร้างเช่นความคิดเห็นของลูกค้าหรือบทวิจารณ์ผลิตภัณฑ์และใช้เพื่อปรับปรุงและปรับเปลี่ยนคำแนะนำอยู่ตลอดเวลาตามแนวโน้มใหม่ ๆ
ในอุตสาหกรรมการเงินหรือการรักษาความปลอดภัย Spark stack สามารถนำไปใช้กับระบบตรวจจับการฉ้อโกงหรือการบุกรุกหรือการรับรองความถูกต้องตามความเสี่ยง สามารถบรรลุผลลัพธ์ที่ยอดเยี่ยมโดยการรวบรวมบันทึกที่เก็บถาวรจำนวนมหาศาลรวมเข้ากับแหล่งข้อมูลภายนอกเช่นข้อมูลเกี่ยวกับการละเมิดข้อมูลและบัญชีที่ถูกบุกรุก (ดูตัวอย่างเช่น https://haveibeenpwned.com/ ) และข้อมูลจากการเชื่อมต่อ / คำขอเช่นตำแหน่งทางภูมิศาสตร์ IP หรือเวลา
สรุปได้ว่า Spark ช่วยลดความซับซ้อนของงานที่ท้าทายและต้องใช้การคำนวณอย่างหนักในการประมวลผลข้อมูลแบบเรียลไทม์หรือข้อมูลที่เก็บถาวรจำนวนมากทั้งที่มีโครงสร้างและไม่มีโครงสร้างผสานรวมความสามารถที่ซับซ้อนที่เกี่ยวข้องเข้าด้วยกันอย่างราบรื่นเช่นการเรียนรู้ของเครื่องและอัลกอริทึมกราฟ Spark นำการประมวลผลข้อมูลขนาดใหญ่มาสู่มวลชน ลองดูสิ!
Spark เป็นโปรเจ็กต์ Apache ที่โฆษณาว่า“ การประมวลผลคลัสเตอร์เร็วปานสายฟ้า” มีชุมชนโอเพ่นซอร์สที่เฟื่องฟูและเป็นโครงการ Apache ที่มีการใช้งานมากที่สุดในขณะนี้
Apache Spark เขียนด้วย Scala
Spark ช่วยลดความซับซ้อนของงานที่ท้าทายและเน้นการคำนวณในการประมวลผลข้อมูลแบบเรียลไทม์หรือข้อมูลที่เก็บถาวรจำนวนมาก