كيف استخدمت Apache Spark و Docker في Hackathon لإنشاء تطبيق Weather

نشرت: 2022-03-11

في مقالتين من مقالاتي السابقة ، عرّفت الجمهور على Apache Spark و Docker. لقد حان الوقت لأعرض عليك تطبيقًا كامل الوظائف يشتمل على كلتا التقنيتين المذكورتين أعلاه.

الدافع "أمطر من السماء على شكل بيانات" وأطلقه هاكاثون نظمته شركة IBM. كان هدف Sparkathon هو استخدام بيانات الطقس والتحليلات لـ Apache Spark لـ IBM Bluemix لبناء تطبيقات الهاتف المحمول المتعلقة بالطقس.

تستثمر IBM بكثافة في Spark ، وقد اشترت مؤخرًا جزءًا رقميًا من The Weather Channel. نتيجة لذلك ، يبدو هذا الحدث مثاليًا للدعاية لهم.

إلهام

هل سبق لك أن اشتكيت من الطقس في موقعك ، وكان لديك بعض الوقت المخطط له والمال لتنفقه ، لكنك لا تعرف إلى أين تتجه؟ إذا كانت الإجابة بنعم ، فأنت تريد حقًا تطبيق My Perfect Weather .

الصورة: حالات الاستخدام للتطبيق.

فقط لتوضيح كيفية استخدام التطبيق ، إليك بعض حالات الاستخدام:

  1. لديك طفل وعدت بطيران طائرة ورقية معه هذا الأسبوع ، لكن المكان الذي تعيش فيه لا ريح فيه تمامًا ولا تريد كسر كلمتك.
  2. أنت تعيش في مكان عاصف وممطر مثلما أفعل (إدنبرة ، اسكتلندا) وتريد أن تشعر بالدفء على بشرتك وبالتأكيد لا تمطر.
  3. لديك رغبة في بناء رجل ثلج ولن ترتاح حتى تفي به.
  4. تريد الذهاب للصيد ، وهذه المرة تريد حقًا صيد شيء ما.

ماذا يفعل

الفكرة من وراء الخدمة بسيطة للغاية. أولاً ، أنت تحدد ما يعنيه الطقس المثالي بالنسبة لك في لحظة معينة من الزمن. حاليًا ، يمكنك التصفية حسب درجة الحرارة وسرعة الرياح ونوع هطول الأمطار واحتمال هطول الأمطار كما هو موضح في لقطة الشاشة أدناه. ثم تقوم الخدمة بالباقي ويتم تقديمك بأفضل الوجهات المطابقة. يتم فرز النتائج حسب عدد الأيام المثالية ، تلك التي تتطابق مع الاستعلام الأصلي ، والموجودة لكل مدينة وتقتصر على الخمسة الأوائل. يتم تمييز الأيام المثالية أيضًا بخلفية مختلفة.

دعونا نرى كيف يمكننا استخدام الخدمة لحالات الاستخدام المحددة في القسم السابق.

  1. اضبط سرعة الرياح على ما بين 16 و 32 كم / ساعة ، وهي مثالية لتطيير طائرة ورقية ، مع احتمال ضئيل لسقوط الأمطار ودرجة حرارة مريحة.
  2. اضبط درجة الحرارة الدنيا لتكون دافئة بدرجة كافية بالنسبة لك ، واضبط فرصة هطول الأمطار على 0٪.
  3. اضبط درجة الحرارة لتكون قريبة من 0 درجة مئوية وأقل من ذلك ، واختر الثلج كنوع لهطول الأمطار واحتمالية أن يكون هطول الأمطار مرتفعًا.
  4. اضبط سرعة الرياح على أقل من 16 كم / ساعة ، مع قليل من الأمطار والغيوم حيث تريد تجنب أن يكون الجو مشمسًا للغاية وجعل الأسماك تتعمق أكثر في الماء ، ودرجة حرارة مريحة.

إذا كنت ترغب في ذلك ، يمكنك بسهولة التحقق من كيفية الوصول إلى وجهتك المختارة ، حيث يأتي التطبيق مدمجًا مع خدمة البحث عن السفر Momondo.

