3. HIVE
• Big Data를 위한 데이터 플랫폼
• Hive
• Hadoop 기반으로 동작하는 데이터 플랫폼
• RDBMS와 유사하게 질의를 통한 데이터 분석 지원
• Hive driver
• Java
• JDBC, Thrift
• Python
• Pyhs2 (-> pyhive), Thrift
• Node.js
• ?
3
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. NODE.JS -2
• Why?
• 언제나 쫓기는 일정
• ASP .NET C# 개발자 입장에서,
• XML 기반 설정과 방대한 에코 시스템이 부담스러운 Java
• Front-end 개발 할 때 누구나 한 번 다뤄보고, 쉬운 문법을 가진 JavaScript
• Java < JavaScript
• node-java를 통해 Java Lib. 접근 가능
5
6. NODE.JS - 3
• npmjs.org
• 가장 방대한 패키지 매니저
• 언제부터? 2014년 중반 부터
• http://www.modulecounts.com/
• 원하는 것이 다 있는 그 곳
• Express.js
• Sequelize.js
• Passport.js
• Socket.io
• 특히 Socket.io가 가지는 매력은?
6
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. 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. 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. 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. NODE-JAVA + HIVE JDBC
• Good
• 잘 알려진, 오랫동안 사용되어서 검증이 완료된 JDBC 인터페이스
• Hive가 업데이트 될 때 Hive JDBC도 업데이트 되어 관리 이슈가 없다
• Bad
• node-java 완성도에 영향을 받는다
• 오래전에는 promise도 지원되지 않아 blocking-call이 일어났고, …
• JVM 이슈
• Java와 JVM은 뗄래야 뗄수 없는 관계
• node-gyp
• 컴파일 문제 발생 – github.com에 접근할 수 없는 경우에는?
11
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. 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. 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. 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. THRIFT, TIP
• 직접하는 것이 더 좋을 수도 있다
• JSHS2는 아직 완성도가 조금 부족한 것이 현실
• 신경써야 할 것
• node-thrift를 사용하면 node-int64를 사용하고, 이것을 지수표기법이 되면서 데이터가 누
락되지 않도록 충분히 신경써야 한다
• Nullable filed를 충분히 고려해야 한다
• 0 != NULL
16
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. THRIFT & BUFFER - 2
• 하드코딩 되어 있는 부분을 변경해서
쓸 수 있다
• 이 경우 버퍼 사이즈가 변경되어 실제
통신 시간에 영향을 준다
• 테스트 결과,
• Thrift는 버전은 높을 수록 좋다
• 버퍼 사이즈는 무작정 늘리지 말고 최
적 값을 찾아야 한다
• Thrift 0.9.3 + 1M Buffer + Fetch Size
2048이 내 경우에 최적 값
• 해당 기능은 곧 JSHS2에 반영할 예정
18
19. NODE.JS & BIG DATA - 1
• Galleon
• Node.js 기반 Hive 질의 시스템
• 쿼리 실행, 쿼리 프리셋, 스케쥴러 등의 기능 지원
• 100명 이상의 사용자가 매월 사용 중
• 등록된 쿼리 프리셋 700개 이상
• Node.js로 Big Data 할 수 있다
19
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. SUMMARY
• Node.js에서 Hive에 질의 할 수 있다
• node-java
• node-thrift
• jshs2
• node-thrift를 쓸 때는 node-int64와 Nullable field에 신경쓰자
• node-thrift에서 버퍼 사이즈가 큰 것이 항상 좋은 것이 아니다
• Node.js 좋아요
21