2015년 1월 14일 수요일

Elasticsearch 사용기 1 - 리얼타임 분석엔진입장에서 elasticSearch vs Strom

elasticSearch 는 빅데이타 에코시스템의 부족한 부분 중 상당히 많은 부분을 체워 줄 수 있다. 물론 이 부분을 다른 여러 가지로 나누어 메꾸거나, Storm 이라는 걸쭉한 리얼타임 엔진으로 대부분을 커버 할 수도 있긴 하다.

그러나, storm 을 기 사용하고 있었고, elasticSearch 를 짧은 시간이나마 다시 운영 Hadoop에 적용하여, 이리 저리 실험적으로 사용해본 첫 느낌으로는.....

Real Time Analytics 에 있어 Storm 과 elasticSearch 는,
마치 Java Map/Reduce (on Spring Hadoop) 와 REPL 콘솔을 갖춘 Scala In-Memory M/R (on Spark) 의 차이와 같은 느낌이라고나 할까....(비유가 더 어려웠나???)

여튼 Storm 은 멀 할라 치믄 일단, 할게 많고, 공들여 개발한 다음 배포하고, 데이타를 원하는 포맷으로 이리 저리 필터 걸거나 조건을 넣어, 실제로 드려다 보기까지 귀찮은 작업이 이만 저만이 아니다... 그리고 원하는 데로 결과가 나오지 않아 검증이라도 하고싶거나, 혹은 뭔가 결과가 나오긴 했는데, 과연 맞게 나온 결과인지, 런타임 디버깅이라도 해보고 싶다면, 여간 난감한게 아니다. 그래서, 상용 솔루션이긴 하지만, 에스퍼(http://esper.codehaus.org/)를 Collaboration 을 해서 쓰거나, 아예 좀더 애자일 하게 Storm을 쓰기 위해 clojure  와 trident 기반으로 Storm 을 사용하는 경우(우리처럼...)도 많이 봐왔다.

elasticSearch 는 일단, 여러가지 plugin 중 head 하나만 가지고도  할수 있는게 상당히 많다. 코딩을 하기 전, 데이타를 이리저리 만지작 거리며, 제대로된 모델을 사전 검증하거나, 중간 단계 슈도 코드로 Real-Data 를 통하여 검증하는 것을 쉽게 할 수 있다는 장점이 있다.

검증을 REPL 에서 바로바로 할 수 있는 Scala on Spark 와 비슷한 느낌이라고나 할까... 게다가 결과도 Spark 이상으로 빠르다. 사실 간단한 로직의 경우는 훨씬 더 빠르다. 물론 리얼타임 검색 엔진이니까..빠른게 당연하지만...

단점이 없는 것은 아니다. elasticSearch 엔진의 queryString 은 복잡한 비지니스 요건을 전부 처리하는데에는 한계가 있다. 즉, 요녀석도 그냥 NoSQL 처럼 에코시스템 중 One of Them 인것이다.
즉, elasticSearch 는 여러 에코시스템 중 elasticSearch 가 장점이 있는 부분에 요긴하게 쓸수 있으며, 그 부분이 다른 NoSQL 에 비하여 RealTime 활용 쪽에서는 상당히 넓은 부분을 커버 할 수 있으며, plugin등 자체 에코시스템도 상당히 갖추어져 있어 응용 확장성도 뛰어나다.. 정도로 요약 가능할 듯 하다. 게다가 kibana 라는 걸쭉한 시각화 도구 까지...

아래는 SQL 과 elasticSearch  의 queryString 을 비교 수행해본 결과이다.

1. SQL 쿼리
  • SELECT COUNT(*) FROM log GROUP BY browser ORDER BY COUNT(*) DESC
2. ElasticSearch 쿼리
  • ElasticSearch 의 쿼리는 아래와 같다.

{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "browser"
      }
    }
  }
}

결과는 아래처럼 나온다. 놀라운 것은 이것이 1초전 Insert 된 Real Time 이벤트까지 반영된 실시간 결과라는 점!!!!!!


3. 아래 처럼 쿼리를 좀 확장해서 쓸수도 있다. 정규표현식으로 필터를 그룹 주고, 그 결과로 그룹핑 된 PV  정도는 손쉽게 리얼타임 장표를 만들어 낼 수 있다.
(여기서의 리얼타임이란, 시간당 수백만 PV가 들어오는 트래픽에 대하여, 고객들이 들어오는 특정 페이지의 PV  를 1~2초 안의 최신성을 반영하여 시각화 가능하다 정도...사실 Scale Out 이 가능하므로, 트래픽이 큰 문제가 되지는 않는다.)

GET /test/data/_search?search_type=count{
  "aggs" :{
    "total_count" : {
      "global" : {}
    },
    "XX999" : {
      "filter" : {
        "regexp":{
            "product_code" : "[a-z]{2}[0-9]{3}"
        }
      } 
    },
    "X99999" : {
      "filter" : {
        "regexp":{
            "product_code" : "[a-z]{1}[0-9]{5}"
        }
      } 
    },
    "no_format" : {
        "missing" : {
            "field" : "product_code"   
        }
    }
  }
}

댓글 없음:

댓글 쓰기