Superset 소개와 내가 한 일들!

Superset 튜닝은 내가 PUBG 데이터팀에 와서 한 대표적인 일중 하나이다. 여기서 Superset에 관해 짧게 소개하고, 내가 한 일들을 적으려 한다.

What is Superset?


Superset은 AirBnB에서 개발한 오픈소스 BI툴이다. Flask-App-Builder를 기반으로 만들어져있고, React가 Front로 붙어있다. 다른 현존하는 인기 BI툴인 Looker, Power BI, Tableau에 비하여 Superset은 뭐가 좋고 뭐가 안좋을까?

장점)

  1. Superset은 오픈소스임으로 공짜이다. Preset이라고 클라우드에서 관리해주는게 있지만..그다지 필요하지 않다.
  2. 비교적 다양한 차트를 제공해준다. Echarts를 사용해 다양하게 제공한다.
  3. 다양한 데이터베이스와 호환이 된다.
  4. 필요에 맞게 커스텀 할 수 있다.
  5. 이쁘다.

단점)

  1. Time이 x축이 아닌 경우 support이 조금 부족하다.
  2. 오픈소스라 확실히 조금씩 문제가 있다.

Superset 구조

짧게 설명하면 이런 구조를 가지고 있다고 보면 된다.
좀 더 복잡한 버전을 설명하면 다음과 같다 (Websocket 버전)
간단하게만 이를 설명하면, Superset은 Superset Node, Celery Job Queue (Redis), Metadata Storage, Cache, Superset Worker (Celery), Result Backend로 이루어진다. 과정과 함께 이를 설명해 보겠다.

  1. 클라이언트 관련 정보, Chart 관련 정보 등은 Metadata 들어간다.
  2. 클라이언트가 Query를 제출한다.
  3. Query Task는 Celery Job Queue로 들어간다.
  4. 다른 쿼리가 들어왔다면, 먼저 Query Task를 Celery Job Queue로 보낸다.
  5. Celery Job Queue에 있는 것들을 Superset Worker가 가져간다.
  6. Worker는 Cache를 확인해 해당 쿼리가 있는지 확인한다. 있으면 그 결과 값을 쓴다.
  7. 없다면 Database에 구동하고, Cache에 넣어준다.
  8. 구동된 결과값은 Result Backend에 넣어준다.

내가 한 일들

  • 리소스 조정하기
    • Superset Node를 늘려서 Node별 리소스 사용량을 줄여주고 Response Time도 단축시켰다.
    • gunicorn 설정을 gevent로 바꿔서 메모리를 안정화하고 Response Time을 단축시켰다 (기존 gthread)
    • Max Reqeust를 조정하여 Response Time을 단축했다.

gunicorn은 web server gateway interface의 일종으로 web server와 web application을 연결시킨다 (그러나 웹서버 역할도 수행함). 사진은 이를 보면 좋다.

gthread는 worker가 여러개의 thread를 가질 수 있게 한다. Async하지않은걸 원할때 사용한다. 반면 gevent는 async한 구동을 할때 좋다.

max request는 정해진 수치만큼 차면 재시작한다. 메모리 부족 현상을 해결할 수 있다.

  • window.location.reload()로 focus를 잃으면 브라우저를 새로 고침하게 하여 대시보드 수정사항 반영
  • 기존 캐시를 날리는 Auto Refresh를 Cache를 날리는 Force Refresh가 아닌 그냥 Refresh로 하게 함
  • Time을 Inclusive하게 변경
  • componentDidMount, componentWillUnmount, componentDidUpdate를 통해 대시보드 나온 이후에도 Refresh되는 이슈 해결

팀의 유경님과 함께 하였고…! Superset Repo에 일부는 실제로 Contribute도 하였다!

  • https://github.com/apache/superset/pull/17039
  • https://github.com/apache/superset/pull/17112

Reference

https://github.com/apache/superset
https://velog.io/@jimin_lee/Nginx%EC%99%80-Gunicorn-%EB%91%98-%EC%A4%91-%ED%95%98%EB%82%98%EB%A7%8C-%EC%8D%A8%EB%8F%84-%EB%90%A0%EA%B9%8C