HBase에서 Cloud Bigtable로 이전

이 자료는 Apache HBase 클러스터에서 Google Cloud(Google Cloud)의 Cloud Bigtable 클러스터로 데이터를 마이그레이션하기 위한 고려 사항과 프로세스를 설명합니다.

이 이전을 시작하기 전에 성능 영향, Bigtable 스키마 디자인, 인증 및 승인에 대한 접근 방식의 영향, Bigtable 특성 세트를 고려해야 합니다.

성능 영향

일반적인 워크로드에서 Bigtable은 매우 예측 가능한 성능을 제공합니다. 자세한 내용은 Bigtable 성능 이해를 확인하세요.

Bigtable 스키마 디자인

Bigtable 스키마를 디자인하는 것은 관계형 데이터베이스의 스키마를 디자인하는 것과는 다릅니다. 스키마를 디자인하기 전에 스키마 디자인에 나와 있는 개념을 검토하세요.

스키마를 권장되는 크기 한도 미만으로 유지해야 합니다. 단일 행을 100MB 미만으로, 단일 값을 10MB 미만으로 유지하는 것이 좋습니다. 큰 값을 저장해야 하는 시나리오가 있을 수 있습니다. 큰 값을 추출하려면 메모리뿐만 아니라 시간도 필요하기 때문에 큰 값을 저장하면 성능에 영향을 줄 수 있습니다. 이러한 시나리오를 개별적으로 평가하세요.

인증 및 승인

Bigtable에 대한 액세스 제어를 설계하기 전에 기존 HBase 인증 및 승인 프로세스를 검토해야 합니다.

Bigtable은 Google Cloud의 표준 인증 메커니즘과 Identity and Access Management를 사용하여 액세스 제어를 제공하므로 HBase의 기존 승인을 IAM으로 전환해야 합니다. 사용자는 HBase에 액세스 제어 메커니즘을 제공하는 기존 Hadoop 그룹을 다른 서비스 계정으로 매핑할 수 있습니다.

Bigtable을 사용하면 프로젝트, 인스턴스, 테이블 수준에서 액세스를 제어할 수 있습니다. 자세한 내용은 액세스 제어를 참조하세요.

HBase에서 Bigtable로 마이그레이션

HBase에서 Bigtable로 데이터를 이전하려면 데이터를 일련의 Hadoop 시퀀스 파일로 내보내야 합니다. 이는 HBase에서 사용하는 파일 형식이며 바이너리 키-값 쌍으로 구성되어 있습니다.

HBase 테이블을 Bigtable로 이전하려면 다음 단계를 따르세요.

  1. HBase에서 세부정보를 수집합니다.
  2. HBase 테이블을 시퀀스 파일로 내보냅니다.
  3. 시퀀스 파일을 Cloud Storage로 이동합니다.
  4. Dataflow를 사용하여 시퀀스 파일을 Bigtable로 가져옵니다.
  5. 이동을 확인합니다.

이전 계획: HBase에서 세부정보 수집

이전을 준비하려면 기존 HBase 클러스터에서 대상 테이블을 빌드하는 데 필요한 다음과 같은 데이터를 수집하세요.

  • 테이블 목록
  • 행 수
  • 셀 수
  • 열 그룹 세부사항(수명, 최대 버전 수 포함)

소스 테이블에서 이러한 세부정보를 수집하는 간단한 방법은 HDFS에 결과를 남기는 다음과 같은 스크립트를 사용하는 것입니다.

#!/usr/bin/env bash
# Table Name is the Source HBase Table Name
TABLENAME="$1"
# Export Directory will be located on HDFS
EXPORTDIR="$2"
hadoop fs -mkdir -p ${EXPORTDIR}
hbase shell << EOQ
describe ${TABLENAME}
EOQ | hadoop fs -put - ${EXPORTDIR}/${TABLENAME}-schema.json
hbase shell << EOQ
get_splits ${TABLENAME}
EOQ | hadoop fs -put - ${EXPORTDIR}/${TABLENAME}-splits.txt

HBase 테이블을 Cloud Storage로 내보내기

이전할 HBase 테이블의 기본사항을 알고 있을 경우 테이블을 시퀀스 파일로 내보낸 다음 Cloud Storage로 이동해야 합니다. 온라인 데이터 이전 작업을 수행하기 전에 다음과 같은 단계를 실행하여 클러스터가 Google Cloud에 액세스하기 위한 기본 요건을 충족하는지 확인하세요.

  • Cloud Storage 커넥터 설치

    distcp를 사용하여 온라인 데이터를 이전하려면 Cloud Storage 커넥터를 설치하고 구성해야 합니다. 우선 이전하려는 데이터를 관리하는 HDFS 파일 시스템을 확인하세요. 그런 다음 Hadoop 클러스터에서 이 파일 시스템에 액세스할 수 있는 클라이언트 노드를 결정하세요. 마지막으로 클라이언트 노드에 커넥터를 설치하세요. 자세한 설치 단계는 Cloud Storage 커넥터 설치를 참조하세요.

  • Cloud SDK 설치

    distcp 또는 gsutil을 사용하여 데이터를 이전하려면 이전이 시작되는 Hadoop 클러스터 클라이언트 노드에 Cloud SDK를 설치하세요. 자세한 설치 단계는 Cloud SDK 문서를 참조하세요.

