Hbase FAQ

1. Hbase 핫스팟 (데이터 스큐) 문제, 읽기 및 쓰기 요청이 특정 RegionServer에 집중됩니다.

뜨거운 문제의 이유 :

1. hbase의 데이터는 사전 순으로 정렬되며, 개별 영역에 연속 된 많은 rowkey가 기록되면 영역 간의 데이터 분포가 균형을 이루지 못합니다.

2. 테이블 생성시 사전 분할이 없으며 생성 된 테이블은 기본적으로 하나의 영역 만 있으며 현재 영역에 많은 양의 데이터가 기록됩니다.

3. 생성 된 테이블은 미리 분할되었지만 설계된 rowkey에는 따라야 할 규칙이 없습니다.

솔루션 : 행의 세 가지 설계 원칙

2. Hbase에 플러시, 콤팩트, 유출의 목적은 무엇입니까?

플러시 (임계 값 128M)

        MemStore가 임계 값에 도달하면 Memstore 데이터 StoreFile 플러시 됩니다 .

Compact ( 데이터 블록이 3 개 블록에 도달하면 HMaster가 병합 작업을 트리거합니다.)

        c를 ompact 메커니즘이 하는 플러시 밖으로 작은 파일은 큰 병합 Storefile의 파일.

        파일 결합 , 삭제, 만료 및 중복 된 데이터 버전 지우기, 데이터 읽기 및 쓰기 효율성 향상

연주

        지역이 임계 값 ( 256M )에 도달하면 초대형 지역이 두 개로 분할됩니다 (균등하게 분할되지 않음). ( 미들 키 )

3. Hbase의 regionserver가 다운되었을 때 데이터를 복원하는 방법

4. hbase 최적화

메모리 최적화 : 가비지 수집 최적화 : CMS , G1 (지역); JVM 시작 : -Xms (1/64) -Xmx (1/4)

지역 최적화 : 사전 분할, 주요 병합 비활성화, 수동 병합

클라이언트 최적화 : 일괄 처리

5. Hbase, Hive 및 Redis의 차이점

MR 프로그램을 기반으로 Hive는 HQL을 MR 실행으로 변환합니다. 낮은 효율성, 실시간 데이터 액세스에 적합하지 않음

Hbase는 Hadoop 데이터 스토리지를 기반으로하며 대량의 데이터를 저장하며 자체 쿼리 작업이 있습니다.

Redis 분산 캐시, 메모리 기반 캐싱 강조, 데이터 지속성 지원 및 트랜잭션 작업 지원

Redis와 Hbase는 모두 키-값 저장소를 기반으로합니다.

애플리케이션 시나리오 :

Hive는 대기 시간이 긴 오프라인 데이터 분석 및 정리에 적합합니다.

Hbase는 대기 시간이 짧고 온라인 비즈니스 사용에 대한 액세스가 가능하며 효율적인 데이터 액세스 속도를 제공합니다.

6. Hbase의 스캔을 설명하고 기능과 구현 유사점 및 차이점을 얻습니다.

스캔 데이터 스캔

/**
     * 通过scan查询数据
     */
    public static void getDataByScanFilter(String tableName) throws IOException {
        Connection conn = connHolder.get();
        Table table = conn.getTable(TableName.valueOf(tableName));

        //创建用于扫描region的对象
        Scan scan = new Scan();

        //设置Filter(较慢)
        //字节数组比较器
        BinaryComparator bc = new BinaryComparator(Bytes.toBytes("1001"));
        //正则表达式比较器
        RegexStringComparator rc = new RegexStringComparator("^\\d{3}$");

        Filter f1 = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,bc);
        Filter f2 = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,rc);
        //设置单个filter
        //scan.setFilter(f1);

        //设置多个fiter
        /**
         *  多个filter之间的逻辑关系,相当于java中的与和或
         *  (AND)
         *  MUST_PASS_ALL,
         *  (OR)
         *  MUST_PASS_ONE
          */

        FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
        filterList.addFilter(f1);
        filterList.addFilter(f2);

        ResultScanner scanner = table.getScanner(scan);

        for (Result result : scanner) {
            for (Cell cell : result.rawCells()) {
                //得到rowkey
                System.out.println("行键:" + Bytes.toString(CellUtil.cloneRow(cell)));
                //得到列族
                System.out.println("列族" + Bytes.toString(CellUtil.cloneFamily(cell)));
                System.out.println("列:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
                System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell)));
            }
        }
        
    }

데이터를 얻다

/**
     * 获取一行数据
     */
    public static void getRow(String tableName, String rowKey) throws IOException{
        Connection conn = connHolder.get();
        Table table = conn.getTable(TableName.valueOf(tableName));
        Get get = new Get(Bytes.toBytes(rowKey));
        //get.setMaxVersions();显示所有版本
        //get.setTimeStamp();显示指定时间戳的版本
        Result result = table.get(get);
        for(Cell cell : result.rawCells()){
            System.out.println("行键:" + Bytes.toString(result.getRow()));
            System.out.println("列族" + Bytes.toString(CellUtil.cloneFamily(cell)));
            System.out.println("列:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
            System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell)));
            System.out.println("时间戳:" + cell.getTimestamp());
        }
    }

7. HBase 클러스터에서 여러 HMaster를 시작할 수 있습니까? 이러한 HMaster를 병렬로 실행할 수 있습니까?

동시에 여러 Hmaster 작업을 시작할 수 있습니다 (Hmaster 2 개는 고 가용성 상태에서 시작할 수 있지만 Hmaster는 하나만 실행할 수 있습니다. 즉, 하나만 활성화 됨).

추천

출처blog.csdn.net/QJQJLOVE/article/details/107280729