Java admin client
Java admin client
JVM 코드에서 controller REST API를 호출하는 데 Pinot Java admin client를 사용해요.
Pinot Java admin client는 org.apache.pinot:pinot-java-client의 controller 지향 절반이에요. JVM 코드가 스키마와 테이블을 생성하거나 검증하고, 세그먼트를 검사하거나 리셋하고, tenant와 인스턴스를 관리하고, controller REST API를 통해 Minion 작업 상태를 검사해야 할 때 사용하세요.
출처: 문서
본문
Java 쿼리 클라이언트와 달리 admin client는 broker와 통신하지 않아요. 엔트리 포인트는 org.apache.pinot.client.admin.PinotAdminClient이며 localhost:9000 같은 controller 주소로 생성돼요.
설치
admin client는 Java 쿼리 클라이언트와 같은 아티팩트에 들어 있어요.
<dependency>
<groupId>org.apache.pinot</groupId>
<artifactId>pinot-java-client</artifactId>
<version>1.4.0</version>
</dependency>
implementation "org.apache.pinot:pinot-java-client:1.4.0"
기본 사용
controller에 대해 admin client를 생성한 다음 필요한 controller 표면에 대한 service client를 가져오세요.
import org.apache.pinot.client.admin.PinotAdminClient;
try (PinotAdminClient adminClient = new PinotAdminClient("localhost:9000")) {
var tables = adminClient.getTableClient().listTables(null, null, null);
var schemas = adminClient.getSchemaClient().listSchemaNames();
var instances = adminClient.getInstanceClient().listInstances();
var tenants = adminClient.getTenantClient().listTenants();
var taskTypes = adminClient.getTaskClient().listTaskTypes();
}
사용 가능한 service client
PinotAdminClient는 주요 관리 표면에 대한 타입화된 controller 클라이언트를 지연 노출해요.
| Method | Scope |
|---|---|
getTableClient() |
테이블 CRUD, 테이블 상태, 리밸런스, 검증 및 관련 controller 작업 |
getSchemaClient() |
스키마 CRUD 및 검증 |
getInstanceClient() |
인스턴스 목록, 생성, 구성 업데이트, 활성화/비활성화 상태 |
getSegmentClient() |
세그먼트 목록, 메타데이터, CRC, 리셋, 삭제 작업 |
getSegmentApiClient() |
시간 범위 세그먼트 선택 및 직접 세그먼트 메타데이터 조회 같은 세그먼트 선택 API |
getTenantClient() |
tenant CRUD, 메타데이터, tenant 리밸런스 헬퍼 |
getTaskClient() |
작업 유형, 큐 상태, 작업 메타데이터, 작업 디버그, 작업 상태 검사 |
예시:
String schemaConfig =
"{\"schemaName\":\"mySchema\",\"dimensionFieldSpecs\":[{\"name\":\"id\",\"dataType\":\"INT\"}]}";
try (PinotAdminClient adminClient = new PinotAdminClient("localhost:9000")) {
String validation = adminClient.getSchemaClient().validateSchema(schemaConfig);
String createResult = adminClient.getSchemaClient().createSchema(schemaConfig);
}
인증
admin client는 PinotAdminAuthentication.AuthType를 통해 NONE, BASIC, BEARER, CUSTOM 인증 모드를 지원해요.
Basic auth:
import java.util.Map;
import java.util.Properties;
import org.apache.pinot.client.admin.PinotAdminAuthentication;
import org.apache.pinot.client.admin.PinotAdminClient;
Properties properties = new Properties();
properties.setProperty("pinot.admin.request.timeout.ms", "30000");
try (PinotAdminClient adminClient = new PinotAdminClient(
"localhost:9000",
properties,
PinotAdminAuthentication.AuthType.BASIC,
Map.of("username", "admin", "password", "password"))) {
String tableConfig = adminClient.getTableClient().getTableConfig("myTable");
}
Bearer auth:
try (PinotAdminClient adminClient = new PinotAdminClient(
"localhost:9000",
new Properties(),
PinotAdminAuthentication.AuthType.BEARER,
Map.of("token", "your-bearer-token"))) {
var liveInstances = adminClient.getInstanceClient().listLiveInstances();
}
CUSTOM의 경우 controller로 보낼 헤더 맵을 전달하세요.
전송 설정
admin 전송은 PinotAdminClient에 전달하는 Properties 객체에서 설정을 읽어요.
| Property | Default | Effect |
|---|---|---|
pinot.admin.request.timeout.ms |
60000 |
동기 호출과 async HTTP 클라이언트의 요청 및 읽기 타임아웃에 사용되는 요청 타임아웃 |
pinot.admin.scheme |
http |
Controller 스킴. TLS 활성화 controller에는 https로 설정 |
현재 전송 구현은 고정 10초 연결 타임아웃을 사용하고 pinot.admin.scheme=https일 때 JVM 기본 SSL 컨텍스트를 활성화해요.
비동기 작업 및 예외
admin 패키지에는 listTablesAsync, listSchemaNamesAsync, listInstancesAsync, listTenantsAsync, listTaskTypesAsync 및 세그먼트 관리 async 메서드 같은 많은 controller 작업의 비동기 변형이 포함돼요. 이들은 CompletableFuture를 반환하고 동기 메서드와 같은 전송 구성을 사용해요.
주요 예외 유형:
PinotAdminException— 일반 controller 또는 전송 실패PinotAdminAuthenticationException— 잘못된 인증 구성 또는 인증 실패PinotAdminNotFoundException— 요청한 controller 리소스가 존재하지 않을 때PinotAdminValidationException— Pinot가 제출된 구성이나 요청을 거부할 때
Segment API 헬퍼
PinotSegmentApiClient는 PinotSegmentAdminClient와 별개예요. 세그먼트 CRUD보다는 세그먼트 선택 워크플로우에 가까운 controller 엔드포인트(시간 범위 세그먼트 선택 포함)에 사용하세요.
try (PinotAdminClient adminClient = new PinotAdminClient("localhost:9000")) {
var selection = adminClient.getSegmentApiClient()
.selectSegments("myTable", "OFFLINE", 1709251200000L, 1709337600000L, false);
var metadata = adminClient.getSegmentApiClient()
.getSegmentMetadata("myTable_OFFLINE", "myTable_0");
}