벌크 로딩

벌크 로딩 (Bulk Loading)

대용량 데이터를 HBase에 효율적으로 적재하는 방법을 살펴볼게요. 벌크 로드는 MapReduce 작업으로 HBase 내부 저장 형식의 데이터 파일(StoreFile)을 생성한 뒤, 이를 실행 중인 클러스터에 직접 로드하는 방식이에요.

출처: 문서

본문

개요 (Overview)

HBase에는 데이터를 테이블에 로드하는 여러 방법이 있어요. 가장 간단한 방법은 MapReduce 작업에서 TableOutputFormat 클래스를 사용하거나 일반 클라이언트 API를 사용하는 것이지만, 이 방법들이 항상 가장 효율적인 것은 아니에요.

벌크 로드 기능은 MapReduce 작업을 사용해 테이블 데이터를 HBase 내부 데이터 형식으로 출력한 다음, 생성된 StoreFile을 실행 중인 클러스터에 직접 로드해요. 벌크 로드를 사용하면 HBase API로 로드하는 것보다 CPU와 네트워크 리소스를 덜 사용해요.

벌크 로드 아키텍처 (Bulk Load Architecture)

HBase 벌크 로드 과정은 두 가지 주요 단계로 이루어져요.

MapReduce 작업으로 데이터 준비하기 (Preparing data via a MapReduce job)

벌크 로드의 첫 단계는 HFileOutputFormat2를 사용해 MapReduce 작업에서 HBase 데이터 파일(StoreFile)을 생성하는 거예요. 이 출력 형식은 HBase 내부 저장 형식으로 데이터를 기록하므로, 나중에 클러스터에 효율적으로 로드될 수 있어요.

효율적으로 작동하려면 HFileOutputFormat2가 각 출력 HFile이 단일 region 안에 들어맞도록 구성되어야 해요. 이를 위해 HBase에 벌크 로드될 출력을 가진 작업들은 Hadoop의 TotalOrderPartitioner 클래스를 사용해 맵 출력을 테이블의 region 키 범위에 대응하는, 겹치지 않는 키 공간 범위로 분할해요.

HFileOutputFormat2에는 편의 함수인 configureIncrementalLoad()가 포함되어 있어, 테이블의 현재 region 경계를 기준으로 TotalOrderPartitioner를 자동으로 설정해요.

데이터 로드 완료하기 (Completing the data load)

데이터 임포트를 준비한 후에는(importtsv 도구를 "importtsv.bulk.output" 옵션과 함께 사용하거나 HFileOutputFormat을 사용하는 다른 MapReduce 작업으로) completebulkload 도구를 사용해 데이터를 실행 중인 클러스터로 가져와요. 이 커맨드라인 도구는 준비된 데이터 파일을 순회하며 각 파일이 속한 region을 결정해요. 그런 다음 적절한 RegionServer에 접촉해 HFile을 채택(adopt)하고, 저장 디렉터리로 옮겨 클라이언트가 데이터를 사용할 수 있게 해요.

벌크 로드 준비 중에, 또는 준비 단계와 완료 단계 사이에 region 경계가 변경되었다면 completebulkload 유틸리티가 새 경계에 대응하도록 데이터 파일을 자동으로 조각내요. 이 과정이 최적으로 효율적이지는 않으므로, 특히 다른 클라이언트가 동시에 다른 수단으로 데이터를 로드하고 있다면 벌크 로드 준비와 클러스터 임포트 사이의 지연을 최소화하도록 주의해야 해요.

$ hadoop jar hbase-mapreduce-VERSION.jar completebulkload [-c /path/to/hbase/config/hbase-site.xml] /user/todd/myoutput mytable

-c config-file 옵션은 CLASSPATH에 이미 제공되지 않았다면 적절한 hbase 파라미터(예: hbase-site.xml)를 담은 파일을 지정하는 데 사용할 수 있어요. (추가로, zookeeper를 HBase가 관리하지 않는다면 CLASSPATH에는 zookeeper 설정 파일이 있는 디렉터리가 포함되어야 해요.)

참고 (See Also)

언급된 유틸리티에 대한 자세한 내용은 ImportTsv와 CompleteBulkLoad를 참고해 주세요.

How-to: Use HBase Bulk Loading, and Why는 로딩에 대한 옛날 블로그 글이에요.

고급 사용법 (Advanced Usage)

importtsv 도구는 많은 경우에 유용하지만, 고급 사용자는 데이터를 프로그래밍 방식으로 생성하거나 다른 형식에서 가져오고 싶을 수 있어요. 시작하려면 ImportTsv.java를 살펴보고 HFileOutputFormat의 JavaDoc을 확인해 주세요.

벌크 로드의 임포트 단계도 프로그래밍 방식으로 수행할 수 있어요. 자세한 내용은 LoadIncrementalHFiles 클래스를 참고해 주세요.

'떠돌이' 데이터 채택하기 ('Adopting' Stray Data)

장애나 오류 동안 HBase 클러스터가 region이나 파일의 기록을 잃은 경우, completebulkload 도구를 사용해 유실된 데이터를 다시 추가할 수 있어요. HBCK2 같은 HBase 운영자 도구나 HBase 2.0.6/2.1.6/2.2.1부터 Master UI의 HBCK Report 아래 추가된 보고는 그런 '고아(orphan)' 디렉터리를 식별할 수 있어요.

