مقدمة إلى 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.
ما هو اباتشي سبارك؟ مقدمة
Spark هو أحد مشاريع Apache التي تم الإعلان عنها على أنها "حوسبة عنقودية سريعة البرق". لديه مجتمع مفتوح المصدر مزدهر وهو أكثر مشاريع Apache نشاطًا في الوقت الحالي.
يوفر Spark نظامًا أساسيًا لمعالجة البيانات أسرع وأكثر عمومية. يتيح لك Spark تشغيل برامج أسرع في الذاكرة تصل إلى 100 مرة ، أو أسرع 10 مرات على القرص ، من Hadoop. في العام الماضي ، استحوذت Spark على Hadoop من خلال إكمال مسابقة Daytona GraySort بسعة 100 تيرابايت أسرع 3 مرات على عُشر عدد الأجهزة ، كما أصبح أسرع محرك مفتوح المصدر لفرز البيتابايت.
يجعل Spark أيضًا من الممكن كتابة التعليمات البرمجية بسرعة أكبر حيث أن لديك أكثر من 80 مشغلًا رفيع المستوى تحت تصرفك. لإثبات ذلك ، دعنا نلقي نظرة على "Hello World!" من 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 ما يلي:
- يوفر حاليًا واجهات برمجة التطبيقات في Scala و Java و Python ، مع دعم للغات أخرى (مثل R) في الطريق
- يتكامل بشكل جيد مع نظام Hadoop البيئي ومصادر البيانات (HDFS ، Amazon S3 ، Hive ، HBase ، Cassandra ، إلخ.)
- يمكن أن تعمل على مجموعات يديرها Hadoop YARN أو Apache Mesos ، ويمكن أيضًا تشغيلها بشكل مستقل
يتم استكمال Spark core بمجموعة من المكتبات القوية عالية المستوى والتي يمكن استخدامها بسلاسة في نفس التطبيق. تتضمن هذه المكتبات حاليًا SparkSQL و Spark Streaming و MLlib (للتعلم الآلي) و GraphX ، وكل منها مذكور بالتفصيل في هذه المقالة. مكتبات وملحقات Spark الإضافية قيد التطوير حاليًا أيضًا.
سبارك كور
Spark Core هو المحرك الأساسي لمعالجة البيانات المتوازية والموزعة على نطاق واسع. وهي مسؤولة عن:
- إدارة الذاكرة واستعادة الأخطاء
- جدولة وتوزيع ومراقبة الوظائف على الكتلة
- التفاعل مع أنظمة التخزين
يقدم Spark مفهوم RDD (مجموعة البيانات الموزعة المرنة) ، وهي مجموعة موزعة لا تتغير وتتسامح مع الأخطاء ويمكن تشغيلها بالتوازي. يمكن أن يحتوي RDD على أي نوع من الكائنات ويتم إنشاؤه عن طريق تحميل مجموعة بيانات خارجية أو توزيع مجموعة من برنامج التشغيل.
تدعم RDD نوعين من العمليات:
- التحويلات هي عمليات (مثل الخريطة ، والتصفية ، والربط ، والاتحاد ، وما إلى ذلك) التي يتم إجراؤها على RDD والتي تؤدي إلى RDD جديد يحتوي على النتيجة.
- الإجراءات هي عمليات (مثل تقليل ، وحساب ، وأول ، وما إلى ذلك) تُرجع قيمة بعد تشغيل عملية حسابية على RDD.
التحولات في Spark "كسولة" ، مما يعني أنها لا تحسب نتائجها على الفور. بدلاً من ذلك ، فإنهم "يتذكرون" فقط العملية التي سيتم إجراؤها ومجموعة البيانات (على سبيل المثال ، الملف) التي سيتم تنفيذ العملية عليها. يتم حساب التحويلات فعليًا فقط عند استدعاء إجراء ما وإرجاع النتيجة إلى برنامج التشغيل. يمكّن هذا التصميم Spark من العمل بكفاءة أكبر. على سبيل المثال ، إذا تم تحويل ملف كبير بطرق مختلفة وتم تمريره إلى الإجراء الأول ، فلن يقوم Spark إلا بمعالجة وإرجاع النتيجة للسطر الأول ، بدلاً من القيام بالعمل للملف بأكمله.
بشكل افتراضي ، يمكن إعادة حساب كل RDD محوّل في كل مرة تقوم فيها بتشغيل إجراء عليه. ومع ذلك ، يمكنك أيضًا الاحتفاظ بـ RDD في الذاكرة باستخدام طريقة persist أو cache ، وفي هذه الحالة ، ستحتفظ Spark بالعناصر الموجودة في المجموعة للوصول بشكل أسرع في المرة التالية التي تقوم فيها بالاستعلام عنها.
SparkSQL
SparkSQL هو مكون Spark يدعم الاستعلام عن البيانات إما عبر SQL أو عبر لغة استعلام Hive. نشأ كمنفذ 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 وقوائم انتظار الرسائل المختلفة مثل كافكا. تحت الغطاء ، يتلقى Spark Streaming تدفقات بيانات الإدخال ويقسم البيانات إلى دفعات. بعد ذلك ، تتم معالجتها بواسطة محرك Spark وتوليد الدفق النهائي للنتائج على دفعات ، كما هو موضح أدناه.