كيف بنيته

في الأساس ، يتم تشغيل كل شيء باستثناء خدمة البحث عن السفر الخارجي داخل منصة IBM Bluemix.

عرضت شركة IBM نسخة تجريبية مجانية لجميع المشاركين في الهاكاثون ، لذلك لا داعي للقلق بشأن مكان تشغيل التطبيق.

دعونا نرى كيف تتدفق البيانات في التطبيق وكيف تتجمع المكونات المعروضة في الرسم التخطيطي للهندسة المعمارية.

يتم استضافة تطبيق Play داخل حاوية Docker. إحدى خدماتها قادرة على الاتصال بخدمة الطقس وتنزيل توقعات الطقس لمدة 10 أيام في Cloudant. في خطوة بعد التنزيل ، يقرأ Spark بيانات الطقس الخام من Cloudant ويعالجها ويخزنها مرة أخرى في Cloudant للوصول السريع والسهل من خلال تطبيق Play.

عندما ينتقل المستخدمون إلى الصفحة الرئيسية للتطبيق ، يتم تقديمهم بنموذج يحتوي على عناصر تحكم متنوعة لتحديد طقسهم المثالي. يتم إرسال مدخلاتهم إلى الواجهة الخلفية التي تستفسر من Cloudant عن المدن التي تحتوي على أيام مثالية. بعد ذلك ، يتم إجراء استعلام آخر لجميع الأيام العشرة للتنبؤ بالمدن التي تم إرجاعها في الاستعلام السابق. يتم عرض النتائج التي تم الحصول عليها للمستخدمين وتمثل الخلايا أحوال الطقس لكل مدينة في اليوم. تحتوي الخلية الأخيرة لكل مدينة على رابط لخدمة السفر. سيؤدي النقر فوقها إلى نقل المستخدمين إلى موقع Momondo على الويب وسيتم ملء نموذج البحث عن الرحلة مسبقًا بالوجهة وتواريخ السفر. إذا كان المستخدم قد استخدم الخدمة من قبل (وقام بتخزين ملف تعريف ارتباط في متصفحه) ، فقد يتم أيضًا ملء الأصل وعدد المسافرين. بالطبع ، يمكن تغيير الحقول الموجودة في هذا النموذج. على سبيل المثال ، يمكن للمرء تجربة تواريخ سفر مختلفة بحثًا عن أجرة أفضل.

هذا إلى حد كبير كيف تم بناء التطبيق. تتناول الأقسام التالية مزيدًا من التفاصيل حول بعض المكونات.

الصورة: مكونات تطبيق الطقس.

شرارة وإحصاءات للطقس

تم إنفاق المرحلة الأولى من المشروع على معرفة كيفية عمل Weather API وخدمات Bluemix الأخرى ، وتبعها استكشاف بيانات الطقس الأولي باستخدام Spark. دعني أفهم كيف يعمل نموذج البيانات وكيف يمكن استخدامه في التطبيق.

لغرض هذا التطبيق ، يتم استخدام الأول فقط من نقاط نهاية Weather REST API التالية:

 GET /v2/forecast/daily/10day - Weather Standard 10-day Daily Forecast GET /v2/forecast/hourly/24hour - Weather Standard Hourly Forecast GET /v2/observations/current - Current Weather Observation GET /v2/observations/timeseries/24hour - Time-Series Observation

يتم الاستعلام عن نقطة النهاية لتوقعات الطقس لكل مدينة ذات أهمية من خلال توفير معلمة الرمز الجغرافي التي تأخذ خط الطول وخط العرض للمكان المعني.

نظرًا لطبيعة الخدمة ، يرتبط عدد الطلبات المقدمة إلى Weather API بعدد المدن المدعومة. لقد فكرت في الحد الأقصى المجاني لخدمة Insights for Weather Service والذي كان 500 مكالمة في اليوم وقررت أنه لأغراض العرض التوضيحي ، سأذهب مع عدد آمن من خمسين مدينة من النوع السياحي في أوروبا. يتيح لي ذلك إجراء عدة مكالمات يوميًا لكل مدينة والتعامل مع الطلبات الفاشلة دون المخاطرة بفقدان الحق في استخدام واجهة برمجة التطبيقات. يجب أن أبدأ بالدفع من أجل الحصول على طلبات كافية لتغطية معظم مدن العالم.

