본문 바로가기
CSP (Cloud Service Provider)/AWS

[AWS] 실시간 데이터 파이프라인 구축(1)

by BTC_티모 2023. 9. 22.

탑신병자 듀오 팀 티모입니다.

오늘은 AWS를 기반으로 실시간 데이터 파이프라인을 구축해보겠습니다.


실습 과정부터 설명드리겠습니다.
실습 진행을 위한 IoT 데이터는 Kinesis Data Generator를 이용해 실시간 데이터를 생성하는 것으로 대체합니다.

  1. Kinesis Data Streams : 지속적으로 생산되는 실시간 IoT 로그들을 Kinesis Data Streams 내 Buffer Storage에 수집합니다. 수집된 데이터들은 Shard에 저장되며 Consumer들은 Shard에 저장된 데이터들을 가져가 사용합니다.
  2. Glue Streaming : ETL 서비스인 AWS Glue을 통해 Kinesis Data Streams에 쌓이는 실시간 데이터를 처리합니다.
    처리가 완료된 데이터들은 Amazon S3에 저장합니다.
  3. Glue Data Catalog : 실시간 유입되는 데이터들을 처리하기 위해 데이터의 스키마 형식을 Glue Data Catalog에 저장합니다. Glue Streaming(2)에서는 사전에 정의된 스키마를 기준으로 데이터를 처리합니다.
  4. Reference Data(S3) : Glue Streaming(2)에서 실시간으로 유입되는 데이터들을 Join하기 위한 Reference 데이터를 S3에 저장합니다
  5. Glue Crawler / Glue Data Catalog : 2~4 과정을 거쳐 최종적으로 S3에 저장된 데이터들을 스캔하여 데이터 카탈로그를 생성, 하나 이상의 테이블을 생성합니다. 여기서 정의된 데이터 카탈로그를 기준으로 Athena를 통해 데이터를 분석합니다.
  6. Amazon Athena :  Glue Data Catalog를 참조하여 S3의 데이터에 대해 SQL 기반의 분석을 진행합니다.
    이를 통해 ETL이 완료된 데이터를 간편하게 데이터를 분석 할 수 있습니다.
  7. Amazon Quicksight : Athena(6)를 통해 분석한 결과들을 다양한 대시보드 기능을 통해 시각화하여 사용자가 원하는 방식으로 데이터 분석 결과를 보여줍니다.

IoT Device ~ 1까지의 실습 진행 과정입니다.
우선 CloudFormation 스택을 생성합니다.

템플릿 소스는 S3 URL로 지정, AWS workshop에서 제공된 URL를 이용합니다.
https://398670302919-workshop-streaming.s3.ap-northeast-2.amazonaws.com/Builders.yaml

스택 이름 생성 후 모두 기본 옵션으로 두고 검토 단계에서 IAM 리소스 생성 확인 버튼을 체크합니다.

AWS가 실습용으로 제공하는 Module1, Module2 Cloudformation가 생성됩니다.

Module1이 Create_completed 상태가 되면 Generator를 생성합니다.

Cloudformation > Module1의 출력 에서 Kinesis Data Generator의 URL과 ID/Password를 확인할 수 있습니다.
바로 밑의 URL로 Kinesis Data Generator에 접속해 ID, Password로 로그인합니다.

로그인 후 다음과 같이 설정후 send data로 데이터를 전송해봅니다.
Region = ap-northeast-2
Stream/delivery stream(실시간 데이터를 보낼 곳) = iot-data-stream-1
Records per second(초당 레코드 수) = 10
Template 1 = 아래 코드

{
    "uuid": "{{random.uuid}}",
    "device_ts": "{{date.utc("YYYY-MM-DD HH:mm:ss.SSS")}}",
    "device_id": {{random.number(50)}},
    "device_temp": {{random.weightedArrayElement(
    {"weights":[0.30, 0.30, 0.20, 0.20],"data":[32, 34, 28, 40]}
    )}},
    "track_id": {{random.number(30)}},  
    "activity_type": {{random.weightedArrayElement(
        {
            "weights": [0.3, 0.2, 0.3, 0.1, 0.1],
            "data": ["\"Running\"", "\"Working\"", "\"Walking\"", "\"Traveling\"", "\"Sitting\""]
        }
    )}}
}

