node.js를 사용한 big data 사례연구

22
Node.Js 를 를를를 Big Data 를를를를 Big Data 를를를를 Node.js, 를 를를를

Upload: byungjoon-lee

Post on 07-Jan-2017

3.958 views

Category:

Software


4 download

TRANSCRIPT

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

Node.Js 를 사용한Big Data 사례연구Big Data 세계에서 Node.js, 그 경험담

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

2

CONTENT• Big Data

• Hive• Node.js

• Introduce• Callback Hell• node-java• node-thrift

• Summary

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

3

HIVE• Big Data 를 위한 데이터 플랫폼• Hive

• Hadoop 기반으로 동작하는 데이터 플랫폼• RDBMS 와 유사하게 질의를 통한 데이터 분석 지원

• Hive driver• Java

• JDBC, Thrift• Python

• Pyhs2 (-> pyhive), Thrift• Node.js

• ?

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

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 …

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

5

NODE.JS -2• Why?

• 언제나 쫓기는 일정• ASP .NET C# 개발자 입장에서 ,

• XML 기반 설정과 방대한 에코 시스템이 부담스러운 Java• Front-end 개발 할 때 누구나 한 번 다뤄보고 , 쉬운 문법을 가진 JavaScript• Java < JavaScript

• node-java 를 통해 Java Lib. 접근 가능

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

6

NODE.JS - 3• npmjs.org

• 가장 방대한 패키지 매니저• 언제부터 ? 2014 년 중반 부터

• http://www.modulecounts.com/• 원하는 것이 다 있는 그 곳

• Express.js• Sequelize.js• Passport.js• Socket.io

• 특히 Socket.io 가 가지는 매력은 ?

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

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’ }); }); }); }); });});

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

8

NODE.JS + CALLBACK HELL - 2• ECMA6

• Node.js 4.x.x 부터 우측 코드 지원• co-routine, genera-

tor 조합• 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});

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

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 이라는음해는 이제 그만

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

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

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

11

NODE-JAVA + HIVE JDBC• Good

• 잘 알려진 , 오랫동안 사용되어서 검증이 완료된 JDBC 인터페이스• Hive 가 업데이트 될 때 Hive JDBC 도 업데이트 되어 관리 이슈가 없다

• Bad• node-java 완성도에 영향을 받는다

• 오래전에는 promise 도 지원되지 않아 blocking-call 이 일어났고 , …• JVM 이슈

• Java 와 JVM 은 뗄래야 뗄수 없는 관계• node-gyp

• 컴파일 문제 발생 – github.com 에 접근할 수 없는 경우에는 ?

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

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 는 없다

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

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)

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

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 은 ?

• 자유로 인해서 얻는 이익 < 추가 코딩량

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

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 이 꼭 있어야 한다

• 내가 수작업으로 포함하고 있지만 사용자가 원하는 것이 없으면 ?

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

16

THRIFT, TIP• 직접하는 것이 더 좋을 수도 있다

• JSHS2 는 아직 완성도가 조금 부족한 것이 현실• 신경써야 할 것

• node-thrift 를 사용하면 node-int64 를 사용하고 , 이것을 지수표기법이 되면서 데이터가 누락되지 않도록 충분히 신경써야 한다• Nullable filed 를 충분히 고려해야 한다

• 0 != NULL

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

17

THRIFT & BUFFER - 1• 따끈따끈한 소식

• node-thrift 는 또 다른 문제가 있다• node-thrift 에 포함된 TBuffered-

Transport 를 코드를 보면 , 버퍼 사이즈가 고정되어 있다

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;};

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

18

THRIFT & BUFFER - 2• 하드코딩 되어 있는 부분을 변경해서 쓸 수 있다

• 이 경우 버퍼 사이즈가 변경되어 실제 통신 시간에 영향을 준다• 테스트 결과 ,

• Thrift 는 버전은 높을 수록 좋다• 버퍼 사이즈는 무작정 늘리지 말고 최적 값을 찾아야 한다

• Thrift 0.9.3 + 1M Buffer + Fetch Size 2048 이 내 경우에 최적 값

• 해당 기능은 곧 JSHS2 에 반영할 예정

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

19

NODE.JS & BIG DATA - 1• Galleon

• Node.js 기반 Hive 질의 시스템• 쿼리 실행 , 쿼리 프리셋 , 스케쥴러 등의 기능 지원

• 100 명 이상의 사용자가 매월 사용 중• 등록된 쿼리 프리셋 700 개 이상

• Node.js 로 Big Data 할 수 있다

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

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

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

21

SUMMARY• Node.js 에서 Hive 에 질의 할 수 있다

• node-java• node-thrift• jshs2

• node-thrift 를 쓸 때는 node-int64 와 Nullable field 에 신경쓰자• node-thrift 에서 버퍼 사이즈가 큰 것이 항상 좋은 것이 아니다

•Node.js 좋아요

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

22

Q & Ahttp://www.slideshare.net/ssuser735f04/nodejs-big-data-61442290