ฉันใช้ Apache Spark และ Docker ใน Hackathon เพื่อสร้างแอพ Weather ได้อย่างไร

เผยแพร่แล้ว: 2022-03-11

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

แรงจูงใจ “ตกลงมาจากฟากฟ้าในรูปของข้อมูล” และมันถูกจุดประกายโดย Hackathon ที่จัดโดย IBM วัตถุประสงค์ของ Sparkathon คือการใช้ข้อมูลสภาพอากาศและ Analytics สำหรับ Apache Spark สำหรับ IBM Bluemix เพื่อสร้างแอปพลิเคชันมือถือที่เกี่ยวข้องกับสภาพอากาศ

IBM ลงทุนอย่างหนักใน Spark และเพิ่งซื้อส่วนดิจิทัลของ The Weather Channel งานนี้จึงดูสมบูรณ์แบบสำหรับการประชาสัมพันธ์ของพวกเขา

แรงบันดาลใจ

คุณเคยบ่นเกี่ยวกับสภาพอากาศในสถานที่ของคุณ มีเวลาว่างและมีเงินใช้จ่าย แต่ไม่รู้ ว่า จะไปที่ไหน หากคำตอบคือใช่ คุณจะต้องชอบแอป My Perfect Weather

ภาพ: กรณีการใช้งานสำหรับแอป

เพื่อแสดงให้เห็นว่าสามารถใช้แอปนี้ได้อย่างไร ต่อไปนี้คือกรณีการใช้งานบางส่วน:

  1. คุณมีลูกที่คุณสัญญาว่าจะเล่นว่าวในสัปดาห์ นี้ แต่ที่ที่คุณอาศัยอยู่ไม่มีลมแรงและคุณไม่อยากผิดคำพูด
  2. คุณอาศัยอยู่ในที่ที่มีลมแรงและฝนตกเหมือนฉัน (เมืองเอดินบะระ สกอตแลนด์) และต้องการสัมผัสความอบอุ่นบนผิวของคุณและฝน ไม่ ตกแน่นอน
  3. คุณมีความปรารถนาที่จะสร้างตุ๊กตาหิมะและคุณจะไม่พักผ่อนจนกว่าคุณจะทำสำเร็จ
  4. คุณอยากไปตกปลา และคราวนี้ คุณอยากจะจับอะไรบางอย่างจริงๆ

มันทำอะไร

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

เรามาดูกันว่าเราจะใช้บริการสำหรับกรณีการใช้งานที่กำหนดไว้ในส่วนก่อนหน้าได้อย่างไร

  1. ตั้งค่าลมให้อยู่ระหว่าง 16 ถึง 32 กม./ชม. เหมาะอย่างยิ่งสำหรับการเล่นว่าว โดยอาจมีฝนเล็กน้อยและอุณหภูมิที่สบาย
  2. ตั้งอุณหภูมิต่ำสุดให้อุ่นพอสำหรับคุณ ตั้งค่าโอกาสที่ฝนจะตกเป็น 0%
  3. ตั้งอุณหภูมิให้อยู่ที่ประมาณ 0 C เลือกหิมะเป็นประเภทฝน และมีโอกาสเกิดฝนสูง
  4. ตั้งความเร็วลมให้ต่ำกว่า 16 กม./ชม. มีฝนและเมฆเล็กน้อย เพราะคุณต้องการหลีกเลี่ยงแดดจัดและให้ปลาลงไปในน้ำลึก อุณหภูมิที่สบาย

หากต้องการ คุณสามารถตรวจสอบวิธีไปยังจุดหมายปลายทางที่คุณเลือกได้อย่างง่ายดาย เนื่องจากแอปพลิเคชันนี้รวมเข้ากับบริการค้นหาการเดินทาง Momondo

ฉันสร้างมันขึ้นมาได้อย่างไร

โดยทั่วไปทุกอย่างยกเว้นบริการค้นหาการเดินทางภายนอกจะทำงานภายในแพลตฟอร์ม IBM Bluemix

IBM เสนอการทดลองใช้ฟรีแก่ผู้เข้าร่วม Hackathon ทุกคน ดังนั้นฉันจึงไม่ต้องกังวลว่าจะเรียกใช้แอปนี้จากที่ใด

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

แอป Play โฮสต์อยู่ภายในคอนเทนเนอร์ Docker หนึ่งในบริการของ บริษัท นั้นสามารถติดต่อกับ Weather Service และดาวน์โหลดการพยากรณ์ 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