سيكون الهدف النهائي للمشروع هو الحصول على بيانات الطقس الشرارة لـ Spark لجميع مدن العالم (حوالي 50000) مضروبة في عشرة أيام من بيانات التنبؤ وتنفيذها عدة مرات في اليوم للحصول على تنبؤات دقيقة قدر الإمكان.

كل كود Spark موجود في دفتر Jupyter. حتى الآن لا توجد طريقة أخرى لتنفيذ وظائف Spark. تتم قراءة بيانات الطقس الخام من Cloudant DB ، ومعالجتها وإعادة كتابتها.

Cloudant NoSQL DB

باختصار ، وجدت أنه من الجيد جدًا العمل مع Cloudant NoSQL DB. إنه سهل الاستخدام وله واجهة مستخدم جيدة تعتمد على المتصفح. لا يوجد برنامج تشغيل على هذا النحو ، ولكنه يحتوي على واجهة برمجة تطبيقات REST بسيطة وكان من السهل التفاعل معها عبر HTTP.

ومع ذلك ، يشتمل Bluemix Spark على Cloudant Data Sources API ، والتي يمكن استخدامها للقراءة والكتابة إلى Cloudant دون الحاجة إلى مكالمات منخفضة المستوى. تجدر الإشارة إلى أنه لا يمكن إنشاء قاعدة بيانات جديدة في Cloudant من Spark لذا يجب إنشاؤها مسبقًا ، على سبيل المثال باستخدام واجهة مستخدم الويب.

إطار اللعب

تطبيق الويب مكتوب بلغة سكالا. أنها بسيطة جدا. تقدم وحدة التحكم تطبيقًا من صفحة واحدة مع AngularJS و Bootstrap ، وتتفاعل الخدمة مع Weather API و Cloudant.

كان أحد التحديات المثيرة للاهتمام التي واجهتها مرتبطًا بشكل مباشر بخدمة حاوية IBM. كنت أنوي تشغيل التطبيق على المنفذ 80 بحيث يكون سهل الاستخدام. ومع ذلك ، لم أتمكن من العثور على أي طريقة في Bluemix لاستخدام إعادة توجيه منفذ Docker وتعيين المنفذ الخارجي 80 إلى المنفذ الداخلي Docker 9000 من تطبيق Play. كان الحل البديل هو التشغيل كجذر داخل الحاوية (ليس ممارسة موصى بها) ولتعديل تطبيق Play.conf:

 # Production port play.server.http.port = "80"

عامل ميناء

كان Docker مفيدًا حقًا ، خاصة في وقت النشر في Bluemix. لم أكن بحاجة إلى الحصول على أي معرفة بتطبيقات Cloud Foundry ، أو القلق بشأن Scala buildpacks أو أي شيء آخر. يمكنني فقط دفع صورة Docker الخاصة بي ورؤيتها تعمل.

لإنشاء صورة Docker ، استخدمت برنامج Typesafe Docker Plugin ، لذلك لم أكن بحاجة إلى ملف Dockerfile مناسب.

لا يتطلب الأمر سوى عدد قليل من الأوامر لرؤية التطبيق قيد التشغيل في السحابة بعد تكوين أولي قصير:

 # log in to IBM Bluemix cf login cf ic login # create the image locally sbt docker:publishLocal # rename it docker tag -f my-perfect-weather:1.0-SNAPSHOT registry.ng.bluemix.net/radek1st/my-perfect-weather:1.0 # push it docker push registry.ng.bluemix.net/radek1st/my-perfect-weather:1.0 # and run it cf ic run --name my-perfect-weather -p 80 -m 2048 registry.ng.bluemix.net/radek1st/my-perfect-weather:1.0

