[카카오 개발자 콘퍼런스] 발표: 윤도영 / 글: 김규형
01. 지식그래프 : 카카오미니와 검색 적용 소개 (발표: 남기훈 / 글: 김동현)
02. 눈으로 듣는 음악 추천 시스템 (발표: 최규민 / 글: 김태훈)
03. 이미지로 이미지 검색하기 (발표: 이주영 / 글: 이가람)
04. 딥러닝을 활용한 뉴스 메타 태깅 (발표: 김기도 / 글: 김규형)
05. 딥러닝을 이용한 실시간 인코딩 효율 최적화 (발표: 여욱형 / 글: 정소영)
06. 카카오 봇 플랫폼 소개 (발표: 황지수 / 글: 이형남)
07. 카카오가 가지고 있는 음성처리 기술 (발표: 노재근 / 글: 이형남)
08. 딥러닝을 이용한 얼굴 인식 (발표: 신종주 / 글: 김동현)
09. TOROS N2 (발표: 김성진 / 글: 김태훈)
10. 텐서플로로 OCR 개발해보기: 문제점과 문제점과 문제점 (발표: 모종훈·오형석 / 글: 이가람)
11. S2Graph와 GraphQL (발표: 윤도영 / 글: 김규형)
12. AI시대에 맞는 서비스 개발(발표: 이석영 / 글: 정소영)
기존 관계형 데이터베이스(relational database, RDB)에서는 모든 데이터가 어트리뷰트(attribute)와 튜플(tuple)의 테이블(table)로 표현되는 방식이지만, 그래프 DB에서는 버텍스(vertex)와 엣지(edge)로 표현되며 데이터는 버텍스와 엣지의 조합을 통해 저장되는 방식을 사용하고 있다. 버텍스는 사용자의 정보를 담고 있으며, 사용자 간의 관계(relation)는 엣지로, 엣지에 속성(property)을 추가하여 의미 있는 정보를 표현할 수 있게 된다.
S2Graph는 카카오의 서비스에 적용되고 있는 대용량 분산 그래프 데이터베이스이다. 스칼라 언어를 바탕으로 구성되어 있고, Play 프레임워크(framework)로 그래프 API를 작성하였다. 백엔드에는 Hbase, Kafka, Spark 등의 기술이 적용되어 효율적인 처리가 가능하도록 되어 있다. S2Graph 이전에는 MySQL을 사용하였으나, 늘어나는 서비스를 기존의 구조로 유지하기에는 한계가 있어 도입한 그래프 DB이다.
사용자의 활동은 액션 타입(action type)으로 정의되고, 이것을 활동에 따라 여러 개 묶어내어 액티비티(activity)라 한다. 액티비티는 사용자와 서비스, 사용자와 사용자 사이의 활동으로 정의된다. 모인 데이터를 사용하여 어떤 질문에 대한 답을 줄 수 있는 프로그램을 모델이라 정의하고, 분석에 의하여 생성되는 데이터가 된다. 사용자의 활동에 따라 사용자를 기준으로 하는 데이터가 누적되고, 엣지에 속성을 적용하여 그래프로 구성한 것을 마스터 그래프라 한다. 마스터 그래프는 그래프적인 구조뿐만 아니라 필요한 때 머신러닝을 위한 재료로 사용될 수 있도록 매트릭스 형태로 변환될 수도 있어 다른 서비스와의 연계도 원활하게 가능하다.
카카오에서는 S2Graph DB 시스템을 도입하여 모든 로그를 그래프화 시키고 있다. 그래프 DB는 사용자들의 활동 데이터를 실시간으로 저장할 뿐만 아니라, 사용자에 대한 분석 결과도 같은 그래프 안에서 구축하고 있다. 또한, 그래프 구조에 대해 쿼리를 날려 결과를 얻을 수도 있다. 이번에 GraphQL이 지원되기 시작하면서 직관적인 쿼리를 통해 쉽게 결과를 얻을 수 있게 되었다.
카카오의 서비스는 담당하고 있는 각각의 서버에서 관리되고 있다. 서비스 간 데이터를 연동하기 위해서는 각각의 구조에 맞는 API로 일일이 콜을 보내 리턴을 받고, 다시 연결해야 하는 서비스의 구조로 재처리하여 보내야 하는 과정이 많이 발생하게 된다. 카카오에서 지원하는 서비스가 수십 가지가 되고 있기 때문에, 각 서비스를 연동시키려면 각각에 대응하는 API가 상당히 많이 필요하고, 때때로 담당자가 이직하거나 변경된 경우 데이터의 형태와 특성을 파악하는 부분에서부터 상당한 문제가 발생하였다.
통합된 플랫폼에서는 데이터를 일관적인 형태로 관리함으로써 서비스 간 소통의 어려움 문제를 해결하고, 사용자를 기준으로 데이터를 수집하여 사용자의 상태에 대해 더 많은 정보를 확보할 수 있다는 점을 장점으로 두고 있다. 또한, 모델을 작성하고 DB에 저장하는 과정에서 방문하지 않은 사용자들의 정보도 한꺼번에 처리하기 때문에 시간과 공간적으로 많은 비효율이 발생하였는데, 기존에는 모델에 모든 인풋을 집어넣고 결과를 저장했다면, 그래프 DB에서는 모델을 바이너리로 처리해 임베딩 한 후, 요청이 왔을 때 DB에서 바로 처리해 결과를 출력하는 방법을 도입하였다.
GraphQL은 페이스북이 개발하여 발표한 데이터 쿼리 언어로, 많은 개발 언어에서 도입을 지원하고 있다. 그래프 QL은 사용자가 데이터에 대해 쿼리를 보낸 내용을 서버 사이드에서 동작하여 처리해 주게 된다. 또한, 특정한 데이터베이스나 엔진에 종속되지 않는 시스템이기 때문에 다양한 환경에서 사용할 수 있는 점을 장점으로 들 수 있다. 그래프 QL은 데이터와 모델을 한 번에 쿼리로 처리할 수 있다.
카카오 내부에서는 처음에는 아파치 하이브 쿼리로 모든 작업을 처리하였지만, 구성이 아주 비효율적이었기 때문에 그래프 QL을 사용하여 쿼리를 지원하게 되었고, 쿼리를 보내는 측에서는 출력되는 값이 드루이드(apache druid, 통계 시스템)에서 온 자료인지, 또는 다른 모델에서 계산되어 출력된 값인지 구분할 필요가 없도록 구성되었다. 데이터 단과 쿼리 단을 완전히 분리하여 개발 자유도를 높이기 위한 설계이기도 하다.
OLTP 서비스를 위해 처음에는 json 형태의 custom 한 S2Graph rest 쿼리로 처리했지만, 공개된 표준이 아니기에 다른 툴들과 연동하는데 문제가 많았다. 그래프 QL을 지원하고 모델 embedding을 지원하게 되면서 표준화된 interface로 데이터와 모델의 결과를 함께 조회할 수 있게 되었다. 또 시스템에 쿼리 하는 클라이언트 측에서는 출력되는 값이 드루이드에서 온 자료인지, 또는 다른 모델에서 계산되어 출력된 값인지 구분할 필요가 없도록 구성되었다. 데이터 단과 쿼리 단을 완전히 분리하여 개발 자유도를 높이기 위한 설계이기도 하다.
※ 'Apache S2Graph기반 머신러닝 모델 환경 구축'에 대한 더욱 자세한 내용은 카카오 AI 리포트 2018년 9월호를 참고하시기 바랍니다. (https://brunch.co.kr/@kakao-it/294)
본문에 삽입된 슬라이드 자료는 'if kakao 2018' 개발자 콘퍼런스 발표자료에서 인용하였습니다.
(출처: https://if.kakao.com)
콘퍼런스 발표 | 윤도영 shon.0@kakaocorp.com
글 | 김규형 civtale@gmail.com
고려대학교 전기전자공학과 석사과정으로, 딥 러닝 기반 자연어 처리에 관심이 많습니다. 성향 분석이나 이슈 검출을 자연어와 연결시켜 의미 있는 결과를 만들어내는 것을 좋아하고, 데이터가 많은 곳을 직접 찾아다니려는 성향이 강합니다. 명확하지 않은 분야의 분석 모델을 구축하는 것을 좋아합니다.
참고문헌
* 참고 | Kakao의 오픈소스 Ep1 – 대용량 분산 그래프 DB “S2Graph”,
http://tech.kakao.com/2016/01/29/opensource-1-s2graph/
* 참고 | Introduction to GraphQL, GraphQL.org, https://graphql.org/learn
* 참고 | Facebook GraphQL Github, https://github.com/graphql
* 참고 | Apache Druid, http://druid.io/