Node.js를 이용해서 Big Data 세계를 헤엄친 이야기
          나와 같은 실수를 반복하지 마세요
          SK Planet,Data Infrastructure
          ByungJoon Lee
        imjuni.github.io/playnode2015
          이 페이지는 Reveal.js를 사용해서 만들었습니다.위 주소를 접속하면 페이지를 바로 볼 수 있습니다다만, 이미지는 삭제 되었을 수도 있어요 ㅠ_ ㅠ (저작권 문제로 인해서)
        무슨 일을 하고 있어요?
          Big Data Visualization 시스템을 개발합니다
        Big Data란,
            Wikipedia:
            
              기존 데이터베이스 관리도구로 데이터를 수집, 저장, 관리, 분석할 수 있는 역량을 넘어서는
              대량의 정형 또는 비정형 데이터 집합 및 이러한 데이터로부터 가치를 추출하고 결과를 분석하는 기술을 의미한다
            
          약간 뜬구름 잡는 느낌, ..
            딱히 정해져 있지 않아요,
            대용량의 데이터를 다루고 저장하는 기술을 통칭하는 것 같습니다
            Hadoop, Hive, HBase, Impala, Presto, Sentry, Kafka, Zookeeper etc ...
          저희 팀에서는
            하루 25억 건 이상의 데이터(로그)가 들어오고
            6PB 정도의 데이터를 저장되어 있습니다
            일일 사용량은 11TB정도 입니다
          이런 대용량 데이터를 다루는 것을
            
Big Data라고
            하는 것 같습니다
          Big Data
            - 기존 데이터베이스 관리도구로 수집, 저장, 관리, 분석할 수 있는 규모를 넘어서는 데이터를 다루는 것
- 관련 제품:
                - Hadoop, Hive, HBase, Impala, Presto, Sentry, Kafka, Zookeeper etc ..
 
참 쉽죠?
          잘 받아서 잘 저장하고,
          이런 작업도 아주 중요하지만
          잘 보여 주는 것
          매우 중요합니다!
        Data Visualization 시스템이란,
          그래서 잘 보여주는
            R Studio, MSTR, Hue와 같은 도구를
            Data Visualization 도구라고 합니다
          제가 만든 Data Visualization 도구는
          최근 로그가
            아주 다양한 곳에서 유입되고,
            로그 양이 많아지면 Hadoop에 쌓는 경우가 많지요
          Hadoop에 쌓이면,
            Hive를 Hadoop에 붙이고,
            이와 같은 도구를 이용해서 즉시 데이터를 조회할 필요성이 생깁니다
          잘 쌓은 로그를 이용해서
            UV, PV
            쿼리 한 방에 뽑으면 얼마나 편할까요?
            ☆ Big Data에서!
          그래서
            이런 시스템이 필요합니다
            궁서체 입니다 ;)
          
              
                
근데 hue가
                비슷한 일을 하거든요
              
              
모양도 비슷하죠?
              
             
          잘 알려진 도구로는
            
Compliance 이슈를
            해결하기 어렵습니다
            망 분리, WEB & WAS & DB 3 tier 구성, 다운로드 제어, 계정 관련 제약, 접근 로그 보관 등다양한 조건이 있습니다
          Data Visualization
            - 잘 쌓인 데이터에서 보물과도 같은 정보를 찾아낼 수 있도록 도와주는 도구- EDA(Exploratory data analysis)라는 어휘도 있다
 
- 기존 시스템은 잘 만들었지만 국내에서는 법적 제약으로 인해 사용이 어렵다
참 쉽죠?
          그래서 Java를 사용하지 않고 구현하는 방법을 고민했습니다
        Node.js
          쉬운 문법, 다양한 npm 패키지 등 모든 것을 할 수 있을 것 같았습니다
          그렇게 우리는 시작했습니다
        - Express
              
- MySQL
              - 영구히 저장되는 정보
- 즐겨찾기, 자주 쓰는 쿼리 저장하기 등
 
- Redis
              - 세션 정보 저장하기
- 실시간 편집 쿼리 저장하기 등
 
그런데
          Hive에 어떻게 접속하고, 어떻게 자료를 가져오지?
        node-java
          Node.js로 개발을 시도한 이유
        Data Visualization을 위해서
            Data retrieval 과정이 필수적이고
            Data retrieval을 위해서
            저희는 Hive에 반드시 접근해야 합니다
          Hive에 접근하는 가장 쉬운 방법은 역시
            JDBC (for Hive)
          node-java를 사용하면
            JDBC를 사용할 수 있습니다
          참 철 없던 시절,
            별생각 없이 JDBC 함수를 실행했어요
          JDBC 함수가 실행되는 동안
            Express 서버가 멈춥니다
          node-java에서
            함수 실행은
            그냥 while 문으로 loop을
            실행하는 것과 같습니다
          (소근소근)
            impala가 초기 버전에서 invalidate metadata를 하다가 종종
            