Kinesis Data Streams > iot-data-stream1을 클릭, 데이터 뷰어에서 샤드를 지정한 후 레코드를 가져와 확인합니다.

 


다음은 2~4까지의 실습 진행 과정입니다.

먼저 실시간 데이터를 처리하기 위한 데이터 스키마를 Glue Data Catalog에서 정의해야 합니다.

Glue > Data Catalog - Tables > Add Table 과정을 통해 생성합니다.

테이블과 DB 이름을 지정합니다. DB는 create Database를 누른 후 지정합니다.

  • Table Name : iot-stream-raw
  • Database Name : iotstream

 

해당 테이블의 데이터 소스 및 경로를 아래와 같이 지정하고 Schema 지정을 위해 Next 버튼을 클릭합니다.

  • Type of Source : Kinesis
  • Region : Asis Pacific(Seoul)
  • Kinesis streams name : iot-data-stream-1

스키마 지정 화면에서 Edit schema as JSON 버튼을 클릭, 아래 코드로 스키마를 지정 후 생성합니다.

여기까지가 실시간 데이터를 처리하기 위한 데이터 스키마 형식을 생성한 것입니다.

[
  {
    "Name": "uuid",
    "Type": "string",
    "Comment": "uuid as string"
  },
  {
    "Name": "device_ts",
    "Type": "timestamp",
    "Comment": "device timestamp as timestamp"
  },
  {
    "Name": "device_id",
    "Type": "int",
    "Comment": "device id as integer"
  },
  {
    "Name": "device_temp",
    "Type": "int",
    "Comment": "device temperature as integer"
  },
  {
    "Name": "track_id",
    "Type": "int",
    "Comment": "track id as integer"
  },
  {
    "Name": "activity_type",
    "Type": "string",
    "Comment": "Activity type as string"
  }
]

이제 실시간 데이터들을 Join하기 위한 레퍼런스 데이터를 설정해봅니다.

하단의 코드를 reference_data.json 의 이름을 한 JSON파일로 만듭니다.

Amazon S3로 이동 후, Cloudformation으로 생성한 {AccountID}-builders-analytics 버킷 안에 두 폴더를 생성합니다.

이후 reference 폴더 안에 Json 파일을 업로드합니다.

  • 폴더 1 : reference
  • 폴더 2 : transformed

