서버리스 데이터 파이프라인 빌드: IoT에서 애널리틱스로

1. 개요/소개

웹, 애플리케이션 서버 및 데이터베이스로 구성된 다중 계층 애플리케이션은 웹 개발의 토대가 되고 많은 웹사이트의 시작점이지만, 성공은 종종 확장성, 통합 및 민첩성과 관련된 문제를 가져옵니다. 예를 들어 데이터를 어떻게 실시간으로 처리하고 여러 주요 비즈니스 시스템에 어떻게 배포할 수 있을까요? 이러한 문제가 인터넷 규모의 애플리케이션에 대한 요구와 함께 분산 메시징 시스템의 필요성을 불러일으키고 데이터 파이프라인을 사용하여 복원력이 우수한 실시간 시스템을 구현하는 아키텍처 패턴이 생겨났습니다. 따라서 분산 메시징 시스템에 실시간 데이터를 게시하는 방법과 데이터 파이프라인을 빌드하는 방법을 이해하는 것은 개발자와 설계자 모두에게 중요한 기술입니다.

빌드할 항목

이 Codelab에서는 사물 인터넷 (IoT) 기기에서 시작하여 메시지 큐를 활용하여 데이터를 수신하고 전달하며 서버리스 기능을 활용하여 데이터를 데이터 웨어하우스로 옮긴 후 정보를 표시하는 대시보드를 만드는 날씨 데이터 파이프라인을 빌드합니다. IoT 기기에는 날씨 센서가 있는 Raspberry Pi가 사용되며 Google Cloud Platform의 여러 구성요소가 데이터 파이프라인을 형성합니다. Raspberry Pi를 빌드하는 것은 이 Codelab의 선택적 부분이며 스트리밍 날씨 데이터는 스크립트로 대체할 수 있습니다.

79cd6c68e83f7fea.png

이 Codelab의 단계를 완료하면 온도, 습도, 이슬점, 기압을 표시하는 대시보드에 데이터를 제공하는 스트리밍 데이터 파이프라인이 생성됩니다.

e28ca9ea4abb1457.png

학습할 내용

  • Google Pub/Sub 사용 방법
  • Google Cloud 함수를 배포하는 방법
  • Google BigQuery 활용 방법
  • Google 데이터 스튜디오를 사용하여 대시보드를 만드는 방법
  • 또한 IoT 센서를 구축하면 Google Cloud SDK를 활용하는 방법과 Google Cloud Platform에 대한 원격 액세스 호출을 보호하는 방법도 배울 수 있습니다.

필요한 항목

  • Google Cloud Platform 계정 Google Cloud Platform의 신규 사용자에게는 $300의 무료 체험판이 제공됩니다.

샘플 데이터와 스크립트를 활용하는 대신 이 Codelab의 IoT 센서 부분을 빌드하려면 다음 항목도 필요합니다 ( 여기에서 전체 키트 또는 개별 부품으로 주문할 수 있음).

  • 전원 공급 장치, SD 메모리 카드, 케이스가 있는 Raspberry Pi Zero W
  • USB 카드 리더
  • USB 허브 (키보드와 마우스를 Raspberry Pi의 단독 USB 포트에 연결할 수 있도록 함)
  • 암-암 브레드보드 전선
  • GPIO 해머 헤더
  • BME280 센서
  • 납땜인 인두

또한 컴퓨터 모니터 또는 HDMI 입력이 있는 TV, HDMI 케이블, 키보드, 마우스를 사용할 수 있다고 가정합니다.

2. 설정

자습형 환경 설정

아직 Google 계정 (Gmail 또는 G Suite)이 없다면 계정을 만들어야 합니다. 이미 Google 계정을 가지고 있는지 여부에 관계없이 $300 무료 평가판을 이용하세요.

Google Cloud Platform 콘솔 ( console.cloud.google.com)에 로그인합니다. 이 실습에서 기본 프로젝트('My First Project')를 사용하거나 새 프로젝트를 만들 수 있습니다. 새 프로젝트를 만들려면 리소스 관리 페이지를 사용할 수 있습니다. 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유한 이름이어야 합니다 (아래 표시된 ID는 이미 사용되었으므로 사용할 수 없음). 나중에 필요하므로 프로젝트 ID를 기록해 둡니다 (프로젝트 ID는 _____입니다).

f414a63d955621a7.png

3415e861c09cd06a.png

