Export Metadata 도구
Export Metadata 도구 (Export Metadata Tool)
Druid의 클러스터 메타데이터와 딥 스토리지를 마이그레이션할 때 도움을 주는 export-metadata 도구를 설명하는 문서예요. 도구 옵션, S3·HDFS·새 로컬 경로로의 딥 스토리지 마이그레이션, 그리고 가져오기 명령을 다루어요.
출처: 문서
본문
Druid에는 클러스터 메타데이터와 딥 스토리지 마이그레이션을 돕는 export-metadata 도구가 포함되어 있어요.
이 도구는 다음 Druid 메타데이터 테이블의 내용을 내보내요.
- segments
- rules
- config
- datasource
- supervisors
또한 이 도구는 segments 테이블의 행에 있는 로컬 딥 스토리지 위치 설명(descriptor)을 새 딥 스토리지 위치(S3, HDFS, 로컬 재작성 경로를 지원)를 가리키도록 재작성할 수 있어요.
이 도구에는 다음 한계가 있어요.
- 현재 Derby 메타데이터에서만 내보내기를 지원해요.
- 딥 스토리지 마이그레이션을 위해 로드 스펙을 재작성할 때, 현재 로컬 딥 스토리지에서만 마이그레이션을 지원해요.
export-metadata 옵션 (export-metadata Options)
export-metadata 도구는 다음 옵션을 제공해요.
연결 속성 (Connection Properties)
--connectURI: Derby 데이터베이스의 URI. 예:jdbc:derby://localhost:1527/var/druid/metadata.db;create=true--user: 사용자 이름--password: 비밀번호--base: 설정의druid.metadata.storage.tables.base값에 대응하며, 기본값은druid예요.
출력 경로 (Output Path)
--output-path,-o: 도구의 출력 디렉터리예요. Druid segments, rules, config, datasource, supervisors 테이블의 CSV 파일이 이 디렉터리에 작성돼요.
내보내기 형식 옵션 (Export Format Options)
--use-hex-blobs,-x: 설정하면 BLOB payload 컬럼을 16진수 문자열로 내보내요. Derby로 다시 가져오려면 이 옵션을 설정해야 해요. 기본값은 false예요.--booleans-as-strings,-t: 설정하면 boolean 값을 "1"과 "0" 대신 "true" 또는 "false"로 작성해요. Derby로 다시 가져오려면 이 옵션을 설정해야 해요. 기본값은 false예요.
딥 스토리지 마이그레이션 (Deep Storage Migration)
S3 딥 스토리지로 마이그레이션 (Migration to S3 Deep Storage)
아래 옵션을 설정하면 도구가 세그먼트 로드 스펙을 새 S3 딥 스토리지 위치를 가리키도록 재작성해요. 이는 로컬 딥 스토리지에 저장된 세그먼트를 S3로 마이그레이션하려는 사용자에게 도움이 돼요.
--s3bucket,-b: 마이그레이션된 세그먼트를 담을 S3 버킷--s3baseKey,-k: 마이그레이션된 세그먼트가 저장될 기본 S3 키
로컬 딥 스토리지 세그먼트를 S3로 복사할 때, 이 도구가 수행하는 재작성은 세그먼트의 디렉터리 구조가 변경되지 않아야 한다고 요구해요.
예를 들어 클러스터에 다음 로컬 딥 스토리지 설정이 있었다고 해 보아요.
druid.storage.type=local
druid.storage.storageDirectory=/druid/segments
대상 S3 버킷이 migration이고 기본 키가 example이라면, s3://migration/example/의 내용은 기존 로컬 파일 시스템의 /druid/segments와 동일해야 해요.
HDFS 딥 스토리지로 마이그레이션 (Migration to HDFS Deep Storage)
아래 옵션을 설정하면 도구가 세그먼트 로드 스펙을 새 HDFS 딥 스토리지 위치를 가리키도록 재작성해요. 이는 로컬 딥 스토리지에 저장된 세그먼트를 HDFS로 마이그레이션하려는 사용자에게 도움이 돼요.
--hadoopStorageDirectory, -h: 마이그레이션된 세그먼트를 담을 HDFS 경로
로컬 딥 스토리지 세그먼트를 HDFS로 복사할 때, 이 도구가 수행하는 재작성은 콜론(:)을 포함한 디렉터리 이름을 제외하고 세그먼트의 디렉터리 구조가 변경되지 않아야 한다고 요구해요.
예를 들어 클러스터에 다음 로컬 딥 스토리지 설정이 있었다고 해 보아요.
druid.storage.type=local
druid.storage.storageDirectory=/druid/segments
대상 hadoopStorageDirectory가 /migration/example이라면, hdfs:///migration/example/의 내용은 기존 로컬 파일 시스템의 /druid/segments와 동일해야 해요.
추가로, 로컬 딥 스토리지의 세그먼트 경로는 이름에 콜론(:)을 포함해요. 예:
wikipedia/2016-06-27T02:00:00.000Z_2016-06-27T03:00:00.000Z/2019-05-03T21:57:15.950Z/1/index.zip
HDFS는 콜론을 포함한 파일을 저장할 수 없으며, 이 도구는 HDFS에서 콜론이 밑줄(_)로 대체될 것으로 기대해요.
이 예시에서 로컬 딥 스토리지의 /druid/segments 아래에 있는 위 wikipedia 세그먼트는 다음과 같은 경로로 hdfs:///migration/example/ 아래의 HDFS로 마이그레이션되어야 해요.
wikipedia/2016-06-27T02_00_00.000Z_2016-06-27T03_00_00.000Z/2019-05-03T21_57_15.950Z/1/index.zip
새 로컬 딥 스토리지 경로로 마이그레이션 (Migration to New Local Deep Storage Path)
아래 옵션을 설정하면 도구가 세그먼트 로드 스펙을 새 로컬 딥 스토리지 위치를 가리키도록 재작성해요. 이는 로컬 딥 스토리지에 저장된 세그먼트를 새 경로(예: 새 NFS 마운트)로 마이그레이션하려는 사용자에게 도움이 돼요.
--newLocalPath, -n: 마이그레이션된 세그먼트를 담을 로컬 파일 시스템의 새 경로
로컬 딥 스토리지 세그먼트를 새 경로로 복사할 때, 이 도구가 수행하는 재작성은 세그먼트의 디렉터리 구조가 변경되지 않아야 한다고 요구해요.
예를 들어 클러스터에 다음 로컬 딥 스토리지 설정이 있었다고 해 보아요.
druid.storage.type=local
druid.storage.storageDirectory=/druid/segments
새 경로가 /migration/example이라면, /migration/example/의 내용은 로컬 파일 시스템의 /druid/segments와 동일해야 해요.
도구 실행 (Running the tool)
도구를 사용하려면 Druid 패키지 루트에서 다음 명령을 실행할 수 있어요.
cd ${DRUID_ROOT}
mkdir -p /tmp/csv
java -classpath "lib/*" -Dlog4j.configurationFile=conf/druid/cluster/_common/log4j2.xml -Ddruid.extensions.directory="extensions" -Ddruid.extensions.loadList=[] org.apache.druid.cli.Main tools export-metadata --connectURI "jdbc:derby://localhost:1527/var/druid/metadata.db;" -o /tmp/csv
위 예시 명령에서:
lib는 Druid lib 디렉터리예요.extensions는 Druid extensions 디렉터리예요./tmp/csv는 출력 디렉터리예요. 이 디렉터리가 존재하는지 확인하세요.
메타데이터 가져오기 (Importing Metadata)
도구를 실행하면 출력 디렉터리에 <table-name>_raw.csv와 <table-name>.csv 파일이 생성돼요.
<table-name>_raw.csv 파일은 도구가 사용하는 중간 파일로, Derby가 내보낸 테이블 데이터를 수정 없이 담고 있어요.
<table-name>.csv 파일은 MySQL이나 PostgreSQL 같은 다른 데이터베이스로 가져오는 데 사용되며, 구성된 딥 스토리지 위치 재작성이 적용된 것이에요.
Derby, MySQL, PostgreSQL에 대한 가져오기 명령 예시는 아래와 같아요. 이 예시 가져오기 명령은 /tmp/csv와 그 내용이 서버에서 접근 가능하다고 가정해요. 클라이언트 파일 시스템에서 가져오는 등 다른 옵션은 데이터베이스 문서를 참고하세요.
Derby
CALL SYSCS_UTIL.SYSCS_IMPORT_TABLE (null,'DRUID_SEGMENTS','/tmp/csv/druid_segments.csv',',','"',null,0);
CALL SYSCS_UTIL.SYSCS_IMPORT_TABLE (null,'DRUID_RULES','/tmp/csv/druid_rules.csv',',','"',null,0);
CALL SYSCS_UTIL.SYSCS_IMPORT_TABLE (null,'DRUID_CONFIG','/tmp/csv/druid_config.csv',',','"',null,0);
CALL SYSCS_UTIL.SYSCS_IMPORT_TABLE (null,'DRUID_DATASOURCE','/tmp/csv/druid_dataSource.csv',',','"',null,0);
CALL SYSCS_UTIL.SYSCS_IMPORT_TABLE (null,'DRUID_SUPERVISORS','/tmp/csv/druid_supervisors.csv',',','"',null,0);
MySQL
LOAD DATA INFILE '/tmp/csv/druid_segments.csv' INTO TABLE druid_segments FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' (id,dataSource,created_date,start,end,partitioned,version,used,payload); SHOW WARNINGS;
LOAD DATA INFILE '/tmp/csv/druid_rules.csv' INTO TABLE druid_rules FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' (id,dataSource,version,payload); SHOW WARNINGS;
LOAD DATA INFILE '/tmp/csv/druid_config.csv' INTO TABLE druid_config FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' (name,payload); SHOW WARNINGS;
LOAD DATA INFILE '/tmp/csv/druid_dataSource.csv' INTO TABLE druid_dataSource FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' (dataSource,created_date,commit_metadata_payload,commit_metadata_sha1); SHOW WARNINGS;
LOAD DATA INFILE '/tmp/csv/druid_supervisors.csv' INTO TABLE druid_supervisors FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' (id,spec_id,created_date,payload); SHOW WARNINGS;
PostgreSQL
COPY druid_segments(id,dataSource,created_date,start,"end",partitioned,version,used,payload) FROM '/tmp/csv/druid_segments.csv' DELIMITER ',' CSV;
COPY druid_rules(id,dataSource,version,payload) FROM '/tmp/csv/druid_rules.csv' DELIMITER ',' CSV;
COPY druid_config(name,payload) FROM '/tmp/csv/druid_config.csv' DELIMITER ',' CSV;
COPY druid_dataSource(dataSource,created_date,commit_metadata_payload,commit_metadata_sha1) FROM '/tmp/csv/druid_dataSource.csv' DELIMITER ',' CSV;
COPY druid_supervisors(id,spec_id,created_date,payload) FROM '/tmp/csv/druid_supervisors.csv' DELIMITER ',' CSV;
더 알아보기 (Learn more)
- 딥 스토리지 마이그레이션 문서에서 마이그레이션 전체 흐름을 살펴보세요.
- 메타데이터 마이그레이션 문서에서 Derby에서 MySQL·PostgreSQL로 옮기는 방법을 확인해 보아요.