{"track_id" : "1" , "track_name" : "God's Plan" , "artist_name" : "Drake"}
{"track_id" : "2" , "track_name" : "Meant To Be" , "artist_name" : "Bebe Rexha & Florida Georgia Line"}
{"track_id" : "3" , "track_name" : "Perfect" , "artist_name" : "Ed Sheeran"}
{"track_id" : "4" , "track_name" : "Finesse" , "artist_name" : "Bruno Mars & Cardi B"}
{"track_id" : "5" , "track_name" : "Psycho" , "artist_name" : "Post Malone Featuring Ty Dolla $ign"}
{"track_id" : "6" , "track_name" : "The Middle" , "artist_name" : "Zedd, Maren Morris & Grey"}
{"track_id" : "7" , "track_name" : "Sad!" , "artist_name" : "XXXTentacion"}
{"track_id" : "8" , "track_name" : "Havana" , "artist_name" : "Camila Cabello Featuring Young Thug"}
{"track_id" : "9" , "track_name" : "Freaky Friday" , "artist_name" : "Lil Dicky Featuring Chris Brown"}
{"track_id" : "10" , "track_name" : "Pray For Me" , "artist_name" : "The Weeknd & Kendrick Lamar"}
{"track_id" : "11" , "track_name" : "Look Alive" , "artist_name" : "BlocBoy JB Featuring Drake"}
{"track_id" : "12" , "track_name" : "Stir Fry" , "artist_name" : "Migos"}
{"track_id" : "13" , "track_name" : "Ric Flair Drip" , "artist_name" : "Offset & Metro Boomin"}
{"track_id" : "14" , "track_name" : "All The Stars" , "artist_name" : "Kendrick Lamar & SZA"}
{"track_id" : "15" , "track_name" : "Mine" , "artist_name" : "Bazzi"}
{"track_id" : "16" , "track_name" : "New Rules" , "artist_name" : "Dua Lipa"}
{"track_id" : "17" , "track_name" : "Let You Down" , "artist_name" : "NF"}
{"track_id" : "18" , "track_name" : "Rockstar" , "artist_name" : "Post Malone Featuring 21 Savage"}
{"track_id" : "19" , "track_name" : "Never Be The Same" , "artist_name" : "Camila Cabello"}
{"track_id" : "20" , "track_name" : "Walk It Talk It" , "artist_name" : "Migos Featuring Drake"}
{"track_id" : "21" , "track_name" : "Him & I" , "artist_name" : "G-Eazy & Halsey"}
{"track_id" : "22" , "track_name" : "Thunder" , "artist_name" : "Imagine Dragons"}
{"track_id" : "23" , "track_name" : "Plug Walk" , "artist_name" : "Rich The Kid"}
{"track_id" : "24" , "track_name" : "Whatever It Takes" , "artist_name" : "Imagine Dragons"}
{"track_id" : "25" , "track_name" : "I Fall Apart" , "artist_name" : "Post Malone"}
{"track_id" : "26" , "track_name" : "Lights Down Low" , "artist_name" : "MAX Featuring gnash"}
{"track_id" : "27" , "track_name" : "King's Dead" , "artist_name" : "Jay Rock, Kendrick Lamar, Future & James Blake"}
{"track_id" : "28" , "track_name" : "Friends" , "artist_name" : "Marshmello & Anne-Marie"}
{"track_id" : "29" , "track_name" : "Wait" , "artist_name" : "Maroon 5"}
{"track_id" : "30" , "track_name" : "Heaven" , "artist_name" : "Kane Brown"}
{"track_id" : "31" , "track_name" : "Marry Me" , "artist_name" : "Thomas Rhett"}
{"track_id" : "32" , "track_name" : "Say Something" , "artist_name" : "Justin Timberlake Featuring Chris Stapleton"}
{"track_id" : "33" , "track_name" : "Bad At Love" , "artist_name" : "Halsey"}
{"track_id" : "34" , "track_name" : "Feel It Still" , "artist_name" : "Portugal. The Man"}
{"track_id" : "35" , "track_name" : "Moonlight" , "artist_name" : "XXXTentacion"}
{"track_id" : "36" , "track_name" : "You Make It Easy" , "artist_name" : "Jason Aldean"}
{"track_id" : "37" , "track_name" : "Changes" , "artist_name" : "XXXTentacion"}
{"track_id" : "38" , "track_name" : "Bartier Cardi" , "artist_name" : "Cardi B Featuring 21 Savage"}
{"track_id" : "39" , "track_name" : "Outside Today" , "artist_name" : "YoungBoy Never Broke Again"}
{"track_id" : "40" , "track_name" : "Lemon" , "artist_name" : "NERD & Rihanna"}
{"track_id" : "41" , "track_name" : "Wolves" , "artist_name" : "Selena Gomez X Marshmello"}
{"track_id" : "42" , "track_name" : "Love." , "artist_name" : "Kendrick Lamar Featuring Zacari"}
{"track_id" : "43" , "track_name" : "MotorSport" , "artist_name" : "Migos, Nicki Minaj & Cardi B"}
{"track_id" : "44" , "track_name" : "No Limit" , "artist_name" : "G-Eazy Featuring A$AP Rocky & Cardi B"}
{"track_id" : "45" , "track_name" : "New Freezer" , "artist_name" : "Rich The Kid Featuring Kendrick Lamar"}
{"track_id" : "46" , "track_name" : "Young Dumb & Broke" , "artist_name" : "Khalid"}
{"track_id" : "47" , "track_name" : "Most People Are Good" , "artist_name" : "Luke Bryan"}
{"track_id" : "48" , "track_name" : "How Long" , "artist_name" : "Charlie Puth"}
{"track_id" : "49" , "track_name" : "Found / Tonight" , "artist_name" : "Lin-Manuel Miranda & Ben Platt"}
{"track_id" : "50" , "track_name" : "Sky Walker" , "artist_name" : "Miguel Featuring Travis Scott"}
{"track_id" : "51" , "track_name" : "Powerglide" , "artist_name" : "Rae Sremmurd & Juicy J"}
{"track_id" : "52" , "track_name" : "All On Me" , "artist_name" : "Devin Dawson"}
{"track_id" : "53" , "track_name" : "Love Lies" , "artist_name" : "Khalid & Normani"}
{"track_id" : "54" , "track_name" : "Dura" , "artist_name" : "Daddy Yankee"}
{"track_id" : "55" , "track_name" : "Broken Halos" , "artist_name" : "Chris Stapleton"}
{"track_id" : "56" , "track_name" : "Everyday" , "artist_name" : "Logic & Marshmello"}
{"track_id" : "57" , "track_name" : "Singles You Up" , "artist_name" : "Jordan Davis"}
{"track_id" : "58" , "track_name" : "IDGAF" , "artist_name" : "Dua Lipa"}
{"track_id" : "59" , "track_name" : "X" , "artist_name" : "Nicky Jam x J Balvin"}
{"track_id" : "60" , "track_name" : "Five More Minutes" , "artist_name" : "Scotty McCreery"}
{"track_id" : "61" , "track_name" : "Billy" , "artist_name" : "6ix9ine"}
{"track_id" : "62" , "track_name" : "Top Off" , "artist_name" : "DJ Khaled Featuring JAY Z, Future & B"}
{"track_id" : "63" , "track_name" : "Gummo" , "artist_name" : "6ix9ine"}
{"track_id" : "64" , "track_name" : "No Excuses" , "artist_name" : "Meghan Trainor"}
{"track_id" : "65" , "track_name" : "Hardaway" , "artist_name" : "Derez De'Shon"}
{"track_id" : "66" , "track_name" : "Delicate" , "artist_name" : "Taylor Swift"}
{"track_id" : "67" , "track_name" : "The Remedy For A Broke Heart (Why Am I So In Love)" , "artist_name" : "XXXTentacion"}
{"track_id" : "68" , "track_name" : "Zombie" , "artist_name" : "Bad Wolves"}
{"track_id" : "69" , "track_name" : "El Farsante" , "artist_name" : "Ozuna & Romeo Santos"}
{"track_id" : "70" , "track_name" : "44 More" , "artist_name" : "Logic"}
{"track_id" : "71" , "track_name" : "Pick It Up" , "artist_name" : "Famous Dex Featuring A$AP Rocky "}
{"track_id" : "72" , "track_name" : "In My Blood" , "artist_name" : "Shawn Mendes"}
{"track_id" : "73" , "track_name" : "Tell Me You Love Me" , "artist_name" : "Demi Lovato"}
{"track_id" : "74" , "track_name" : "The Long Way" , "artist_name" : "Brett Eldredge"}
{"track_id" : "75" , "track_name" : "Red Roses" , "artist_name" : "Lil Skies Featuring Landon Cube"}
{"track_id" : "76" , "track_name" : "Betrayed" , "artist_name" : "Lil Xan"}
{"track_id" : "77" , "track_name" : "NBAYoungboat" , "artist_name" : "Lil Yachty Featuring NBA YoungBoy"}
{"track_id" : "78" , "track_name" : "When We" , "artist_name" : "Tank"}
{"track_id" : "79" , "track_name" : "No Smoke" , "artist_name" : "YoungBoy Never Broke Again"}
{"track_id" : "80" , "track_name" : "I Like Me Better" , "artist_name" : "Lauv"}
{"track_id" : "81" , "track_name" : "Nowadays" , "artist_name" : "Lil Skies Featuring Landon Cube"}
{"track_id" : "82" , "track_name" : "Numb" , "artist_name" : "XXXTentacion"}
{"track_id" : "83" , "track_name" : "Infinity (888)" , "artist_name" : "XXXtentacion Featuring Joey Bada$$"}
{"track_id" : "84" , "track_name" : "One Number Away" , "artist_name" : "Luke Combs"}
{"track_id" : "85" , "track_name" : "I Lived It" , "artist_name" : "Blake Shelton"}
{"track_id" : "86" , "track_name" : "Sit Next To Me" , "artist_name" : "Foster The People"}
{"track_id" : "87" , "track_name" : "Tequila" , "artist_name" : "Dan + Shay"}
{"track_id" : "88" , "track_name" : "Narcos" , "artist_name" : "Migos"}
{"track_id" : "89" , "track_name" : "Booty" , "artist_name" : "Blac Youngsta"}
{"track_id" : "90" , "track_name" : "She's With Me" , "artist_name" : "High Valley"}
{"track_id" : "91" , "track_name" : "Sativa" , "artist_name" : "Jhene Aiko Featuring Swae Lee Or Rae Sremmurd"}
{"track_id" : "92" , "track_name" : "Written In The Sand" , "artist_name" : "Old Dominion"}
{"track_id" : "93" , "track_name" : "Beautiful Trauma" , "artist_name" : "P!nk"}
{"track_id" : "94" , "track_name" : "Tempo" , "artist_name" : "Chris Brown"}
{"track_id" : "95" , "track_name" : "Going Down!" , "artist_name" : "XXXTentacion"}
{"track_id" : "96" , "track_name" : "At The Club" , "artist_name" : "Jacquees X Dej Loaf"}
{"track_id" : "97" , "track_name" : "Echame La Culpa" , "artist_name" : "Luis Fonsi & Demi Lovato"}
{"track_id" : "98" , "track_name" : "La Modelo" , "artist_name" : "Ozuna x Cardi B"}
{"track_id" : "99" , "track_name" : "Dark Knight Dummo" , "artist_name" : "Trippie Redd Featuring Travis Scott"}
{"track_id" : "100" , "track_name" : "Everybody Hates Me" , "artist_name" : "The Chainsmokers"}