이 Codelab을 실행하는 데에는 많은 비용이 들지 않지만 더 많은 리소스를 사용하기로 결정하거나 계속 실행하면 비용이 더 많이 들 수 있습니다. Codelab 끝부분의 정리 섹션을 진행해야 합니다.

3. BigQuery 테이블 만들기

BigQuery는 확장성이 뛰어난 서버리스 저비용 엔터프라이즈 데이터 웨어하우스로, IoT 기기에서 스트리밍되는 데이터를 저장하는 동시에 분석 대시보드에서 정보를 쿼리하는 데 이상적인 옵션입니다.

모든 IoT 날씨 데이터를 저장할 테이블을 만들어 보겠습니다. Cloud 콘솔에서 BigQuery를 선택합니다. 그러면 BigQuery가 새 창에서 열립니다 (기존 창을 닫으면 다시 액세스해야 하므로 기존 창을 닫지 마세요).

12a838f78a10144a.png

프로젝트 이름 옆에 있는 아래쪽 화살표 아이콘을 클릭한 다음 '새 데이터 세트 만들기'를 선택합니다.

27616683b64ce34a.png

'weatherData'를 입력합니다. 데이터 세트의 경우 저장할 위치를 선택하고 'OK'를 클릭합니다.

62cfcbd1add830ea.png

오른쪽 상단에 있는 '+' 데이터 세트 옆에 있는 기호를 클릭하여 새 테이블 만들기

3d7bff6f9843fa3c.png

소스 데이터에서 빈 테이블 만들기를 선택합니다. 대상 테이블 이름에 weatherDataTable을 입력합니다. 스키마 아래에 총 9개가 될 때까지 필드 추가 버튼을 클릭합니다. 아래와 같이 입력란을 작성하고 각 입력란에 적절한 유형도 선택해야 합니다. 모든 작업이 완료되면 테이블 만들기 버튼을 클릭합니다.

eef352614a5696a7.png

다음과 같은 결과가 표시됩니다.

7d10e5ab8c6d6a0d.png

이제 날씨 데이터를 수신할 수 있는 데이터 웨어하우스가 설정되었습니다.

4. Pub/Sub 주제 만들기

Cloud Pub/Sub는 스트림 분석 및 이벤트 기반 컴퓨팅 시스템에 사용되는 간단하고도 안정적인 확장형 기반입니다. 따라서 수신 IoT 메시지를 처리한 후 다운스트림 시스템에서 처리하도록 허용하는 데 적합합니다.

아직 BigQuery 창에 있다면 Cloud 콘솔로 다시 전환합니다. Cloud 콘솔을 닫은 경우 https://console.cloud.google.com으로 이동합니다.

Cloud 콘솔에서 Pub/Sub, 주제를 차례로 선택합니다.

331ad71e8a1ea7b.png

API 사용 설정 메시지가 표시되면 API 사용 설정 버튼을 클릭합니다.

9f6fca9dc8684801.png

주제 만들기 버튼을 클릭합니다.

643670164e9fae12.png

'weatherdata'를 입력합니다. 주제 이름으로 '만들기'를 클릭합니다

d7b049bc66a34db6.png

새로 생성된 주제가 표시됩니다.

7c385759f65a1031.png

이제 IoT 메시지를 게시하고 다른 프로세스에서 이러한 메시지에 액세스하도록 허용할 수 있는 Pub/Sub 주제가 준비되었습니다.

주제에 대한 안전한 게시

Google Cloud 콘솔 외부의 리소스 (예: IoT 센서)에서 Pub/Sub 주제로 메시지를 게시하려는 경우 서비스 계정을 사용하여 액세스를 더 엄격하게 제어하고 신뢰 인증서를 만들어 연결의 보안을 보장해야 합니다.

Cloud 콘솔에서 IAM 및 관리자 및 서비스 계정

8e2f8a1428d0feca.png

서비스 계정 만들기 버튼을 클릭합니다.

60892b564e0ac140.png

역할 드롭다운에서 Pub/Sub 게시자 역할을 선택합니다.

31f8c944af11270e.png

서비스 계정 이름 (iotWeatherPublisher)을 입력하고 새 비공개 키 제공 체크박스를 선택합니다. 키 유형이 JSON으로 설정되어 있는지 확인한 다음 '만들기'를 클릭합니다.

7e3f9d7e56a44796.png

