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)