이제 Glue Crawler를 사용해 S3에 저장된 Reference Data를 스캔하여 스키마를 정의합니다.

이를 통해 reference data에 대한 테이블을 생성합니다.

Glue > Create crawler 후 이름을 지정합니다.

  • name : reference_crawler

Add a data source > 데이터 소스는 S3로 지정하고, 다음과 같이 설정합니다.

  • s3 path : {AccountID}-builders-analytics/reference/

Glue Crawler를 실행하기 위한 IAM, Crawler를 통해 생성한 테이블이 속할 데이터베이스를 각각 지정합니다.

  • IAM Role : Glueadmin
  • Target Database : iotstream

 

Crawler 생성이 완료되면 실행시켜 S3에 저장된 JSON 파일을 대상으로 스캐닝을 시작합니다.

Status = Completed로 완료 된 사항을 확인했다면,

Glue - Data Catalog - Database - Table 메뉴로 이동하고 Refresh 버튼을 클릭합니다.

Glue Crawler를 통해 S3의 Reference 데이터를 스캔하여 reference 테이블을 생성한 것을 확인 할 수 있습니다.

 

테이블이 정상적으로 생성되고 데이터가 확인 가능한지 확인해보도록 하겠습니다.

Table data를 누르면 Amazon Athena로 이동합니다.

Athena를 통해 SQL 쿼리를 실행하기 이전에, 쿼리 결과를 저장할 공간을 선택해야 하므로 설정 편집을 합니다.

  • 쿼리 결과 위치 : {AWS Account-ID}-builders-analytics-athena/

다시 Athena 편집기 메뉴로 돌아와 쿼리를 실행합니다. 하단의 쿼리 결과들이 나열되는 사항을 확인 할 수 있습니다.

이를 통해 Refrence 데이터들이 정상적으로 생성되고 데이터를 확인 할 수 있습니다.


 

다음 시간에는 Glue Streaming Job을 생성하고 실행하는 방법부터 이어서 진행하겠습니다.

감사합니다.

 

'CSP (Cloud Service Provider) > AWS' 카테고리의 다른 글

AWS VPN의 서비스의 이해  (0) 2023.09.26
[AWS] Transit Gateway 구성 옵션  (0) 2023.09.22
AWS Budgets 사용 방법  (1) 2023.09.18
AWS Tag Editor 사용하기  (0) 2023.09.18
[AWS] Amazon Route 53 - 지리적 라우팅  (0) 2023.09.16

댓글