보안 키가 자동으로 다운로드됩니다. 키는 하나뿐이므로 잃어버리지 않는 것이 중요합니다. 닫기를 클릭합니다.

60a7da32dd85ba73.png

서비스 계정이 생성되었고 연결된 키 ID가 있는 것을 확인할 수 있습니다.

b25f6f5629fe8fd7.png

나중에 쉽게 키에 액세스할 수 있도록 Google Cloud Storage에 저장합니다. Cloud 콘솔에서 Storage, 브라우저를 차례로 선택합니다.

c4414fe61be320a9.png

버킷 만들기 버튼을 클릭합니다.

cde91311b267fc65.png

스토리지 버킷의 이름 (모든 Google Cloud에서 전역적으로 고유한 이름이어야 함)을 선택하고 '만들기' 버튼을 클릭합니다.

28c10e41b401f479.png

자동으로 다운로드된 보안 키를 찾아 스토리지 버킷에 드래그/드롭하거나 업로드합니다.

a0f6d069d42cec4b.png

키 업로드가 완료되면 Cloud Storage 브라우저에 표시됩니다.

55b25c8b9d73ec19.png

나중을 위해 스토리지 버킷 이름과 보안 키 파일 이름을 기록해 둡니다.

5. Cloud 함수 만들기

클라우드 컴퓨팅 덕분에 어디서든 발생하는 이벤트에 대한 응답으로 로직이 필요에 따라 가동되는 완전한 서버리스 컴퓨팅 모델이 탄생했습니다. 이 실습에서는 Cloud 함수가 날씨 주제에 메시지가 게시될 때마다 시작하고, 메시지를 읽은 후 BigQuery에 저장합니다.

Cloud 콘솔에서 Cloud Functions를 선택합니다.

a14ac2e4f03bf831.png

API 메시지가 표시되면 'API 사용 설정' 버튼을 클릭합니다.

40ba0a08430e0e8a.png

함수 만들기 버튼을 클릭합니다.

5d82d8faeffa55bf.png

이름 필드에 function-weatherPubSubToBQ를 입력합니다. 트리거로 Cloud Pub/Sub 주제를 선택하고 주제 드롭다운에서 weatherdata를 선택합니다. 소스 코드의 경우 인라인 편집기를 선택합니다. index.js 탭에서 시작할 항목에 다음 코드를 붙여넣습니다. projectId,datasetId, tableId의 상수를 환경에 맞게 변경해야 합니다.

/**
 * Background Cloud Function to be triggered by PubSub.
 *
 * @param {object} event The Cloud Functions event.
 * @param {function} callback The callback function.
 */
exports.subscribe = function (event, callback) {
  const BigQuery = require('@google-cloud/bigquery');
  const projectId = "myProject"; //Enter your project ID here
  const datasetId = "myDataset"; //Enter your BigQuery dataset name here
  const tableId = "myTable"; //Enter your BigQuery table name here -- make sure it is setup correctly
  const PubSubMessage = event.data;
  // Incoming data is in JSON format
  const incomingData = PubSubMessage.data ? Buffer.from(PubSubMessage.data, 'base64').toString() : "{'sensorID':'na','timecollected':'1/1/1970 00:00:00','zipcode':'00000','latitude':'0.0','longitude':'0.0','temperature':'-273','humidity':'-1','dewpoint':'-273','pressure':'0'}";
  const jsonData = JSON.parse(incomingData);
  var rows = [jsonData];

  console.log(`Uploading data: ${JSON.stringify(rows)}`);

  // Instantiates a client
  const bigquery = BigQuery({
    projectId: projectId
  });

  // Inserts data into a table
  bigquery
    .dataset(datasetId)
    .table(tableId)
    .insert(rows)
    .then((foundErrors) => {
      rows.forEach((row) => console.log('Inserted: ', row));

      if (foundErrors && foundErrors.insertErrors != undefined) {
        foundErrors.forEach((err) => {
            console.log('Error: ', err);
        })
      }
    })
    .catch((err) => {
      console.error('ERROR:', err);
    });
  // [END bigquery_insert_stream]


  callback();
};

package.json 탭에서 자리표시자 코드 위에 다음 코드를 붙여넣습니다.

{
  "name": "function-weatherPubSubToBQ",
  "version": "0.0.1",
  "private": true,
  "license": "Apache-2.0",
  "author": "Google Inc.",
  "dependencies": {
    "@google-cloud/bigquery": "^0.9.6"
  }
}

