아이스버그 JDBC 통합
아이스버그 JDBC 통합 (Iceberg JDBC Integration)
관계형 데이터베이스의 테이블을 이용해 아이스버그 테이블을 관리하는 JDBC 카탈로그에 대해 소개해드릴게요. JDBC 카탈로그는 관계형 DB에 아이스버그 테이블의 메타데이터를 저장하고 관리해요. 이 문서에서는 필요한 설정과 스파크·자바 API 예시를 함께 살펴볼게요.
출처: 문서
본문
JDBC 카탈로그 (JDBC Catalog)
아이스버그는 JDBC를 통해 관계형 데이터베이스의 테이블을 사용해서 아이스버그 테이블을 관리하는 것을 지원해요. JDBC가 연결하는 데이터베이스는 원자적 트랜잭션(atomic transaction)을 지원해야 해요. 그래야 JDBC 카탈로그 구현이 아이스버그 테이블 커밋의 원자성과 읽기의 직렬화 가능한 격리(serializable isolation)를 제대로 지원할 수 있어요.
설정 (Configurations)
데이터베이스와 데이터베이스 서비스 제공자마다 요구하는 설정이 다를 수 있기 때문에, JDBC 카탈로그는 다음을 통해 임의의 설정을 허용해요.
| 속성 | 기본값 | 설명 |
|---|---|---|
| uri | JDBC 연결 문자열 | |
| jdbc.<property_key> | JDBC 연결을 구성하는 임의의 키-값 쌍 |
예시 (Examples)
스파크 (Spark)
MySQL JDBC 연결을 사용하는 스파크 세션을 다음 설정으로 시작할 수 있어요.
spark-sql --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.11.0 \
--conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://my-bucket/my/key/prefix \
--conf spark.sql.catalog.my_catalog.type=jdbc \
--conf spark.sql.catalog.my_catalog.uri=jdbc:mysql://test.1234567890.us-west-2.rds.amazonaws.com:3306/default \
--conf spark.sql.catalog.my_catalog.jdbc.verifyServerCertificate=true \
--conf spark.sql.catalog.my_catalog.jdbc.useSSL=true \
--conf spark.sql.catalog.my_catalog.jdbc.user=admin \
--conf spark.sql.catalog.my_catalog.jdbc.password=pass
자바 API (Java API)
Class.forName("com.mysql.cj.jdbc.Driver"); // ensure JDBC driver is at runtime classpath
Map<String, String> properties = new HashMap<>();
properties.put(CatalogProperties.CATALOG_IMPL, JdbcCatalog.class.getName());
properties.put(CatalogProperties.URI, "jdbc:mysql://localhost:3306/test");
properties.put(JdbcCatalog.PROPERTY_PREFIX + "user", "admin");
properties.put(JdbcCatalog.PROPERTY_PREFIX + "password", "pass");
properties.put(CatalogProperties.WAREHOUSE_LOCATION, "s3://warehouse/path");
Configuration hadoopConf = new Configuration(); // configs if you use HadoopFileIO
JdbcCatalog catalog = CatalogUtil.buildIcebergCatalog("test_jdbc_catalog", properties, hadoopConf);