이번 글부터는 분석을 위한 데이터의 API를 알아보고 대략적인 아키텍처 설계를 해보겠습니다. 처음 진행하는 프로젝트이고 아직 제가 안써본 것들이 많기 때문에 진행하면서 지속적으로 바뀔 수 있습니다. 하지만 가장 먼저 설계를 하고 틀을 잡아야 목표를 잡을 수 있을 것 같아서 대략적으로 진행했습니다.
필요한 Riot API 리스트
지난 글에서는 닉네임을 통한 계정 조회 API를 구현해봤습니다. 이어서 필요한 API를 더 조사해봤습니다. 다양한 API들이 존재했지만, 계정 정보와 해당 계정이 플레이한 match, match의 디테일한 내용을 얻을 수 있는 API를 추렸을 때 아래와 같이 4개의 API가 필요로 하는 서비스였습니다.
- 소환사 이름으로 계정 조회 : /lol/summoner/v4/summoners/by-name/{summonerName}
- 소환사 puuid로 match id 조회 : /lol/match/v5/matches/by-puuid/{puuid}/ids
- match id로 해당 match 정보 조회 : /lol/match/v5/matches/{matchId}
- match id로 해당 match timeline 정보 조회 : /lol/match/v5/matches/{matchId}/timeline
이 때 match의 내용들을 조회하기 위해서는 match id가 필요했는데, 마찬가지로 match id를 알기 위해서는 소환사 이름으로 계정을 조회해 puuid를 알아야 했습니다.
플랫폼 아키텍처 설계
Riot이 제공하는 API에서부터 데이터 수집, 저장, 처리를 하는 단계까지 설계를 진행해봤습니다. 하지만 이것은 프로젝트를 진행하면서 바뀔 수 있다는점 참고바랍니다.
Collection
가장 먼저 데이터를 수집하는 부분입니다. Riot이 제공하는 API는 앞선 글에서처럼 Spring framework를 통해 API를 호출하고 전달 받은 데이터를 Kafka 클러스터에 produce합니다. 이 때 데이터를 API로부터 받아 Kafka에 적재하는 과정은 수동으로 매번 진행하지 않을 것입니다. 대신에 Airflow를 통한 Batch scheduling을 함으로써 자동화 시키려고 합니다.
하지만 중간에 Kafka를 사용하는 것은 이후에 Elasticsearch로 변경될 가능성은 있습니다. 왜냐하면 Riot 데이터를 잠깐 확인했을 때 Json 형태로 상당히 긴 match timeline 정보가 있기 때문에 ELK를 사용하면 더 효율적이지 않을까라는 생각을 했기 때문입니다. 상황에 따라서는 Kafka와 ELK를 모두 사용할 수도 있습니다.
Kafka에 적재된 데이터들은 최종적으로 HDFS에 저장해야하는데 그 역할을 Spark streaming이 할 예정입니다. 이 부분에 있어서는 Spark streaming 말고도 다른 대안들이 많이 있습니다. 가장 흔하게는 Kafka streams를 사용할 수도 있습니다. Kafka topic을 Spark streaming을 통해 consume하는 과정 또한 Airflow를 사용하여 Batch scheduling 할 예정입니다.
Storage
데이터를 저장하기 위한 용도로 HDFS를 선택했습니다. 최근 데이터 저장의 용도로 HDFS 이외에도 S3 등 여러가지 좋은 소프트웨어가 있습니다. 하지만 HDFS를 선택했던 이유는 Hive와 Spark 등 여러 소프트웨어를 Hadoop 플랫폼 위에서 사용하고 싶었기 때문입니다.
HDFS의 고가용성(HA)를 위하여 Zookeeper, Journal Node, Name Node를 추가적으로 더 만들어줘야 하지만, 제가 사용하려는 작은 local PC에서 이러한 것들을 모두 감당할 수 있을지는 모르겠네요 ㅎㅎ...
Processing
HDFS에 저장되어 있는 데이터를 처리하기 위해 Hive나 Spark를 이용할 예정입니다. 이 때 Hive query는 Spark에서 직접 사용할 예정이지만, 경우에 따라서 Hive도 직접 사용할 수 있습니다.
그리고 Spark를 사용할 때 처음에는 Jupyter 없이 사용할 예정이지만, 불편함이 극에 달할 경우 Jupyter도 추가적으로 구축하려고 합니다.
1차 개발 목표
이번 프로젝트의 1차 개발 목표는 위에서 말한 4개의 API 호출 구현과 앞서 설계한 아키텍처를 Docker compose(또는 Docker swarm)를 통해 MSA로 구성해보는 것입니다. Docker로 구성되는 플랫폼은 아래 링크를 통해서 공유될 예정입니다.
https://github.com/Taaewoo/Bigdata_Platform_on_Docker