JavaScript 프로그래밍 가이드

JavaScript 프로그래밍 가이드

이 페이지에서는 JavaScript를 사용해서 Apache Druid를 확장하는 방법을 설명해 드려요.

출처: 문서

본문

예시 (Examples)

JavaScript는 다양한 방식으로 Druid를 확장하는 데 사용할 수 있어요.

  • Aggregators
  • Extraction functions
  • Filters
  • Post-aggregators
  • Router strategy
  • Worker select strategy

JavaScript는 런타임에 동적으로 주입할 수 있어서, Druid 확장을 직접 작성하고 배포하지 않아도 새로운 기능을 빠르게 프로토타이핑하기에 편리합니다.

Druid는 Mozilla Rhino 엔진을 최적화 레벨 9로 사용해서 JavaScript를 컴파일하고 실행해요.

보안 (Security)

Druid는 JavaScript 함수를 샌드박스에서 실행하지 않기 때문에, 이 함수들은 머신에 대한 완전한 접근 권한을 갖게 됩니다. 즉 JavaScript 함수는 사용자가 druid 프로세스 안에서 임의의 코드를 실행할 수 있게 해요. 그래서 기본적으로 JavaScript는 비활성화돼 있고, dev/staging 환경이나 보안이 구성된 프로덕션 환경에서만 druid.javascript.enabled = true 설정으로 활성화할 수 있습니다.

전역 변수 (Global variables)

전역 변수 사용은 피하세요. Druid는 여러 스레드가 전역 스코프를 공유할 수 있어서, 전역 변수를 쓰면 예측할 수 없는 결과가 발생할 수 있어요.

성능 (Performance)

단순한 JavaScript 함수는 보통 네이티브 속도에 비해 약간의 성능 저하가 있고, 더 복잡한 함수는 성능 저하가 더 커질 수 있어요. Druid는 각 데이터 프로세스에서 쿼리당 JavaScript 함수를 한 번씩 컴파일합니다.

JavaScript 함수를 많이 사용할 때는 가비지 컬렉션에 특히 주의해야 해요. 특히 컴파일된 클래스 자체의 GC가 중요합니다. 사용하지 않는 클래스를 제때 수집할 수 있는 가비지 컬렉터 설정을 꼭 사용하세요(보통 JDK7보다 JDK8의 Metaspace에서 이 작업이 더 수월합니다).

JavaScript vs 네이티브 확장 (Native Extensions)

보안이 문제되지 않고, 성능이나 메모리 사용보다 개발 속도가 더 중요할 때는 JavaScript 사용을 권장해요. 반면 보안이 문제가 되거나 성능·메모리 사용이 최우선이라면 네이티브 Druid 확장을 개발하는 편이 낫습니다.

추가로, 네이티브 Druid 확장은 JavaScript 함수보다 더 유연해요. 스케치(sketches)처럼 커스텀 데이터 형식이 필요한 확장 종류는 반드시 네이티브 Druid 확장으로 작성해야 합니다.

더 알아보기 (Learn more)