HBase 테이블을 HDFS로 내보내기

그런 다음, 이전하려는 HBase 테이블을 Hadoop 클러스터의 임의 위치로 내보냅니다. HBase 테이블 이름이 [MY_NEW_TABLE]이라고 가정합니다. 대상 디렉터리는 HDFS의 사용자 디렉터리 아래에 있습니다. 다음 명령어를 사용하여 HBase 테이블을 시퀀스 파일로 내보내세요.

TABLENAME="my-new-table"
EXPORTDIR=/usr/[USERNAME]/hbase-${TABLENAME}-export
hadoop fs -mkdir -p ${EXPORTDIR}
MAXVERSIONS=2147483647
bin/hbase org.apache.hadoop.hbase.mapreduce.Export \
    -Dmapred.output.compress=true \
    -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
    -Dhbase.client.scanner.caching=100 \
    -Dmapred.map.tasks.speculative.execution=false \
    -Dmapred.reduce.tasks.speculative.execution=false \
    ${TABLENAME} ${EXPORTDIR} ${MAXVERSIONS}

HDFS에서 Cloud Storage로 시퀀스 파일 이전

다음 단계는 시퀀스 파일을 Cloud Storage 버킷으로 이동하는 것입니다. 데이터의 크기, 파일 수, 데이터 소스, 사용 가능한 대역폭에 따라 Transfer Appliance, distcp, gsutil, Storage Transfer Service 등 Cloud Storage로 시퀀스 파일을 이동하는 적절한 옵션을 선택할 수 있습니다.

Transfer Appliance 사용

Transfer Appliance를 사용하여 데이터를 이전할 수 있는 경우는 다음과 같습니다.

  • 일정을 기준으로 발신 대역폭을 제어하려는 경우
  • 데이터 크기가 20TB를 초과할 경우

이 옵션을 사용하면 Google에서 추가 네트워크를 구매하거나 프로비저닝할 필요가 없습니다. 엔드 투 엔드 전송 시간(어플라이언스 배송 시간, 복원 등)은 평균 100Mbps입니다.

Transfer Appliance를 사용하여 데이터를 이동하려면 시퀀스 파일을 Transfer Appliance에 복사한 다음 어플라이언스를 다시 Google로 보내세요. Google은 Google Cloud에 데이터를 로드합니다. 자세한 내용은 Transfer Appliance 문서를 참조하세요.

distcp 사용

distcp을 사용하여 데이터를 이전할 수 있는 경우는 다음과 같습니다.

  • 이전을 위해 100Mbps 이상의 대역폭을 사용할 수 있는 경우
  • Cloud Storage 커넥터와 Cloud SDK를 원본 Hadoop 환경에 설치할 수 있는 경우
  • 데이터 이전을 수행하기 위해 새 Hadoop 작업을 관리할 수 있는 경우
  • 데이터 크기가 20TB 미만인 경우

distcp를 사용하여 데이터를 이동하려면 Cloud Storage 커넥터로 구성된 Hadoop 클러스터 클라이언트 노드를 사용하여 맵리듀스 작업을 제출하고 시퀀스 파일을 Cloud Storage에 복사하세요.

hadoop distcp hdfs://[NAMENODE]:[NAMENODE_PORT]/[SOURCE_DIRECTORY] \
gs://[BUCKET]/DESTINATION_DIRECTORY]

gsutil 사용

gsutil을 사용하여 데이터를 이전할 수 있는 경우는 다음과 같습니다.

  • 마이그레이션에 100Mbps를 초과하는 대역폭을 사용할 수 있는 경우
  • Cloud SDK를 원본 Hadoop 환경에 설치할 수 있는 경우
  • 데이터 이전을 수행하기 위해 새 Hadoop 작업을 관리할 수 없는 경우
  • 데이터 크기가 10TB 미만인 경우

gsutil을 사용하여 데이터를 이동하려면 Hadoop 클러스터 클라이언트 노드를 사용하여 데이터 이전을 시작하세요.

TABLENAME="my-new-table"
EXPORTDIR=/usr/[USERNAME]/hbase-${TABLENAME}-export
gsutil -m cp -r  ${EXPORTDIR} gs://[BUCKET]

Storage Transfer Service 사용

저장소 전송 서비스를 사용하여 데이터를 이전할 수 있는 경우는 다음과 같습니다.

  • 데이터 소스가 Amazon S3 버킷, HTTP/HTTPS 위치, Cloud Storage 버킷인 경우
  • 데이터 크기가 10TB 미만인 경우

