Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Node.js를 사용한 Big Data 사례연구

6,327 views

Published on

Node.js를 사용해서 Hive에 접근하고, 데이터를 가져오는 작업을 위해서 필요한 여러가지 정보와 Node.js 개발에 대한 이야기

Published in: Software
  • Login to see the comments

Node.js를 사용한 Big Data 사례연구

  1. 1. Node.Js를 사용한 Big Data 사례연구 Big Data 세계에서 Node.js, 그 경험담
  2. 2. CONTENT • Big Data • Hive • Node.js • Introduce • Callback Hell • node-java • node-thrift • Summary 2
  3. 3. HIVE • Big Data를 위한 데이터 플랫폼 • Hive • Hadoop 기반으로 동작하는 데이터 플랫폼 • RDBMS와 유사하게 질의를 통한 데이터 분석 지원 • Hive driver • Java • JDBC, Thrift • Python • Pyhs2 (-> pyhive), Thrift • Node.js • ? 3
  4. 4. NODE.JS - 1 • Event-Driven, Single-Thread • Javascript 엔진 V8을 이용하여 개발된 Back-end 플랫폼 • (동의하지 않는 분이 있지만) 높은 생산성과 쉬운 문법을 가진 언어 • 최근 MS에서 Chakra 기반 Node.js를 개발하기도 함 • Node Foundation에 의해서 개발, 운영 • LTS – 4.4.3 • Stable – 5.11.0 • ECMA6 • Generator, Promise, Arrows, Classes, Data Structure(Map, Set, WeakMap, WeakSet) etc … 4
  5. 5. NODE.JS -2 • Why? • 언제나 쫓기는 일정 • ASP .NET C# 개발자 입장에서, • XML 기반 설정과 방대한 에코 시스템이 부담스러운 Java • Front-end 개발 할 때 누구나 한 번 다뤄보고, 쉬운 문법을 가진 JavaScript • Java < JavaScript • node-java를 통해 Java Lib. 접근 가능 5
  6. 6. NODE.JS - 3 • npmjs.org • 가장 방대한 패키지 매니저 • 언제부터? 2014년 중반 부터 • http://www.modulecounts.com/ • 원하는 것이 다 있는 그 곳 • Express.js • Sequelize.js • Passport.js • Socket.io • 특히 Socket.io가 가지는 매력은? 6
  7. 7. NODE.JS + CALLBACK HELL - 1 • 항상 도마 위에 오르는 DB 접근 코드 BarrelFavorite.destroy({ where: { pk: no } }, function (err) { BarrelRelateTags.destroy({ where: { pk: no } }, function (err) { Param.destroy({ where: { pk: no } }, function (err) { BarrelSchedulerJob.destroy({ where: { pk: no } }, function (err) { Barrel.destroy({ where: { pk: no } }, function (err) { res.send({ ret: ‘ok’ }); }); }); }); }); }); 7
  8. 8. NODE.JS + CALLBACK HELL - 2 • ECMA6 • Node.js 4.x.x 부터 우측 코드 지원 • co-routine, generator 조합 • 0.12.x 에서도 가능 • --harmony 옵션 사용 • 0.10.x를 사용하지 않는 다면 우측 코드 사용가능 co(function* () { yield BarrelFavorite.destroy({ where: { pk: no } }); yield BarrelRelateTags.destroy({ where: { pk: no } }); yield Param.destroy({ where: { pk: no } }); yield BarrelSchedulerJob.destroy({ where: { pk: no } }); yield Barrel.destroy({ where: { pk: no } }); }).then(function () { res.send({ ret: ’ok’ }); }).catch(function (err) { // Exception catch block }); 8
  9. 9. NODE.JS + CALLBACK HELL - 3 • 항상 도마 위에 오르는 DB 접근 코드 BarrelFavorite.destroy({ where: { pk: no } }, function (err) { BarrelRelateTags.destory({ where: { pk: no } }, function (err) { Param.destroy({ where: { pk: no } }, function (err) { BarrelSchedulerJob.destroy({ where: { pk: no } }, function (err) { Barrel.destroy({ where: { pk: no } }, function (err) { res.send({ ret: ‘ok’ }); }); }); }); }); }); 이제 Callback – Hell 이라는 음해는 이제 그만 9
  10. 10. NODE-JAVA • Node.js -> C++ -> JAVA(via JNI) • Node.js에서 Java Lib.을 사용할 수 있는 환경을 구성해주는 패키지 • Hive JDBC • Hive에 접근하기 위한 방법 • Thrift-Client를 이용하여 JDBC 인터페이스 구현 • node-java에서 Hive JDBC통해 Hive 질의 • Npm • https://www.npmjs.com/package/java 10
  11. 11. NODE-JAVA + HIVE JDBC • Good • 잘 알려진, 오랫동안 사용되어서 검증이 완료된 JDBC 인터페이스 • Hive가 업데이트 될 때 Hive JDBC도 업데이트 되어 관리 이슈가 없다 • Bad • node-java 완성도에 영향을 받는다 • 오래전에는 promise도 지원되지 않아 blocking-call이 일어났고, … • JVM 이슈 • Java와 JVM은 뗄래야 뗄수 없는 관계 • node-gyp • 컴파일 문제 발생 – github.com에 접근할 수 없는 경우에는? 11
  12. 12. NODE-THRIFT • node-thrift • Hive JDBC를 디컴파일 하거나, https://github.com/apache/hive 에서 코드를 보면 Hive JDBC는 Thrift Client를 JDBC 인터페이스로 재구현 한 것 • node-thrift를 사용해서 Hive에 직접 접근하는 것이 가능 • Hive Server 2 Client • https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients • JDBC, Ruby, Python은 Client 가 따로 있는데 Node.js는 없다 12
  13. 13. THRIFT • Apache Thrift • Software framework, for scalable cross-language services development … • 다양한 언어를 결합하여 데이터 송수신이 가능하도록 만드는 프레임워크 • Support language • Actionscript 3.0, c_glib, C++, CSharp, D, Dart, Delphi, Go, Graphviz, Haxe Framework, Haskell, Java, Javascript, Node.js, OCaml, Perl, PHP, Python, Ruby • 그리고 저 들을 Server-Client 구조로 결합하는 것이 가능하다 • Java (Hive) -> Node.js (your solution) 13
  14. 14. THRIFT? • Good • 원하는 것을 할 수 있다 • 쿼리가 실행되는 동안 Hive Server 2 로그를 가져올 수 있다 • 쿼리가 실행되고 있는 동안 Hive Server에 쿼리 실행 상태를 질의할 수 있다 • 쿼리 취소가 된다 (쉽다) • 가볍다 • JVM 필요 없으니 • node-java 를 사용하지 않아서 컴파일 이슈를 조금 덜 수 있다 • 이 부분은 크게 도움 안된다, socket.io와 mysql driver는? • Bad • 0.9.3 node-thrift 기준, npm 설치를 마치면 30MB가 넘는다 (왜?) • 신경써야 할 것이 많다 • Javascript는 64bit Floating-point만 사용하는데, 64bit Signed Integer는? • Nullable Type은? • 자유로 인해서 얻는 이익 < 추가 코딩량 14
  15. 15. JSHS2 • https://www.npmjs.com/package/jshs2 • Node.js 기반 Hive Server2 Driver • 없으니 내가 만듬 • Good • Pyhs2를 최대한 따라하기 • 그래서 사용 방법이 매우 쉽다 • Connection.connect -> Cursor.execute -> Cursor.fetch -. Cursor.close -> Connection.close • 아직까지는 0.10.x 부터 사용가능 • 직업할 때 번거로운 작업을 대부분 처리 해준다 • Bad • No-SASL만 지원 • IDL이 꼭 있어야 한다 • 내가 수작업으로 포함하고 있지만 사용자가 원하는 것이 없으면? 15
  16. 16. THRIFT, TIP • 직접하는 것이 더 좋을 수도 있다 • JSHS2는 아직 완성도가 조금 부족한 것이 현실 • 신경써야 할 것 • node-thrift를 사용하면 node-int64를 사용하고, 이것을 지수표기법이 되면서 데이터가 누 락되지 않도록 충분히 신경써야 한다 • Nullable filed를 충분히 고려해야 한다 • 0 != NULL 16
  17. 17. THRIFT & BUFFER - 1 • 따끈따끈한 소식 • node-thrift는 또 다른 문제가 있다 • node-thrift에 포함된 TBufferedTransport를 코드를 보면, 버퍼 사이즈가 고정되어 있다 function TBufferedTransport(buffer, callback) { this.defaultReadBufferSize = 1024; this.writeBufferSize = 512; // Soft Limit this.inBuf = new Buffer(this.defaultReadBufferSize); this.readCursor = 0; this.writeCursor = 0; // for input buffer this.outBuffers = []; this.outCount = 0; this.onFlush = callback; }; 17
  18. 18. THRIFT & BUFFER - 2 • 하드코딩 되어 있는 부분을 변경해서 쓸 수 있다 • 이 경우 버퍼 사이즈가 변경되어 실제 통신 시간에 영향을 준다 • 테스트 결과, • Thrift는 버전은 높을 수록 좋다 • 버퍼 사이즈는 무작정 늘리지 말고 최 적 값을 찾아야 한다 • Thrift 0.9.3 + 1M Buffer + Fetch Size 2048이 내 경우에 최적 값 • 해당 기능은 곧 JSHS2에 반영할 예정 18
  19. 19. NODE.JS & BIG DATA - 1 • Galleon • Node.js 기반 Hive 질의 시스템 • 쿼리 실행, 쿼리 프리셋, 스케쥴러 등의 기능 지원 • 100명 이상의 사용자가 매월 사용 중 • 등록된 쿼리 프리셋 700개 이상 • Node.js로 Big Data 할 수 있다 19
  20. 20. NODE.JS & BIG DATA - 2 • Good • 개발 편의성, 배포 편의성 • 사용자 요구사항에 민첩하게 대응할 수 있다 • Back-end + Front-end가 하나의 언어로 처리되는 매력 • 써본 사람만이 알 수 있는 그 편리함 • npm.js에는 없는 것이 없다 • Web framework + DB ORM + oAuth2 + Socket.io etc … • Bad • CSV, Excel 추출은? • long – run 작업은 어떻게? • CSV는 Excel에 비해서 가볍지만 그래도 대용량이 되면 문제 • js-xlsx는 blocking lib. 만 제공하여 대용량이 되면 역시 문제 • Long-Run Query는? • 기도하세요, • 모니터링을 해서 timeout 시키지만 이 것이 서버에서 급격히 증가할 경우? • 애증의 관례, 그리운 그녀 thread 20
  21. 21. SUMMARY • Node.js에서 Hive에 질의 할 수 있다 • node-java • node-thrift • jshs2 • node-thrift를 쓸 때는 node-int64와 Nullable field에 신경쓰자 • node-thrift에서 버퍼 사이즈가 큰 것이 항상 좋은 것이 아니다 • Node.js 좋아요 21
  22. 22. Q & A http://www.slideshare.net/ssuser735f04/nodejs-big-data-61442290 22

×