hang이 걸려서 멈출 때가 있었어요
          node-java를 쓰다가
            java method에서 hang이 걸리면
            Node.js 전체가 hang이 걸립니다
          이 문제를 해결하려면
            Java 코드를 추가로 개발해서
            JDBC 함수를 호출 할 때 thread를 하나 만든 다음 그 thread에서 JDBC function call을 하고
            비동기 방식처럼 바로 결과를 돌려 주고,
            Node.js에서는 setInterval 등으로 java code를 지속적으로 호출하면서 thread status를 확인하고,
            실행이 완료되면 결과를 가져와야 합니다
            만약 실행 시간이 일정 시간 이상 걸리면 취소를 하고 timeout을 내는 코드도 추가해야 합니다, java로...
          node-java는 이 한 가지 이유만으로 사용하기 어렵습니다
          2015년, 11월 현재 node-java는 개선을 거듭하여
            
              Async, Sync Java Method Call 외
              Promise Java Method Call 기능이 추가되었으며 Generator + Promise를 이용하여
              테스트한 결과 비동기 호출이 가능해졌습니다
            
            이 점, 참고 부탁드려요!
          그런데,
            설상가상으로 사용자는 JDBC에 없는 요구사항을 요청합니다
          JDBC 함수가 실행되는 동안
            Hive 로그나 Impala 로그 등 실행되는 동안 상태를 확인하고 싶어합니다
          모든 것을 해결할 수 있는 방법이 있습니다
            node-java 군, 넌 해고다
          node-java
            - Node.js에서 java jar, class 파일을 실행할 수 있도록 해주는 package
- C++, JNI, JDK (for JVM) 사용
- 2015년 11월 기준 괜찮은 선택, 다만
                - 서버 빌드 여부 확인
- JDK & JVM 확인: jar 파일이 Java 8 으로 개발 되었는가? 등
- 사용할 때는 반드시Promise 를 이용하여 비동기로 실행
 
참 쉽죠?
          Thrift는 Hive에서 제공하는 또 다른 접근법입니다
          JDBC (for Hive)
            디컴파일을 하면 Thrift 프로토콜 스택으로 JDBC Interface를 구현했습니다
            그러므로 Thrift를 사용하는 것은 가장 근본적인 Hive 접근 방법입니다
          Thrift
            https://thrift.apache.org/
          Thrift는
            개발 환경, 언어와 독립된 프로토콜 명세입니다
            그래서 Thrift를 이용하면 다양한 언어로
            프로토콜 구현체를 생성할 수 있습니다
            
                Actionscript 3.0, c_glib, C++, CSharp, D, Dart, Delphi,
                Go, Graphviz, Haxe Framework, Haskell, Java,
            Javascript, Node.js,OCaml, Perl, PHP, Python, Ruby
          
Node.js와Javascript가
            있으니, 문제 없습니다
          Hive 서버에 포함된 Thrift idl을
            Thrift로 컴파일하면 Javascript 구현체를 만들 수 있습니다
            sh> brew install thrift
sh> thrift -r --gen js:node /apache-hive-1.1.0-src/service/if/TCLIService.thrift
          gen-nodejs가 뿅하고 생기고,
            gen-nodejs와 node-thrift를 이용해서 Hive에 접근한 뒤
            - 쿼리도 실행하고,
- 쿼리 캔슬도 하고,
- 로그도 가져올 수 있습니다
로그에 대해서 깨알 첨언을 하자면
            Apache Hive 1.0 아래 버전을 사용하면 getLog가 없습니다1.0 이후에 getLog가 추가 되었습니다
          만약 Hive 버전이 1.0 아래라면?
            CDH에서 배포하는 Hive를 사용하세요~
            gen-nodejs 아래, getLog가 있습니다
          Apache Hive 1.0 이상에서 getLog
            vs
            CDH Hive 0.13.0 이하에서 getLog
            getLog로 받은 buffer를 해석하는 방식이 조금 달라요,
          깨알 첨언 둘,
            NULL field를 처리하는 방법이 따로 있습니다
            
              되돌려 받은 buffer 내에, nulls 값이 있고 이 nulls 값은
              bit vector 형태로 null 값 인지 아닌지를 확인할 수 있는 값이 들어있습니다
            
