Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

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

6 340 vues

Publié le

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

Publié dans : Logiciels
  • 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

×