실행할 함수가 'HelloWorld'로 설정되어 있으면 'subscribe'로 변경합니다. 만들기 버튼을 클릭합니다.

3266d5268980a4db.png

함수가 배포되었다고 표시될 때까지 약 2분이 소요됩니다.

26f45854948426d0.png

축하합니다. 지금까지 Functions를 통해 Pub/Sub를 BigQuery에 연결했습니다.

6. IoT 하드웨어 설정 (선택사항)

Raspberry Pi와 센서 조립

핀이 7개 이상인 경우 헤더를 7개의 핀으로만 자릅니다. 헤더 핀을 센서 보드에 납땜합니다.

a162e24426118c97.png

조심스럽게 망치 헤더 핀을 Raspberry Pi에 설치합니다.

a3a697907fe3c9a9.png

SD 카드를 포맷하고 여기에 나온 단계에 따라 NOOBS (New Of Box) 설치 프로그램을 설치합니다. SD 카드를 Raspberry Pi에 삽입하고 Raspberry Pi를 케이스에 넣습니다.

1e4e2459cd3333ec.png

아래 다이어그램에 따라 브레드보드 선을 사용하여 센서를 Raspberry Pi에 연결합니다.

392c2a9c85187094.png

Raspberry Pi 핀

센서 연결

핀 1 (3.3V)

VIN

PIN 3 (CPIO2)

SDI : SDI

PIN 5 (GPIO3)

케이스

핀 9 (접지)

GND

44322e38d467d66a.png

모니터 (미니 HDMI 커넥터 사용), 키보드/마우스 (USB 허브 포함) 및 마지막으로 전원 어댑터를 연결합니다.

Raspberry Pi 및 센서 구성

Raspberry Pi의 부팅이 완료되면 원하는 운영체제로 Raspbian을 선택하고 원하는 언어가 올바른지 확인한 다음 '설치'를 클릭합니다 (창 왼쪽 상단의 하드 드라이브 아이콘).

a16f0da19b93126.png

화면 오른쪽 상단의 Wi-Fi 아이콘을 클릭하고 네트워크를 선택합니다. 보안 네트워크인 경우 비밀번호 (사전 공유 키)를 입력합니다.

17f380b2d41751a8.png

라즈베리 아이콘(화면 왼쪽 상단)을 클릭하고 Preferences(환경설정) > Raspberry Pi Configuration(Raspberry Pi 구성)을 선택합니다. Interfaces(인터페이스) 탭에서 I2C를 사용 설정합니다. 현지화 탭에서 언어와 시간대를 설정합니다. 시간대를 설정한 후 Raspberry Pi를 재부팅합니다.

14741a77fccdb7e7.png

재부팅이 완료되면 터미널 아이콘을 클릭하여 터미널 창을 엽니다.

9df6f228f6a31601.png

다음 명령어를 입력하여 센서가 올바르게 연결되었는지 확인합니다.

  sudo i2cdetect -y 1

결과는 다음과 같이 표시됩니다. 77로 표시되어야 합니다.

cd35cd97bee8085a.png

Google Cloud SDK 설치

Google Cloud 플랫폼의 도구를 활용하려면 Raspberry Pi에 Google Cloud SDK를 설치해야 합니다. SDK에는 Google Cloud Platform을 관리하고 활용하는 데 필요한 도구가 포함되어 있으며, 여러 프로그래밍 언어로 사용할 수 있습니다.

Raspberry Pi에서 터미널 창을 아직 열지 않았다면 Raspberry Pi에서 터미널 창을 열고 SDK 버전과 일치하는 환경 변수를 Raspberry Pi의 운영체제에 설정합니다.

  export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"

이제 Google Cloud SDK 패키지가 저장된 위치를 추가하여 SDK를 설치하라는 메시지가 표시될 때 설치 도구가 살펴볼 위치를 알 수 있도록 합니다.

  echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" |  sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list

Raspberry Pi가 설치 중에 보안을 확인하고 콘텐츠를 신뢰하도록 Google의 패키지 저장소에서 공개 키를 추가합니다.

  curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

Raspberry Pi의 모든 소프트웨어가 최신 상태인지 확인하고 핵심 Google Cloud SDK를 설치합니다.

  sudo apt-get update && sudo apt-get install google-cloud-sdk

