커스텀 플러그인 작성
커스텀 플러그인 작성 (Write Custom Plugins)
Pinot에서 커스텀 요구를 지원하는 새 플러그인을 쉽게 만들고 사용하는 방법을 다루는 문서예요. 개발자는 플러그인 유형별 표준 인터페이스 몇 개를 Java로 구현하면 돼요.
출처: 문서
본문
Pinot는 사용자가 커스텀 요구를 지원하는 새 플러그인을 쉽게 만들고 사용할 수 있게 해줘요. 개발자는 플러그인 유형별 표준 인터페이스 몇 개를 Java로 구현하면 돼요.
코드가 준비되면 완성된 JAR 파일을 pinot의 /plugins 디렉토리에 넣으면 돼요. plugins 디렉토리의 모든 클래스는 pinot 시작 시 로드돼요.
Apache Pinot 1.3.0부터는 새 구조에 대한 추가 지원이 있어요:
/plugins
/my-custom-plugin
/classes/... 또는 /my-custon-plugin-1.0.0.jar
/com-2.3.1.jar
/foo-1.2.1.jar
/bar-3.1.1.jar
/pinot-plugin.properties
이렇게 하면 클래스를 더 이상 셰이드할 필요가 없어요. Pinot가 이 클래스들의 격리와 적절한 순서 로딩을 보장하기 때문이에요. Pinot는 pinot-spi의 클래스만 노출해요. classes 디렉토리 또는 my-custon-plugin-1.0.0.jar에는 플러그인의 커스텀 컴파일 Java 코드가 들어 있어요. 유일한 차이는 classes가 항상 먼저 로드된다는 점이에요. JAR은 그 뒤 OS가 정한 순서로 추가돼요. 이 classes와 함께 런타임에 필요한 모든 의존성이 있지만, pinot-jar은 제외돼요. pinot-plugin.properties는 현재 이 새 구조를 인식하기 위한 플레이스홀더예요. 미래에는 이 파일이 플러그인의 메타데이터를 저장하는 데 사용될 거예요.
현재 다음 키가 지원돼요:
parent.realmId-- 부모 realm의 id를 지정. parentRealm은 클래스를 찾는 최종 클래스로더예요. 정의되지 않으면 부모 realm이 없어요.importFrom.[realmId]-- 플러그인이 다른 realm에서 가져오는 패키지의 쉼표 구분 목록. 클래스를 찾을 때 이 import가 먼저 검증돼요. 모든 플러그인이 사용하며 교체할 수 없는 것은:importFrom.pinot=org.apache.pinot.spi
Apache Maven 사용자는 pinot assembly descriptor를 사용해 이 새 구조를 생성할 수 있어요. pom.xml에 다음을 추가하면 돼요.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.7.1</version>
<dependencies>
<dependency>
<groupId>org.apache.pinot</groupId>
<artifactId>assembly-descriptor</artifactId>
<version>1.3.0</version> <!-- should match pinot version -->
</dependency>
</dependencies>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>pinot-plugin</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
대안으로, 플러그인을 단일 셰이드 jar 또는 uberjar에 패키징한 예전 구조를 사용할 수도 있어요:
/plugins
/my-custom-plugin
/my-custom-plugin-1.0.0-shaded.jar
이 구조를 사용하는 플러그인은 Pinot가 제공하는 모든 클래스를 사용할 수 있어요. 따라서 Pinot가 제공하지 않는 의존성(provided로 import하지 않는 것들)은 셰이드되어야 해요. 예전 구조를 사용하는 플러그인은 guava, jackson 같은 자주 사용하는 의존성을 Pinot와의 클래스 충돌을 막기 위해 플러그인별 접두사로 리로케이트(즉 원래 패키지 이름을 바꾸는 것)하는 것을 권장해요.