Hackathon에서 Apache Spark 및 Docker를 사용하여 날씨 앱을 구축한 방법

게시 됨: 2022-03-11

이전 두 기사에서 나는 청중에게 Apache Spark와 Docker를 소개했습니다. 앞서 언급한 두 가지 기술을 모두 포함하는 완전한 기능의 응용 프로그램을 보여드릴 때가 되었습니다.

그 동기는 "하늘에서 데이터의 형태로 비가 내렸다"고 IBM에서 주최한 해커톤에서 촉발되었습니다. Sparkathon의 목표는 날씨 데이터와 Apache Spark for IBM Bluemix용 분석을 사용하여 날씨 관련 모바일 애플리케이션을 구축하는 것이었습니다.

IBM은 Spark에 막대한 투자를 하고 있으며 최근 Weather Channel의 디지털 부분을 인수했습니다. 결과적으로 이 행사는 그들의 홍보에 완벽해 보입니다.

영감

당신이 사는 지역의 날씨에 대해 불평하고, 휴가와 돈을 쓸 계획이 있었지만 어디로 가야 할지 몰랐던 적이 있습니까? 대답이 예라면 My Perfect Weather 앱이 정말 마음에 드실 것입니다.

이미지: 앱 사용 사례.

앱 사용 방법을 설명하기 위해 다음과 같은 몇 가지 사용 사례가 있습니다.

  1. 이번 주에 함께 연 날리기로 약속한 아이가 있지만, 당신이 사는 곳은 바람이 전혀 없고 약속을 어기고 싶지 않습니다.
  2. 당신은 나처럼 바람이 많이 부는 비오는 곳(스코틀랜드, 에든버러)에 살고 있고 피부에 따뜻함을 느끼길 원하고 확실히 비가 내리지 않기를 원합니다.
  3. 당신은 눈사람을 만들고 싶은 충동이 있고 그것을 성취할 때까지 쉬지 않을 것입니다.
  4. 낚시를 하고 싶은데 이번에는 정말 뭔가를 잡으려고 합니다.

그것이 하는 일

서비스 이면의 아이디어는 매우 간단합니다. 먼저 주어진 순간에 완벽한 날씨가 무엇을 의미하는지 정의합니다. 현재 아래 스크린샷과 같이 온도, 풍속, 강수 유형 및 강수 확률로 필터링할 수 있습니다. 그런 다음 서비스가 나머지 작업을 수행하고 가장 일치하는 대상이 표시됩니다. 결과는 원래 쿼리와 일치하는 완벽한 날의 양으로 정렬되며 각 도시에서 발견되고 상위 5개로 제한됩니다. 완벽한 날은 또한 다른 배경으로 표시됩니다.

이전 섹션에서 정의한 사용 사례에 대해 서비스를 사용하는 방법을 살펴보겠습니다.

  1. 바람을 16~32km/h로 설정하여 연을 날리기에 이상적이며 비가 올 가능성이 적고 온도가 쾌적합니다.
  2. 최소 온도를 충분히 따뜻하게 설정하고 비가 올 확률을 0%로 설정합니다.
  3. 온도를 0C 이하로 설정하고 강수 유형으로 눈을 선택하고 강수 확률이 높을 수 있습니다.
  4. 풍속을 16km/h 미만으로 설정하고 비와 구름이 적도록 설정하여 너무 화창하지 않도록 하고 물고기가 수심 깊숙이 들어가도록 하여 쾌적한 온도를 유지합니다.

원하는 경우 여행 검색 서비스인 모몬도(Momondo)와 통합된 애플리케이션으로 선택한 목적지까지 가는 방법을 쉽게 확인할 수 있습니다.

내가 만든 방법

기본적으로 외부 여행 검색 서비스를 제외한 모든 것은 IBM Bluemix 플랫폼 내에서 실행됩니다.

IBM은 해커톤의 모든 참가자에게 무료 평가판을 제공했기 때문에 앱을 어디에서 실행할지 고민할 필요가 없었습니다.

애플리케이션의 데이터 흐름과 아키텍처 다이어그램에 표시된 구성 요소가 함께 제공되는 방식을 살펴보겠습니다.

Play 앱은 Docker 컨테이너 내부에서 호스팅됩니다. 그 서비스 중 하나는 기상 서비스에 연락하고 10일 예측을 Cloudant에 다운로드할 수 있습니다. 다운로드 다음 단계에서 Spark는 Cloudant에서 원시 날씨 데이터를 읽고 처리한 다음 Play 애플리케이션에서 빠르고 쉽게 액세스할 수 있도록 Cloudant에 다시 저장합니다.