ระบบจะสอบถามปลายทางสำหรับการพยากรณ์อากาศสำหรับทุกเมืองที่น่าสนใจโดยระบุพารามิเตอร์ geocode ซึ่งใช้ละติจูดและลองจิจูดของสถานที่ที่เป็นปัญหา

เนื่องจากลักษณะของบริการ จำนวนคำขอที่ส่งไปยัง Weather API จึงสัมพันธ์กับจำนวนเมืองที่รองรับ ฉันพิจารณาขีดจำกัดระดับฟรีของ Insights for Weather Service ซึ่งก็คือ 500 สายต่อวัน และตัดสินใจว่าเพื่อจุดประสงค์ในการสาธิต ฉันจะไปกับเมืองท่องเที่ยวที่ปลอดภัยจำนวน 50 เมืองในยุโรป ซึ่งทำให้ฉันสามารถโทรได้หลายครั้งต่อวันสำหรับแต่ละเมืองและจัดการคำขอที่ล้มเหลวโดยไม่เสี่ยงที่จะสูญเสียสิทธิ์ในการใช้ API ฉันจะต้องเริ่มจ่ายเงินเพื่อให้มีคำขอเพียงพอสำหรับครอบคลุมเมืองส่วนใหญ่ของโลก

เป้าหมายสุดท้ายของโครงการคือการมีข้อมูลสภาพอากาศแบบ Spark crunch สำหรับเมืองทั้งหมดในโลก (~50,000) คูณด้วยข้อมูลพยากรณ์สิบวันและดำเนินการหลายครั้งต่อวันเพื่อให้การคาดการณ์แม่นยำที่สุด

รหัส Spark ทั้งหมดอยู่ในสมุดบันทึก Jupyter จนถึงขณะนี้ยังไม่มีวิธีอื่นในการรันงาน Spark ข้อมูลสภาพอากาศดิบจะอ่านจาก Cloudant DB ประมวลผลและเขียนกลับ

Cloudant NoSQL DB

กล่าวโดยสรุป ฉันพบว่าการทำงานกับ Cloudant NoSQL DB เป็นเรื่องที่ดีมาก ใช้งานง่ายและมี UI ที่ใช้เบราว์เซอร์ที่ดี ไม่มีไดรเวอร์ดังกล่าว แต่มี REST API ที่เรียบง่ายและโต้ตอบกับผ่าน HTTP ได้โดยตรง

อย่างไรก็ตาม Bluemix Spark มี Cloudant Data Sources API ซึ่งสามารถใช้เพื่ออ่านและเขียนไปยัง Cloudant โดยไม่ต้องมีการเรียกระดับต่ำ เป็นที่น่าสังเกตว่า ไม่สามารถสร้างฐานข้อมูลใหม่ใน Cloudant จาก Spark ได้ ดังนั้นจึงต้องสร้างไว้ก่อน เช่น ด้วย UI ของเว็บ

เล่นกรอบงาน

เว็บแอปพลิเคชันเขียนด้วยภาษา Scala มันง่ายมาก คอนโทรลเลอร์ให้บริการแอปหน้าเดียวที่มี AngularJS และ Bootstrap และบริการโต้ตอบกับ Weather API และ Cloudant

ความท้าทายที่น่าสนใจอย่างหนึ่งที่ฉันเผชิญคือความเกี่ยวข้องโดยตรงกับ IBM Container Service ความตั้งใจของฉันคือการเรียกใช้แอพบนพอร์ต 80 ดังนั้นจึงเป็นมิตรกับผู้ใช้ อย่างไรก็ตาม ฉันไม่พบวิธีใดๆ ใน Bluemix ที่จะใช้การส่งต่อพอร์ต Docker และแมปพอร์ตภายนอก 80 กับพอร์ตภายใน Docker 9000 ของแอป Play วิธีแก้ปัญหาของฉันคือให้ทำงานเป็น รู ทภายในคอนเทนเนอร์ (ไม่ใช่วิธีปฏิบัติที่แนะนำ) และแก้ไข application.conf ของ Play:

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

นักเทียบท่า

นักเทียบท่ามีประโยชน์อย่างยิ่งโดยเฉพาะในเวลาที่ปรับใช้กับ Bluemix ฉันไม่จำเป็นต้องมีความรู้ใดๆ เกี่ยวกับแอพ Cloud Foundry กังวลเกี่ยวกับ Scala buildpacks หรืออย่างอื่น ฉันสามารถกดอิมเมจ Docker ของฉันและเห็นว่ามันทำงานอยู่