코드로 표현하면,
            HS2Util.prototype.getIsNull = function getIsNull (buf, index) {
  var bufIdx = (index !== 0) ? Math.floor(index / 8) : 0;
  var pos = index % 8;
  return !!(buf[bufIdx] & this.BITMASK[pos]);
};
          이 모든 것이 귀찮다면,
            https://github.com/imjuni/jshs2
          JSHS2는
            이 귀찮은 작업을 모두 해두었지만,
            인증을 구현하지 않아서
            HIVE auth mechanism을 NOSASL로 설정해야 합니다
            kerberos, plain sasl 등과 같은 인증 수단을 말합니다
          node-thrift
            - Thrift 다른 언어, 플랫폼에서 공통적으로 사용할 수 있는 프로토콜
- getLog를 사용하기 위해서는 Hive 버전 확인
- NULL 필드를 다루기 위해서는 bit vector 사용
- 귀찮으면 JSHS2
                
와,.. 이제 Hive에 접속할 수 있게 되었어요
          와,.. 이제 Hive에 접속할 수 있게 되었어요
          이제, 개발할 수 있겠네요
          이제, 개발할 수 있겠네요
Connection less
            vs
            Persistent Connection
          Impala
            초기 Impala에 직접 접속할 때,
            Impala가 충분히 성장하지 않아 Persistent Connection 방식으로연결을 유지하면, Connection이 완전히 정리되지 않고 leak이 되는 문제가 있었다
          Compliance Issue
            
              
                개인정보보호법 때문에 사용자는 가상머신에서 접속하는데,보통 가상머신을 종료하지 않고 연결을 끊기만 하기 때문에 쿼리를 실행하고 결과를 보다가가상머신과 연결을 끊으면 서버에서는 Connection이 계속 남아서 leak이 된다
               
              
             
          Hue - Persistent Connection
            vs
            Galleon - Connection less
            제가 만든 것이 Galleon 입니다 ;)
          Connection less
            반드시 Full-Fetch 과정이 필요
          Full-Fetch!
            쿼리 결과를 모두 Browser에 저장해야 한다!
          내가 직접 Grid Display Engine을 만들어도 되지만,
          Grid
            이름
                  장점
                  단점
                SlickGrid.js
                  
                    
                  
                    
                Handsontable 0.10.5
                  
                    - 30~40 만 건까지는 합리적인 성능
- 여러 줄 출력 가능
- Excel 닮은 꼴
- 비교적 성가신 버그가 많다
- 버전이 올라서 고쳐질 확률이 없다
Handsontalbe latest- 5~10 만 건까지는 합리적인 성능
- 여러 줄 출력 가능
- Excel 닮은 꼴
- 많은 버그가 수정 됨
- 명색이 Big Data인데, 10만 건은 너무 작다
- 30 만건만 실행해도...
DataTable.js- 다양한 부가 기능 (search, paging 등)
Grid
            이름
                  장점
                  단점
                SlickGrid.js
                  
                    
                  
                    
                Handsontable 0.10.5
                  
                    - 30~40 만 건까지는 합리적인 성능
- 여러 줄 출력 가능
- Excel 닮은 꼴
- 비교적 성가신 버그가 많다
- 버전이 올라서 고쳐질 확률이 없다
Handsontalbe latest- 5~10 만 건까지는 합리적인 성능
- 여러 줄 출력 가능
- Excel 닮은 꼴
- 많은 버그가 수정 됨
- 명색이 Big Data인데, 10만 건은 너무 작다
- 30 만건만 실행해도...
DataTable.js- 다양한 부가 기능 (search, paging 등)
Socket.io
          Node.js Killer package
        고생스럽지만,
          순수 Node.js로
          Hive에 접속, 쿼리 실행 등의
          개발은 좋은 경험
        개인정보보호법
            파일이 파일시스템에 스치는 것 조차 불허
            모두 메모리에서 처리
          다량의 데이터가 Node.js에서 머무르고,
            다량의 loop을 수행하며 Excel XML을 생성하고,
            Node.js에 부적합
          전 체 요 약
          - Node.js도 Big Data Storage에 접근할 수 있다
              - 되도록 Thrift 추천
- 최근 Presto는 http protocol을 이용하니 node-java 사용하지 않고 개발 가능
 
- node-java는 나쁘지 않은 선택이지만 확인할 것이 많다
              
- Grid
              - 역시 Handsontable이 좋지만, 최신 버전은 다량의 데이터를 처리하기에는 무리가 있다
 
- Node.js와 Hive 사이에 Connection을 유지하기 위해서는 많은 노력이 필요
JSHS2 많이 써주시고, 많이 도와주세요
        OpenSource
          JSHS2 말고, Galleon 전체를
        JSHS2
          SASL-PLAIN 지원, kerberos 지원, LDAP 지원
          이 부분은 중요도가 조금 떨어진다고 판단하여, 추후 지원할 예정
         
    
1
          Node.js를 이용해서 Big Data 세계를 헤엄친 이야기
          나와 같은 실수를 반복하지 마세요
          SK Planet,Data Infrastructure
          ByungJoon Lee