스냅샷 스캔

스냅샷 스캔 (Scan Over Snapshot)

HBase는 테이블을 스캔할 때 서버 측 HBase 리소스를 사용해요. 하지만 TableSnapshotScanner와 TableSnapshotInputFormat을 이용하면 HDFS의 HFiles를 직접 스캔해 HBase를 완전히 우회할 수 있어요. 이 접근 방식이 더 빠르고, HDFS ACL을 통한 권한 설정 방법도 함께 살펴볼게요.

출처: 문서

본문

HBase에서 테이블에 대한 스캔은 서버 측 HBase 리소스를 사용해 데이터를 읽고, 형식화하고, 클라이언트로 돌려보내요. 다행히 HBase는 HBASE-8369에서 도입된 TableSnapshotScanner와 TableSnapshotInputFormat을 제공하는데, 이들은 HBase가 기록한 HFiles를 hbase를 완전히 우회해서 HDFS 파일시스템에서 직접 스캔할 수 있어요. 이 접근 모드는 HBase 경유보다 성능이 좋고, in-place 또는 내보낸(exported) 스냅샷 HFiles를 가진 오프라인 HBase에서도 사용할 수 있어요.

HFiles를 직접 읽으려면, 사용자가 스냅샷이나 in-place hbase HFiles에 접근할 수 있는 충분한 권한이 있어야 해요.

TableSnapshotScanner

TableSnapshotScanner는 스냅샷 파일에 대해 단일 클라이언트 측 스캔을 실행하는 수단을 제공해요. TableSnapshotScanner를 사용할 때는 스냅샷 파일을 복사할 임시 디렉터리를 지정해야 해요. 클라이언트 사용자는 이 디렉터리에 쓰기 권한이 있어야 하고, 그 디렉터리는 hbase.rootdir의 하위 디렉터리가 아니어야 해요. 스캐너가 닫히면 디렉터리의 내용을 삭제해요.

TableSnapshotScanner 사용하기 (Use TableSnapshotScanner)

Path restoreDir = new Path("XX"); // restore dir should not be a subdirectory of hbase.rootdir
Scan scan = new Scan();
try (TableSnapshotScanner scanner = new TableSnapshotScanner(conf, restoreDir, snapshotName, scan)) {
    Result result = scanner.next();
    while (result != null) {
        ...
        result = scanner.next();
    }
}

TableSnapshotInputFormat

TableSnapshotInputFormat은 MapReduce 작업에서 스냅샷 HFiles를 스캔하는 방법을 제공해요.

TableSnapshotInputFormat 사용하기 (Use TableSnapshotInputFormat)

Job job = new Job(conf);
Path restoreDir = new Path("XX"); // restore dir should not be a subdirectory of hbase.rootdir
Scan scan = new Scan();
TableMapReduceUtil.initTableSnapshotMapperJob(snapshotName, scan, MyTableMapper.class, MyMapKeyOutput.class, MyMapOutputValueWritable.class, job, true, restoreDir);

스냅샷 및 데이터 파일 접근 권한 (Permission to access snapshot and data files)

일반적으로 HBase 소유자나 HDFS 관리자만 HFiles에 접근할 수 있어요.

HBASE-18659는 HDFS ACL을 사용해 HBase가 권한을 부여한 사용자가 스냅샷 파일에 접근할 수 있게 해요.

HDFS ACLs

HDFS ACL은 권한 검사 중에 강제할 규칙을 정의하는 "access ACL"과, 새 자식 파일이나 하위 디렉터리가 생성 시 자동으로 받는 ACL 항목을 정의하는 "default ACL"을 지원해요. HDFS ACL을 통해 HBase는 권한이 부여된 사용자를 HFiles에 대한 읽기 권한과 동기화해요.

기본 아이디어 (Basic idea)

HBase 파일은 다음과 같은 방식으로 구성돼요.

  • {hbase-rootdir}/.tmp/data/{namespace}/{table}
  • {hbase-rootdir}/data/{namespace}/{table}
  • {hbase-rootdir}/archive/data/{namespace}/{table}
  • {hbase-rootdir}/.hbase-snapshot/{snapshotName}

그래서 기본 아이디어는 global/namespace/table에 권한을 부여하거나 철회할 때 global/namespace/table 디렉터리의 파일에 HDFS ACL을 추가하거나 제거하는 거예요.

자세한 내용은 HBASE-18659의 디자인 문서를 참고해 주세요.

이 기능을 사용하기 위한 구성 (Configuration to use this feature)

  • 먼저 HDFS ACL이 활성화되고 umask가 027로 설정되어 있는지 확인해 주세요.
dfs.namenode.acls.enabled = true
fs.permissions.umask-mode = 027
  • master coprocessor를 추가해 주세요. SnapshotScannerHDFSAclController가 AccessController 다음에 구성되어 있는지 확인해 주세요.
hbase.coprocessor.master.classes = "org.apache.hadoop.hbase.security.access.AccessController
,org.apache.hadoop.hbase.security.access.SnapshotScannerHDFSAclController"
  • 이 기능을 활성화해 주세요.
hbase.acl.sync.to.hdfs.enable=true
  • 특정 테이블에 대해 이 기능을 활성화하려면 테이블 스킴을 수정해 주세요. 이 구성은 모든 테이블에 대해 기본값이 false이며, HBase가 부여한 ACL이 HDFS로 동기화되지 않는다는 뜻이에요.
alter 't1', CONFIGURATION => {'hbase.acl.sync.to.hdfs.enable' => 'true'}

제한 사항 (Limitation)

이 기능에는 몇 가지 제한이 있어요.

  • 이 기능을 활성화하면 grant, revoke, snapshot 같은 일부 master 작업은(자세한 내용은 디자인 문서 참고) 관련 hfiles에 HDFS ACL을 동기화해야 하므로 더 느려져요.
  • HDFS에는 디렉터리나 파일 하나당 최대 ACL 항목 수를 제한하는 구성이 있어요.
dfs.namenode.acls.max.entries = 32(default value)

이 32개 항목에는 디렉터리 또는 파일마다 owner, group, other, mask라는 고정 사용자 4명이 포함돼요. 디렉터리의 경우 이 4명의 사용자가 8개의 ACL 항목(access와 default)을 포함하고, 파일의 경우 4명의 사용자가 4개의 ACL 항목(access)을 포함해요. 즉, named 사용자나 그룹을 위해 24개의 ACL 항목이 남는 셈이에요. 이 제한에 따라, 우리는 최대 12명의 HBase 권한 부여 사용자 ACL만 동기화할 수 있어요. 즉, 테이블이 이 기능을 활성화하면, 그 테이블·그 테이블의 namespace·global READ 권한을 가진 총 사용자 수가 12명을 넘지 않아야 해요.

  • 이 coprocessor가 처리하지 않았거나 처리할 수 없는 경우가 있어서 사용자 HDFS ACL이 정상적으로 동기화되지 않을 수 있어요. 다른 테이블의 다른 hfile로의 참조 링크는 만들지 않을 거예요.

더 알아보기 (Learn more)

Bulk Loading, HDFS, Client 등 HBase 아키텍처 문서와 보안/접근 제어 관련 문서를 이어서 보시길 권해요.