'계속 진행하시겠어요?'라는 메시지가 표시되면 Enter 키를 누릅니다.

Python 패키지 관리자를 사용하여 Teno 패키지를 설치합니다. 이 패키지는 스크립트가 2번 이상 실행되고 해당 애플리케이션을 위해 날씨 스크립트에 설치되고 있는지 확인하는 데 사용됩니다.

  pip install tendo

Python 패키지 관리자를 사용하여 Python용 Google Cloud PubSub 및 OAuth2 패키지가 설치되어 있고 최신 상태인지 확인합니다.

  sudo pip install --upgrade google-cloud-pubsub
  sudo pip install --upgrade oauth2client

Google Cloud SDK 초기화

이 SDK는 Google Cloud에 대한 원격 인증 액세스를 허용합니다. 이 Codelab에서는 보안 키를 Raspberry Pi에 쉽게 다운로드할 수 있도록 저장소 버킷에 액세스하는 데 사용됩니다.

Raspberry Pi의 명령줄에서

  gcloud init --console-only

"What will you like to log in (Y/n)?"라는 메시지가 표시되면 Enter 키를 누릅니다.

'브라우저에서 다음 링크로 이동'이 표시되면 https://accounts.google.com/o/oauth?...로 시작하는 긴 URL을 입력한 다음 URL에 마우스를 가져가 마우스 오른쪽 버튼을 클릭하고 'URL 복사'를 선택합니다. 그런 다음 웹브라우저 (화면 왼쪽 상단의 파란색 지구본 아이콘)를 열고 주소 표시줄을 마우스 오른쪽 버튼으로 클릭한 다음 '붙여넣기'를 클릭합니다.

로그인 화면이 표시되면 Google Cloud 계정과 연결된 이메일 주소를 입력하고 Enter 키를 누릅니다. 그런 다음 비밀번호를 입력하고 '다음' 버튼을 클릭합니다.

Google Cloud SDK에서 Google 계정에 액세스하려고 한다는 메시지가 표시됩니다. 허용 버튼을 클릭합니다.

인증 코드가 표시됩니다. 마우스를 사용하여 강조표시한 다음 마우스 오른쪽 버튼을 클릭하고 '복사'를 선택합니다. 터미널 창으로 돌아가 커서가 '인증 코드 입력:' 오른쪽에 있는지 확인하고 마우스 오른쪽 버튼으로 클릭한 다음 붙여넣기를 선택합니다. Enter 버튼을 누릅니다.

'사용할 클라우드 프로젝트 선택:'이라는 메시지가 표시되면 이 Codelab에서 사용한 프로젝트 이름에 해당하는 숫자를 입력한 다음 Enter 키를 누릅니다.

Compute API를 사용 설정하라는 메시지가 표시되면 Enter 버튼을 눌러 사용 설정합니다. 그런 다음 Google Compute Engine 설정을 구성하라는 메시지가 표시됩니다. Enter 키를 누릅니다. 사용 가능한 리전/영역 목록이 표시되면 가까운 리전/영역을 선택하고 해당 번호를 입력한 다음 Enter 키를 누릅니다.

잠시 후 몇 가지 추가 정보가 표시됩니다. 이제 Google Cloud SDK가 구성되었습니다. 웹브라우저 창은 앞으로 필요하지 않으므로 닫아도 됩니다.

센서 소프트웨어 및 날씨 스크립트 설치하기

Raspberry Pi의 명령줄에서 입력/출력 핀에서 정보를 읽는 데 필요한 패키지를 클론합니다.

  git clone https://github.com/adafruit/Adafruit_Python_GPIO

다운로드한 패키지 설치

  cd Adafruit_Python_GPIO

  sudo python setup.py install

  cd ..

날씨 센서를 사용 설정하는 프로젝트 코드 클론

  git clone https://github.com/googlecodelabs/iot-data-pipeline

센서 드라이버를 다운로드한 나머지 소프트웨어와 동일한 디렉터리에 복사합니다.

  cd iot-data-pipeline/third_party/Adafruit_BME280

  mv Adafruit_BME280.py ../..

  cd ../..

다음을 입력하여 스크립트를 수정합니다...

  nano checkWeather.py

프로젝트를 프로젝트 ID로, 주제를 Pub/Sub 주제의 이름으로 변경합니다 (이 Codelab의 설정 및 Pub/Sub 주제 만들기 섹션에 설명되어 있음).