สำหรับการสร้างอิมเมจ Docker ฉันใช้ปลั๊กอิน Typesafe Docker ดังนั้นฉันจึงไม่ต้องการ 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 จึงมีข้อจำกัดบางประการ ในปัจจุบัน รหัสสามารถดำเนินการได้เฉพาะเป็นส่วนหนึ่งของสมุดบันทึกเท่านั้น ดังนั้นจึงไม่มีวิธีกำหนดเวลาการทำงาน นี่เป็นสิ่งที่ค้นพบเมื่อสิ้นสุดเวลาที่ฉันมีสำหรับ Hackathon ความหมายสำหรับ My Perfect Weather คือวันที่แสดงสภาพอากาศจะค่อย ๆ ล้าสมัยหากไม่มีการเรียกใช้โน้ตบุ๊ก Spark ด้วยตนเอง ฉันหวังว่า IBM จะแก้ไขข้อบกพร่องนี้ในทันที

ฉันยังพบความไม่ถูกต้องเล็กน้อยในเอกสารประกอบของ Insights for Weather API ซึ่งปรากฏขึ้นหลังจากสังเกตเห็นปัญหาบางอย่างเกี่ยวกับผลลัพธ์ที่แสดง สำหรับ ประเภทหยาดน้ำฟ้า ค่าที่คาดหวังเพียงอย่างเดียวคือ ฝน และ หิมะ แต่ฉันก็พบค่า หยาดน้ำฟ้า ค่าที่สามด้วย จากบริบทของสภาพอากาศ ดูเหมือนว่าจะบ่งบอกถึงฝนตกด้วยหิมะ ดังนั้นเพื่อความเรียบง่ายของแอป แอปจะถือว่าเป็นหิมะ

ความสำเร็จที่ฉันภาคภูมิใจ

ภาพ: การใช้ Docker และ Spark ในแอปสภาพอากาศ

ฉันคิดว่า My Perfect Weather เป็นแนวคิดที่เจ๋งมาก และฉันก็ภูมิใจที่สามารถนำเทคโนโลยีต่างๆ เหล่านั้นมารวมกันได้อย่างรวดเร็ว ถึงกระนั้นมันก็เป็นแฮ็คที่มีปลายหลวมมากมาย แต่สิ่งที่สำคัญที่สุดคือมันใช้งานได้!

สิ่งที่ฉันเรียนรู้

ฉันได้เรียนรู้อะไรมากมายระหว่างทำโครงงานสั้นๆ นี้ ฉันยังใหม่กับ IBM Bluemix ดังนั้นจึงเป็นการผจญภัยด้วยตัวมันเอง

ฉันไม่เคยได้ยินเกี่ยวกับ Cloudant DB มาก่อน แต่ด้วยประสบการณ์บางอย่างของ MongoDB การเปลี่ยนแปลงนั้นค่อนข้างง่าย

ฉันยังได้เรียนรู้ว่าฉันไม่ควรทำงานในส่วนหน้า ฉันเป็นนักพัฒนาแบ็กเอนด์ที่หัวใจไม่มีพรสวรรค์ในการทำให้สิ่งต่างๆ ดูดี ดังนั้นการทำงานกับ Bootstrap และ CSS จึงเป็นแบบฝึกหัดการค้นหา คัดลอก วาง แก้ไข ขอบคุณมากสำหรับภรรยาของฉันที่ช่วยในการออกแบบ ภาพ การสาธิต และคำแนะนำทั่วไป

มีอะไรต่อไปสำหรับ My Perfect Weather

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

ฉันหวังว่า IBM จะเพิ่มความสามารถในการจัดกำหนดการงาน Spark ในไม่ช้า เพื่อให้บริการกลายเป็นอัตโนมัติอย่างสมบูรณ์

บทสรุป

คุณสามารถตรวจสอบแอปพลิเคชันด้วยตัวคุณเองบนคอมพิวเตอร์ สมาร์ทโฟน หรือแท็บเล็ตโดยไปที่ myperfectweather.eu

หากคุณต้องการให้โค้ดมีจุดสูงสุด ให้โฮสต์บน Github

My Perfect Weather ถูกสร้างขึ้นเป็นโครงการแข่งขันกันสำหรับ IBM Sparkathon โดยมีผู้เข้าร่วมเกือบ 600 คน ได้รับรางวัลชนะเลิศและรางวัลขวัญใจแฟนๆ ตรวจสอบหน้าโครงการหากคุณต้องการทราบข้อมูลเพิ่มเติม