'adoption'(채택)을 시작하기 전에 hbase:meta 테이블이 건강한 상태인지 확인해 주세요. HBase shell에서 catalogjanitor_run 명령을 실행해 CatalogJanitor를 실행해 주세요. 끝나면 Master UI의 HBCK Report 페이지를 확인해 주세요. 발견된 불일치, 구멍, 겹침을 진행 전에 수정해 주세요. hbase:meta 테이블은 모든 데이터가 어디에 있는지에 대한 권위자이며, completebulkload 도구가 제대로 작동하려면 일관성이 있어야 해요.

completebulkload 도구는 디렉터리와 탭블네임을 받아요. 디렉터리에는 대상 테이블의 컬럼 패밀리 이름을 가진 하위 디렉터리들이 있고, 그 하위 디렉터리들에 로드할 hfiles가 있어요. 이 구조가 주어지면, 잘못된 region 디렉터리(와 region 디렉터리가 속한 테이블 이름)를 넘겨주면 도구가 데이터 파일을 적절한 서빙 디렉터리 아래로 옮겨 제자리로 되돌려 줘요. 떠돌이 파일인 경우에는 completebulkload 도구를 호출하기 전에 이 구조를 흉내 내야 해요. 사용할 컬럼 패밀리를 보려면 HFile Tool로 파일 내용을 살펴봐야 할 수도 있어요. 도구 실행이 끝나면 원래 잘못된 디렉터리의 storefile이 이동/제거된 것을 알 수 있어요. 데이터가 빠져나갔으니 이제 말라버린(desiccated) 상태이며, 가리켰던 디렉터리는 안전하게 제거할 수 있어요. .regioninfo 파일이나 다른 하위 디렉터리들이 여전히 있을 수 있지만 이제는 관련이 없어요. recovered_edits 디렉터리 아래에 콘텐츠가 남아 있을 수 있는데, 필요 시 recovered_edits 콘텐츠를 재생하는 도구는 TODO로 남아 있어요(Add RecoveredEditsPlayer 참고). store 파일이 없는 디렉터리를 completebulkload에 넘기면, 실행된 뒤 디렉터리가 storefile이 없다고 표시되므로 그런 '빈' 디렉터리는 그냥 제거해 주세요.

예를 들어, HDFS 최상위 레벨에 eb3352fb5c9c9a05feeb2caba101e1cc라는 디렉터리가 있고 HBase TestTable에 다시 추가해야 할 데이터가 있다고 가정해 봐요.

$ ${HBASE_HOME}/bin/hbase --config ~/hbase-conf completebulkload hdfs://server.example.org:9000/eb3352fb5c9c9a05feeb2caba101e1cc TestTable

성공적으로 완료된 후에는 eb3352fb5c9c9a05feeb2caba101e1cc에 있던 파일들이 hbase 아래로 이동되었으며, eb3352fb5c9c9a05feeb2caba101e1cc 디렉터리는 삭제할 수 있어요(HDFS 디렉터리에 ls -r을 실행해 전후 내용을 확인해 주세요).

벌크 로딩 복제 (Bulk Loading Replication)

HBASE-13153은 HBase 1.3/2.0부터 사용 가능한, 벌크 로드된 HFiles에 대한 복제 지원을 추가해요. 이 기능은 hbase.replication.bulkload.enabled를 true로 설정하면 활성화돼요(기본값은 false). 또한 소스 클러스터 구성 파일을 대상 클러스터로 복사해야 해요.

추가 구성도 필요해요.

  • hbase.replication.source.fs.conf.provider 대상 클러스터에서 소스 클러스터 파일시스템 클라이언트 구성을 로드하는 클래스를 정의해요. 대상 클러스터의 모든 RS에 대해 구성되어야 해요. 기본값은 org.apache.hadoop.hbase.replication.regionserver.DefaultSourceFSConfigurationProvider입니다.
  • hbase.replication.conf.dir 소스 클러스터의 파일시스템 클라이언트 구성이 대상 클러스터로 복사되는 기본 디렉터리를 나타내요. 대상 클러스터의 모든 RS에 대해 구성되어야 해요. 기본값은 $HBASE_CONF_DIR입니다.
  • hbase.replication.cluster.id 벌크 로드된 데이터에 대한 복제가 활성화된 클러스터에서 필요한 구성이에요. 소스 클러스터는 대상 클러스터가 이 id로 고유하게 식별해요. 소스 클러스터 구성 파일의 모든 RS에 대해 구성되어야 해요.

예를 들어, 소스 클러스터 FS 클라이언트 구성을 대상 클러스터의 /home/user/dc1/ 디렉터리에 복사했다면 hbase.replication.cluster.id는 dc1로, hbase.replication.conf.dir은 /home/user로 구성해야 해요.

DefaultSourceFSConfigurationProvider는 xml 형식 파일만 지원해요. 소스 클러스터 FS 클라이언트 구성을 한 번만 로드하므로, 소스 클러스터 FS 클라이언트 구성 파일이 갱신되면 구성 재로드를 위해 모든 peer 클러스터 RS를 재시작해야 해요.

더 알아보기 (Learn more)

ImportTsv, CompleteBulkLoad, HBCK2 등 대용량 데이터 로딩과 운영 도구 관련 문서를 이어서 보시길 권해요.