sensorID, sensorZipCode, sensorLat 및 sensorLong 값을 원하는 값으로 변경합니다. 특정 위치 또는 주소의 위도 및 경도 값은 여기에서 확인할 수 있습니다.

필요한 변경을 완료하면 Ctrl-X를 눌러 nano 편집기를 종료합니다. 확인하려면 Y를 누르세요.

# constants - change to fit your project and location
SEND_INTERVAL = 10 #seconds
sensor = BME280(t_mode=BME280_OSAMPLE_8, p_mode=BME280_OSAMPLE_8, h_mode=BME280_OSAMPLE_8)
credentials = GoogleCredentials.get_application_default()
project="myProject" #change this to your Google Cloud project id
topic = "myTopic" #change this to your Google Cloud PubSub topic name
sensorID = "s-Googleplex"
sensorZipCode = "94043"
sensorLat = "37.421655"
sensorLong = "-122.085637"

보안 키 설치하기

'주제에 보안 게시' 섹션의 보안 키를 Raspberry Pi에 복사합니다.

SFTP 또는 SCP를 사용하여 로컬 머신에서 Raspberry Pi(/home/pi 디렉터리)로 보안 키를 복사한 경우 다음 단계를 건너뛰고 아래로 경로 내보내기로 이동할 수 있습니다.