사용자가 앱의 기본 페이지로 이동하면 완벽한 날씨를 정의하기 위한 다양한 컨트롤이 포함된 양식이 표시됩니다. 그들의 입력은 완벽한 날이 포함된 도시에 대해 Cloudant를 쿼리하는 백엔드에 제출됩니다. 그런 다음 이전 쿼리에서 반환된 도시에 대한 예측의 모든 10일에 대해 다른 쿼리가 만들어집니다. 얻은 결과는 사용자에게 표시되고 셀은 하루의 도시별 기상 조건을 나타냅니다. 모든 도시의 마지막 셀에는 여행 서비스에 대한 링크가 있습니다. 그것을 클릭하면 사용자가 Momondo 웹사이트로 이동하고 항공편 검색 양식에 목적지와 여행 날짜가 미리 채워집니다. 사용자가 이전에 서비스를 사용한 적이 있는 경우(그리고 브라우저에 쿠키를 저장한 경우) 출발지와 여행자 수도 미리 채워질 수 있습니다. 물론 이 양식의 필드는 변경할 수 있습니다. 예를 들어 더 나은 요금을 찾기 위해 다른 여행 날짜를 시도할 수 있습니다.

이것이 애플리케이션이 구축되는 방식입니다. 다음 섹션에서는 일부 구성 요소에 대해 자세히 설명합니다.

이미지: 날씨 앱의 구성 요소.

Spark 및 날씨에 대한 통찰력

프로젝트의 첫 번째 단계는 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개의 호출을 고려하고 데모 목적으로 유럽의 50개의 안전한 관광객 유형 도시를 사용하기로 결정했습니다. 이를 통해 각 도시에 대해 하루에 여러 번 호출하고 API 사용 권한을 잃을 위험 없이 실패한 요청을 처리할 수 있습니다. 나는 세계의 대부분의 도시를 커버하기에 충분한 요청을 갖기 위해 지불을 시작해야 할 것입니다.

프로젝트의 최종 목표는 전 세계 모든 도시(~50,000)의 Spark crunch 날씨 데이터에 10일의 예측 데이터를 곱하고 하루에 여러 번 수행하여 가능한 한 정확한 예측을 하는 것입니다.

모든 Spark 코드는 Jupyter 노트북에 있습니다. 지금까지 Spark 작업을 실행하는 다른 방법은 없습니다. 원시 날씨 데이터는 Cloudant DB에서 읽고 처리되고 다시 기록됩니다.

Cloudant NoSQL DB

요컨대, Cloudant NoSQL DB로 작업하는 것이 매우 즐거웠습니다. 사용하기 쉽고 좋은 브라우저 기반 UI가 있습니다. 그런 드라이버는 없지만 간단한 REST API가 있으며 HTTP를 통해 상호 작용하기가 간단했습니다.

그러나 Bluemix Spark에는 저수준 호출 없이 Cloudant를 읽고 쓰는 데 사용할 수 있는 Cloudant 데이터 소스 API가 포함되어 있습니다. Spark에서 Cloudant에 새 데이터베이스를 생성하는 것은 불가능하므로 웹 UI와 같이 미리 생성해야 합니다.

플레이 프레임워크

웹 애플리케이션은 스칼라로 작성되었습니다. 매우 간단합니다. 컨트롤러는 AngularJS 및 Bootstrap이 있는 한 페이지 앱을 제공하고 서비스는 Weather API 및 Cloudant와 상호 작용합니다.

제가 직면한 흥미로운 문제 중 하나는 IBM Container Service와 직접적인 관련이 있습니다. 내 의도는 사용자 친화적 인 포트 80에서 앱을 실행하는 것이 었습니다. 그러나 Bluemix에서 Docker 포트 전달을 사용하고 외부 포트 80을 Play 앱의 Docker 내부 포트 9000에 매핑하는 방법을 찾지 못했습니다. 내 해결 방법은 컨테이너 내부에서 루트 로 실행하고(권장되지 않음) Play의 application.conf를 편집하는 것이었습니다.

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

도커

Docker는 특히 Bluemix에 배포할 때 매우 유용했습니다. Cloud Foundry Apps에 대한 지식이 필요 없었고 Scala 빌드팩에 대해 걱정할 필요도 없었습니다. 내 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 Streaming과 함께 Spark MLlib를 사용할 수 있는 범위가 있습니다.

IBM이 곧 Spark 작업을 예약하는 기능을 추가하여 서비스가 완전히 자동화되기를 바랍니다.

결론

myperfectweather.eu로 이동하여 컴퓨터, 스마트폰 또는 태블릿에서 애플리케이션을 직접 확인할 수 있습니다.

코드에서 정점을 찍고 싶다면 Github에서 호스팅됩니다.

My Perfect Weather는 약 600명의 참가자가 참여하는 IBM Sparkathon의 경쟁 프로젝트로 만들어졌습니다. 대상과 Fan Favorite을 수상했습니다. 더 알고 싶다면 프로젝트 페이지를 확인하세요.