이번 글에서는 이전 글에서 작성했던 필요한 API를 모두 구축하고 개발하면서 변경이 필요했었던 부분에 대해서 다루도록 하겠습니다. 그리고 docker compose를 이용한 Zookeeper를 포함한 Kafka 클러스터를 생성하도록 하겠습니다.
Riot API 호출 구현과 문제 상황
분석하는데 필요하다고 생각한 Riot API에 대해서 모두 구현을 완료했습니다. Riot 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
하지만 생각보다 Riot이 제공하는 데이터의 종류가 상당히 많았습니다. 특히 Match 정보를 조회하는 API는 최종적으로 MatchDTO를 response로써 제공해줬지만, MatchDTO는 상당히 많은 양의 변수들과 DTO를 포함했습니다. 그중 하나인 ParticipantDTO의 경우에는 100개가 넘는 변수가 존재했습니다.
처음에는 이를 모두 DTO로 정의하면서 response를 받아오려고 했습니다. 그래서 직접 변수명을 입력해주면서 상당히 많은 양의 DTO Class를 생성했습니다. 하지만 다른 문제가 다시 발생했습니다. Riot이 제공하는 Match 데이터가 업데이트 되었는지 Developer 페이지에 명시되어 있지 않은 데이터들도 포함이 되어있었습니다. 바로 participantDTO에 "challenges"라는 DTO 였습니다. challengesDTO는 또다시 100개 이상의 변수들을 포함하는 데이터였습니다. 그래서 수작업으로 이 100개가 넘는 변수들을 직접 정의해가며 DTO를 또 만들어야할까? 라는 의문이 들었습니다.
API response 데이터 저장 타입 변경
여러가지 생각을 한 결과, 최종적으로 Kafka에 데이터를 어떤 형태로 적재할지가 중요하다고 생각했습니다. 아무리 API 호출을 통해 response를 받아 DTO 객체에 담더라도 Kafka에 String 타입으로 한 번에 적재하면 앞서 만들었던 DTO 객체들은 모두 의미가 없기 때문입니다.
그래서 Kafka에 저장하는 데이터 타입은 추후 변경될 수 있겠지만, 현재로써는 API response를 그대로 String 형태로 저장하기로 했습니다. 그래서 Riot API를 호출해서 받는 모든 response를 모두 미리 정의한 DTO 객체에 담거나 Json 형태의 데이터를 파싱 처리하지 않고 통으로 String 변수에 저장했습니다. 지금 현재는 Json 객체로 Kafka에 전달합니다.
public String callRiotApi(String url){
try {
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
if(response.getStatusLine().getStatusCode() != 200){
return null;
}
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity);
log.debug(result);
return result;
} catch (IOException e){
e.printStackTrace();
return null;
}
}
Produce 하기 전 데이터 전처리를 위해 Riot API response는 String으로 그대로 가져오지만 이후 Service에서 JsonObject 형태로 return 시키도록 변경했습니다. 좀 더 자세한 코드 내용은 Github를 참고하세요.
Kafka 클러스터 생성
Data Pipeline Platform 중 가장 먼저 Kafka 클러스터를 구축하겠습니다. Kafka 클러스터의 경우에는 제 블로그에서 한번 다룬 적이 있습니다. 해당 글을 참고하시면 도움될 것 같습니다. 아래 docker-compose.yml 파일을 동일하게 만들거나 제 Github repository를 clone 한 뒤 kafka 폴더에서 바로 서비스를 시작하셔도 됩니다.
1. docker-compose.yml 파일 작성 방법
현재는 여러가지 설정 값들이 수정되었습니다. Github(Kafka docker-compose.yml) 참고바랍니다.
docker-compose.yml |
version: '2' services: zookeeper-1: image: confluentinc/cp-zookeeper:latest hostname: zookeeper-1 ports: - "12181:12181" environment: ZOOKEEPER_SERVER_ID: 1 ZOOKEEPER_CLIENT_PORT: 12181 ZOOKEEPER_TICK_TIME: 2000 ZOOKEEPER_INIT_LIMIT: 5 ZOOKEEPER_SYNC_LIMIT: 2 ZOOKEEPER_SERVERS: zookeeper-1:12888:13888;zookeeper-2:22888:23888;zookeeper-3:32888:33888 zookeeper-2: image: confluentinc/cp-zookeeper:latest hostname: zookeeper-2 ports: - "22181:12181" environment: ZOOKEEPER_SERVER_ID: 2 ZOOKEEPER_CLIENT_PORT: 12181 ZOOKEEPER_TICK_TIME: 2000 ZOOKEEPER_INIT_LIMIT: 5 ZOOKEEPER_SYNC_LIMIT: 2 ZOOKEEPER_SERVERS: zookeeper-1:12888:13888;zookeeper-2:22888:23888;zookeeper-3:32888:33888 zookeeper-3: image: confluentinc/cp-zookeeper:latest hostname: zookeeper-3 ports: - "32181:12181" environment: ZOOKEEPER_SERVER_ID: 3 ZOOKEEPER_CLIENT_PORT: 12181 ZOOKEEPER_TICK_TIME: 2000 ZOOKEEPER_INIT_LIMIT: 5 ZOOKEEPER_SYNC_LIMIT: 2 ZOOKEEPER_SERVERS: zookeeper-1:12888:13888;zookeeper-2:22888:23888;zookeeper-3:32888:33888 kafka-1: image: confluentinc/cp-kafka:latest hostname: kafka-1 ports: - "19092:19092" depends_on: - zookeeper-1 - zookeeper-2 - zookeeper-3 environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:12181,zookeeper-2:12181,zookeeper-3:12181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:19092 kafka-2: image: confluentinc/cp-kafka:latest hostname: kafka-2 ports: - "29092:29092" depends_on: - zookeeper-1 - zookeeper-2 - zookeeper-3 environment: KAFKA_BROKER_ID: 2 KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:12181,zookeeper-2:12181,zookeeper-3:12181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:29092 kafka-3: image: confluentinc/cp-kafka:latest hostname: kafka-3 ports: - "39092:39092" depends_on: - zookeeper-1 - zookeeper-2 - zookeeper-3 environment: KAFKA_BROKER_ID: 3 KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:12181,zookeeper-2:12181,zookeeper-3:12181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-3:39092 |
$ docker compose up -d
2. git clone 방법
$ git clone https://github.com/Taaewoo/Bigdata_Platform_on_Docker.git
$ cd kafka
$ docker compose up -d
위의 두 방법 중 아무거나 선택해서 진행하셨다면 아래처럼 zookeeper 3개, kafka 3개 container가 생성되었을 겁니다.
Riot으로부터 데이터를 받아올 수 있고 저장할 Kafka 클러스터도 생성했습니다. 다음 글에서부터는 Java를 이용한 Kafka produce 프로그래밍을 진행하고 Kafka topic 생성 및 설정을 진행하도록 하겠습니다.