스토리지 버킷에 보안 키를 삽입한 경우 스토리지 버킷의 이름과 파일 이름을 기억해야 합니다. gsutil 명령어를 사용하여 보안 키를 복사합니다. 이 명령어는 Google Storage에 액세스할 수 있습니다 (gsutil의 이름인 이유 및 파일 경로가 gs://로 시작하는 이유). 버킷 이름과 파일 이름이 포함되도록 아래 명령어를 변경해야 합니다.

  gsutil cp gs://nameOfYourBucket/yourSecurityKeyFilename.json .

파일이 복사되고 작업이 완료되었다는 메시지가 표시됩니다.

Raspberry Pi의 명령줄에서 보안 키 경로를 내보냅니다 (파일 이름을 파일 이름과 일치하도록 변경).

  export GOOGLE_APPLICATION_CREDENTIALS=/home/pi/iot-data-pipeline/yourSecurityKeyFilename.json

이제 Google Cloud로 데이터를 전송할 준비가 된 IoT 날씨 센서가 완성되었습니다.

7. 데이터 파이프라인 시작

Compute API를 사용 설정해야 할 수 있음

Raspberry Pi에서 데이터 스트리밍

Raspberry Pi IoT 날씨 센서를 구축했다면 날씨 데이터를 읽고 이를 Google Cloud Pub/Sub에 푸시하는 스크립트를 시작합니다. /home/pi/iot-data-pipeline 디렉터리가 없는 경우 먼저 해당 디렉터리로 이동합니다.

  cd /home/pi/iot-data-pipeline

날씨 스크립트 시작

  python checkWeather.py

터미널 창에서 1분마다 날씨 데이터 결과를 에코하는 것을 확인할 수 있습니다. 데이터 흐름이 있는 경우 다음 섹션 (데이터 이동 여부 확인)으로 건너뛸 수 있습니다.

시뮬레이션된 데이터 스트리밍

IoT 날씨 센서를 빌드하지 않은 경우 Google Cloud Storage에 저장된 공개 데이터 세트를 사용하고 이를 기존 Pub/Sub 주제에 입력하여 데이터 스트리밍을 시뮬레이션할 수 있습니다. Cloud Storage에서 읽고 Pub/Sub에 게시하기 위해 Google에서 제공하는 템플릿과 함께 Google Dataflow가 사용됩니다.

프로세스의 일부로 Dataflow에 임시 스토리지 위치가 필요하므로 이 용도로 스토리지 버킷을 만들어 보겠습니다.

Cloud 콘솔에서 Storage, 브라우저를 차례로 선택합니다.

c4414fe61be320a9.png

버킷 만들기 버튼을 클릭합니다.

cde91311b267fc65.png

스토리지 버킷의 이름을 선택하고 (모든 Google Cloud에서 전역적으로 고유한 이름이어야 함) 만들기 버튼을 클릭합니다. 잠시 후에 필요하므로 이 스토리지 버킷의 이름을 기억해 두세요.

1dad4cfbccfc96b1.png

Cloud 콘솔에서 Dataflow를 선택합니다.

43ec245b47ae2e78.png

템플릿에서 작업 만들기 (화면 상단)를 클릭합니다.

da55aaf2a1b0a0d0.png

다음 사항에 유의하여 아래와 같이 작업 세부정보를 입력합니다.

  • dataflow-gcs-to-pubsub의 작업 이름을 입력하세요.
  • 프로젝트가 호스팅되는 위치에 따라 리전이 자동 선택되며 변경할 필요가 없습니다.
  • GCS Text to Cloud Pub/Sub의 Cloud Dataflow 템플릿 선택
  • 입력 Cloud Storage 파일에 gs://codelab-iot-data-pipeline-sampleweatherdata/*.json(공개 데이터 세트)을 입력합니다.
  • 출력 Pub/Sub 주제의 정확한 경로는 프로젝트 이름에 따라 달라지며 'projects/yourProjectName/topics/weatherdata'와 같이 표시됩니다.
  • 임시 위치를 파일 이름 프리픽스 'tmp'와 함께 방금 만든 Google Cloud Storage 버킷의 이름으로 설정합니다. 'gs://myStorageBucketName/tmp'와 같은 형식이어야 합니다.

모든 정보를 입력한 후 (아래 참조) '작업 실행' 버튼을 클릭합니다.

5f8ca16672f19d9b.png

Dataflow 작업이 실행되기 시작합니다.

e020015c369639ad.png

Dataflow 작업이 완료되는 데 약 1분 정도 걸립니다.

218a3ff7197dcf75.png

8. 데이터 전송 확인

Cloud 함수 로그

Pub/Sub에 의해 Cloud 함수가 트리거되고 있는지 확인

  gcloud beta functions logs read function-weatherPubSubToBQ

로그에 함수가 실행 중이고 데이터가 수신되고 있으며 BigQuery에 삽입되고 있음이 표시되어야 합니다.

d88f7831dabc8b3f.png

BigQuery 데이터

데이터가 BigQuery 테이블로 이동하는지 확인합니다. Cloud 콘솔에서 BigQuery (bigquery.cloud.google.com)로 이동합니다.

85627127d58f1d2e.png

창 왼쪽에 있는 프로젝트 이름 아래에서 데이터 세트(weatherData)와 테이블(weatherDataTable)을 차례로 클릭한 다음 쿼리 테이블 버튼을 클릭합니다.

44dc0f765a69580c.png

아래와 같이 SELECT * FROM... 을 표시하도록 SQL 문에 별표를 추가한 다음 쿼리 실행 버튼을 클릭합니다.

b3a001e11c2902f2.png

메시지가 표시되면 쿼리 실행 버튼을 클릭합니다.

2c894d091b789ca3.png

결과가 표시되면 데이터가 제대로 흐르는 것입니다.

c8a061cebb7b528a.png

데이터 흐름이 이제 분석 대시보드를 빌드할 준비가 되었습니다.

9. 데이터 스튜디오 대시보드 만들기

Google 데이터 스튜디오에서는 데이터를 활용하여 읽기 쉽고 공유하기 간편하며 완벽하게 맞춤설정이 가능한 대시보드와 보고서를 만들 수 있습니다.

웹브라우저에서 https://datastudio.google.com으로 이동합니다.

10f8c27060cd7430.png

'새 보고서 시작'에서 '내용 없음'을 클릭한 다음 시작하기 버튼을 클릭합니다.

df1404bc0047595e.png

확인란을 클릭하여 약관에 동의하고 '다음' 버튼을 클릭하여 수신하고자 하는 이메일을 선택한 다음 완료 버튼을 클릭합니다. 다시 한 번 '새 보고서 시작'에서 '빈 보고서'를 클릭합니다.

55e91d3dd88b05ca.png

'새 데이터 소스 만들기' 버튼을 클릭합니다.

a22f3fac05774fc9.png

BigQuery를 클릭하고 '승인' 버튼을 클릭한 다음 데이터 스튜디오에서 사용할 Google 계정을 선택합니다. 이 계정은 Codelab에서 사용한 계정과 동일해야 합니다.

5ab03f341edc8964.png

허용 버튼을 클릭합니다.

22bcdbb5f5f1d30c.png

프로젝트 이름, 데이터 세트, 테이블을 선택합니다. 그런 다음 Connect 버튼을 클릭합니다.

dc6b6b0ed9ced509.png

아래와 같이 유형 필드를 변경합니다 (timecollected 및 sensorID를 제외한 모든 것은 숫자여야 함). timecollected는 날짜가 아닌 날짜 시로 설정됩니다. 아래와 같이 집계 필드를 변경합니다 (이슬점, 온도, 습도, 압력은 평균이어야 하며 다른 모든 값은 '없음'으로 설정해야 함). 보고서 작성 버튼을 클릭합니다.

c60887e29c3bdf9b.png

'보고서에 추가' 버튼을 클릭하여 확인하세요.

5ec3888dfdd85095.png

Google 계정을 선택하라는 메시지가 표시되면 계정을 선택한 다음 허용 버튼을 클릭하여 데이터 스튜디오에서 보고서를 Google 드라이브에 저장하도록 합니다.

7b8006a813b3defa.png

대시보드를 만들 수 있는 빈 캔버스가 표시됩니다. 맨 위 아이콘 행에서 '시계열'을 선택합니다.

c7cd97354e1cde04.png

빈 시트의 왼쪽 상단에 직사각형을 그립니다. 이는 전체 빈 시트의 약 1⁄4을 차지해야 합니다.

e0e82cb19921f835.png

창 오른쪽에서 스타일 탭을 선택합니다. 누락된 데이터를 '줄에서 0으로' 변경 '줄바꿈'까지 사용할 수 있습니다. 왼쪽 Y축 섹션에서 축 최솟값에서 0을 삭제하여 (자동)으로 변경합니다.

c7620bfe734d546.png

시트의 그래프를 클릭하여 세 번 복사/붙여넣기 (Ctrl-C/Ctrl-V)합니다. 각 그래프의 레이아웃이 1⁄4이 되도록 그래프를 정렬합니다.

9a7d3faa28996219.png

각 그래프를 클릭하고 시계열 속성 및 데이터 섹션에서 기존 측정항목 (이슬점)을 클릭하고, 4개의 날씨 측정값 (이슬점, 온도, 습도, 기압)에 모두 고유한 그래프가 표시될 때까지 표시할 다른 측정항목을 선택합니다.

d29b21cac9e1ef5d.png

fda75a2f2a77a323.png

이제 기본 대시보드가 만들어졌습니다.

8f59e8f4d44b8552.png

10. 축하합니다.

전체 데이터 파이프라인을 만들었습니다. 또한 Google Pub/Sub 사용 방법, 서버리스 함수 배포 방법, BigQuery 활용 방법, 데이터 스튜디오를 사용하여 분석 대시보드를 만드는 방법을 배웠습니다. 또한 Google Cloud SDK를 사용해 Google Cloud Platform으로 데이터를 안전하게 가져오는 방법도 알아보았습니다. 마지막으로 가용성을 유지하면서 대용량을 처리할 수 있는 중요한 아키텍처 패턴을 실습해 보았습니다.

79cd6c68e83f7fea.png

삭제

날씨 데이터와 분석 파이프라인에 대한 실험이 완료되면 실행 중인 리소스를 제거할 수 있습니다.

IoT 센서를 만들었다면 종료하세요. 터미널 창에서 Ctrl-C를 눌러 스크립트를 중지한 후 다음을 입력하여 Raspberry Pi의 전원을 끕니다.

  shutdown -h now

Cloud Functions로 이동하여 function-weatherPubSubToBQ 옆에 있는 체크박스를 클릭한 다음 삭제를 클릭합니다.

ae95f4f7178262e0.png

Pub/Sub로 이동하여 주제를 클릭하고 날씨 데이터 주제 옆의 체크박스를 클릭한 다음 삭제를 클릭합니다.

6fb0bba3163d9a32.png

Storage로 이동하여 스토리지 버킷 옆에 있는 체크박스를 클릭한 다음 삭제를 클릭합니다.

9067fb2af9f907f4.png

bigquery.cloud.google.com으로 이동하여 프로젝트 이름 옆의 아래쪽 화살표를 클릭하고 weatherData 데이터 세트 오른쪽에 있는 아래쪽 화살표를 클릭한 다음 '데이터 세트 삭제'를 클릭합니다.

a952dfeec49248c4.png

메시지가 표시되면 데이터 세트 ID (weatherData)를 입력하여 데이터 삭제를 완료합니다.

6310b1cc8da31a77.png