تجدر الإشارة إلى أن خدمة Bluemix Container Service تجري تقييمًا للضعف على الصور قبل تشغيلها. على الرغم من أن تطبيقي لم يكن منطقيًا حقًا ، ما زلت مضطرًا إلى تصحيح /etc/login.defs ، حتى يمكن تشغيلها. هذا هو Dockerfile إذا كنت مهتمًا.

ركضت التحديات في

نظرًا لأن Spark لا يزال إضافة جديدة إلى IBM Bluemix ، فإن له قيودًا معينة. حاليًا ، لا يمكن تنفيذ الكود إلا كجزء من دفتر ملاحظات ، وبالتالي لا توجد طريقة لجدولة عمليات التشغيل. كان هذا اكتشافًا كبيرًا في نهاية الوقت الذي أمضيته في الهاكاثون. ما يعنيه بالنسبة لـ My Perfect Weather هو أن أيام الطقس المقدمة ستصبح قديمة ببطء إذا لم يتم إعادة تشغيل دفتر Spark يدويًا . آمل أن تقوم شركة IBM بمعالجة هذا القصور على الفور.

لقد صادفت أيضًا خطأ بسيطًا في توثيق Insights for Weather API الذي ظهر بعد ملاحظة بعض المشكلات في النتائج المعروضة. بالنسبة لنوع هطول الأمطار ، كانت القيم الوحيدة المتوقعة هي المطر والثلج ، لكنني وجدت أيضًا قيمة ثالثة لهطول الأمطار . من سياق الطقس ، يبدو أنه يشير إلى هطول أمطار مع ثلج ، لذلك بالنسبة إلى بساطة التطبيق ، يتم التعامل معه على أنه ثلج.

الإنجازات التي أنا فخور بها

الصورة: استخدام Docker و Spark في تطبيق الطقس.

أعتقد أن My Perfect Weather فكرة رائعة تمامًا ، وأنا فخور بإمكانية تنفيذها بسرعة كبيرة ومزج كل تلك التقنيات المختلفة معًا. إنه اختراق مع ذلك ، مع العديد من الأطراف السائبة ، ولكن الأهم هو أنه يعمل!

ما تعلمته

لقد تعلمت الكثير خلال هذا المشروع القصير. كنت جديدًا على IBM Bluemix ، لذلك كانت مغامرة بحد ذاتها.

لم أسمع قط عن Cloudant DB من قبل ، ولكن مع بعض الخبرة في MongoDB كان الانتقال سهلاً إلى حد ما.

تعلمت أيضًا أنه لا ينبغي أن أعمل على الواجهة الأمامية. أنا مطور خلفية في صميمي ، بدون الموهبة لجعل الأشياء تبدو جميلة ، لذا فإن العمل مع Bootstrap و CSS كان تمرينًا للبحث والنسخ واللصق والتعديل. جزيل الشكر لزوجتي على المساعدة في التصميم والمرئيات والعروض التوضيحية والنصائح العامة.

ما التالي لطقس المثالي

أرغب في إضافة المزيد من عناصر التحكم في الطقس وتوسيعه ليشمل معظم أنحاء العالم ، أو على الأقل كل أوروبا في المستقبل القريب. مع تطابق المزيد من المدن / أيام الطقس مع المعايير ، سيكون من الصعب تقديم أكثر الأيام مثالية ، لذلك هناك مجال لاستخدام Spark MLlib مع Spark Streaming للبيانات القادمة من جلسات المستخدمين.

آمل أن تضيف شركة IBM إمكانية جدولة وظائف Spark قريبًا ، حتى تصبح الخدمة مؤتمتة بالكامل.

خاتمة

يمكنك التحقق من التطبيق بنفسك على جهاز الكمبيوتر أو الهاتف الذكي أو الجهاز اللوحي بالانتقال إلى myperfectweather.eu.

إذا كنت ترغب في الحصول على ذروة في الكود ، فسيتم استضافته على Github.

تم إنشاء My Perfect Weather كمشروع منافس لشركة IBM Sparkathon مع ما يقرب من 600 مشارك. فاز بالجائزة الكبرى والمفضل لدى المعجبين. تحقق من صفحة المشروع إذا كنت ترغب في معرفة المزيد.