تتطابق واجهة Spark Streaming API بشكل وثيق مع Spark Core ، مما يسهل على المبرمجين العمل في عالم البيانات المجمعة والمتدفقة.
MLlib
MLlib عبارة عن مكتبة للتعلم الآلي توفر خوارزميات متنوعة مصممة لتوسيع نطاق مجموعة من أجل التصنيف والانحدار والتجميع والتصفية التعاونية وما إلى ذلك (راجع مقالة Toptal حول التعلم الآلي لمزيد من المعلومات حول هذا الموضوع). تعمل بعض هذه الخوارزميات أيضًا مع تدفق البيانات ، مثل الانحدار الخطي باستخدام المربعات الصغرى العادية أو تجميع الوسائل k (والمزيد في الطريق). ابتعد Apache Mahout (مكتبة التعلم الآلي لـ Hadoop) بالفعل عن MapReduce وانضم إلى Spark MLlib.
جرافكس
GraphX هي مكتبة لمعالجة الرسوم البيانية وتنفيذ عمليات الرسم البياني المتوازية. يوفر أداة موحدة لـ ETL والتحليل الاستكشافي وحسابات الرسم البياني التكراري. بصرف النظر عن العمليات المضمنة لمعالجة الرسم البياني ، فإنه يوفر مكتبة من خوارزميات الرسم البياني الشائعة مثل PageRank.
كيفية استخدام Apache Spark: واقعة استخدام الكشف عن الأحداث
الآن بعد أن أجبنا على السؤال "ما هو 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 إلى ما هو أبعد من اكتشاف الزلازل بالطبع.
إليك عينة سريعة (ولكن بالتأكيد ليست شاملة!) لحالات الاستخدام الأخرى التي تتطلب التعامل مع سرعة وتنوع وحجم البيانات الضخمة ، والتي تناسبها Spark تمامًا:
في صناعة الألعاب ، تُعد المعالجة واكتشاف الأنماط من الخراطيم المحتملة للأحداث داخل اللعبة في الوقت الفعلي والقدرة على الاستجابة لها على الفور قدرة يمكن أن تسفر عن عمل مربح ، لأغراض مثل الاحتفاظ باللاعبين ، والإعلان المستهدف ، والسيارات - تعديل مستوى التعقيد ، وما إلى ذلك.
في صناعة التجارة الإلكترونية ، يمكن تمرير معلومات المعاملات في الوقت الفعلي إلى خوارزمية تجميع التدفق مثل k-mean أو التصفية التعاونية مثل ALS. يمكن بعد ذلك دمج النتائج مع مصادر البيانات غير المنظمة الأخرى ، مثل تعليقات العملاء أو مراجعات المنتجات ، واستخدامها لتحسين التوصيات باستمرار وتكييفها بمرور الوقت مع الاتجاهات الجديدة.
في الصناعة المالية أو الأمنية ، يمكن تطبيق Spark stack على نظام كشف الاحتيال أو التسلل أو المصادقة القائمة على المخاطر. يمكن أن تحقق نتائج من الدرجة الأولى عن طريق جمع كميات هائلة من السجلات المؤرشفة ، ودمجها مع مصادر البيانات الخارجية مثل المعلومات حول انتهاكات البيانات والحسابات المخترقة (انظر ، على سبيل المثال ، https://haveibeenpwned.com/) والمعلومات من الاتصال / طلب مثل تحديد الموقع الجغرافي IP أو الوقت.
خاتمة
خلاصة القول ، تساعد Spark في تبسيط المهمة الصعبة والمكثفة حسابيًا لمعالجة كميات كبيرة من البيانات في الوقت الفعلي أو المؤرشفة ، سواء كانت منظمة أو غير منظمة ، وتدمج بسلاسة القدرات المعقدة ذات الصلة مثل التعلم الآلي وخوارزميات الرسم البياني. يجلب Spark معالجة البيانات الضخمة إلى الجماهير. تحقق من ذلك!