저장소 전송 서비스에는 데이터 소스와 데이터 싱크 간의 데이터 전송과 동기화를 간편하게 하는 옵션이 있습니다. 예를 들어 다음과 같은 작업을 수행할 수 있습니다.

  • 일회성 전송 작업이나 반복적인 전송 작업 일정을 예약합니다.
  • 소스에 해당 객체가 없을 경우 대상 버킷의 기존 객체를 삭제합니다.
  • 소스 객체를 전송한 다음 삭제합니다.
  • 파일 생성 날짜, 파일 이름 필터, 데이터 가져오기 작업에 선호하는 시간대를 기준으로 고급 필터를 사용하여 데이터 소스와 데이터 싱크 간에 정기적인 동기화 일정을 예약합니다.

자세한 내용은 저장소 전송 서비스 문서를 참조하세요.

대상 테이블 만들기

다음 단계는 Bigtable에서 대상 테이블을 만드는 것입니다.

먼저 gcloud 명령줄 도구를 사용하여 Bigtable 클라이언트 도구 cbt를 설치합니다.

gcloud components update
gcloud components install cbt

그런 다음 이전에 수행한 검색의 해당 column family를 사용하여 Bigtable에 테이블을 만듭니다.

기존 분할을 사용하여 대상 테이블을 만들 때 미리 분할합니다. 이렇게 하면 일괄 로드 성능이 개선됩니다.

예를 들어 기존 분할이 다음과 같다고 가정해 보겠습니다.

'15861', '29374', '38173', '180922', '203294', '335846', '641111', '746477', '807307', '871053', '931689', '1729462', '1952670', '4356485', '4943705', '5968738', '6917370', '8993145', '10624362', '11309714', '12056747', '12772074', '14370672', '16583264', '18835454', '21194008', '22021148', '23702800', '25532516', '55555555'

그런 다음 다음과 같이 사용자 계정의 cbt 도구에 대해 기본 프로젝트와 Bigtable 인스턴스를 설정합니다.

$ cat > ${HOME}/.cbtrc << EOF
project = [YOUR-GCP-PROJECT]
instance = [BIGTABLE-INSTANCE-NAME]
EOF

대상 테이블에 다음 분할을 만듭니다.

cbt -instance my-instance createtable my-new-table \
splits=15861,29374,38173,180922,203294,335846,641111,746477,807307,871053,931689,\
1729462,1952670,4356485,4943705,5968738,6917370,8993145,10624362,11309714,\
12056747,12772074,14370672,16583264,18835454,21194008,22021148,23702800,\
5532516,55555555

이전 단계에서 발견한 column family와 일치하도록 대상 테이블의 column family를 작성합니다. 예를 들어 cf1cf2의 두 가지 column family가 있을 경우 다음과 같이 column family cf1를 작성합니다.

cbt createfamily my-new-table cf1

다음과 같이 cf2 column family를 작성합니다.

cbt createfamily my-new-table cf2

column family를 작성한 다음 해당 column family의 값에 대한 최대 수명 및 최대 버전 수를 포함하여 각 column family의 가비지 컬렉션 정책을 업데이트해야 합니다. Bigtable의 기본 도구가 HBase와 다른 기본 설정을 사용하므로 HBase 테이블에 HBase의 기본 설정을 사용하는 경우에도 이 작업을 수행해야 합니다.

cbt setgcpolicy [TABLE] [FAMILY] ( maxage=[D]| maxversions=[N] )

Dataflow를 사용하여 HBase 데이터를 Bigtable로 가져오기

Bigtable로 데이터를 가져오는 방법에 대한 자세한 내용은 Bigtable 문서의 데이터 가져오기 및 내보내기를 참조하세요.

다음과 같은 팁에 유의하세요.

  • 데이터 로드 성능을 개선하려면 maxNumWorkers를 설정하세요. 이 값은 합리적인 시간 내에 가져오기 작업을 완료하는 데 충분하지만 Bigtable 클러스터에 부담을 주지 않는 만큼의 컴퓨팅 성능을 제공합니다.

  • 가져오기 작업 중 Bigtable 클러스터의 CPU 사용량을 모니터링해야 합니다. 이 주제에 대한 자세한 내용은 Bigtable 모니터링 문서의 CPU 사용량 섹션을 참조하세요. Bigtable 클러스터의 CPU 사용률이 너무 높으면 노드를 추가해야 할 수 있습니다. 클러스터가 추가 노드의 성능 이점을 제공하는 데 최대 20분이 걸릴 수 있습니다.

Bigtable 인스턴스 모니터링에 대한 자세한 내용은 Bigtable 인스턴스 모니터링을 참조하세요.

Bigtable에서 가져온 데이터 확인

가져온 데이터를 검증하려면 두 가지 검사를 수행해야 합니다.

  • 행 수 일치 확인. Dataflow 작업은 전체 행 수를 보고합니다. 이 값은 원본 HBase 테이블 행 수와 일치해야 합니다.
  • 특정 행 쿼리로 무작위 확인. 원본 테이블에서 특정 행 키 집합을 선택한 다음, 이를 대상 테이블에서 쿼리하여 일치 여부를 확인할 수 있습니다.
cbt lookup [destination-table] [rowkey1]
cbt lookup [destination-table] [rowkey2]

다음 단계