복붙노트

[HADOOP] Java 내부의 Hbase CopyTable

HADOOP

Java 내부의 Hbase CopyTable

좋은 성능으로 하나의 Hbase 테이블을 다른 위치로 복사하고 싶습니다.

Hbase-server github 페이지의 CopyTable.java의 코드를 재사용하고 싶습니다.

hbase에서 문서를 찾고 있었지만 많은 도움이되지 않았습니다 http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/CopyTable.html

이 스택 오버 플로우 게시물을 살펴본 후 : Java의 다른 클래스에서 클래스의 main () 메소드를 호출 할 수 있습니까

메인 클래스를 사용하여 직접 호출 할 수 있다고 생각합니다.

질문 : hbase-server의 Copy Table을 사용하는 것보다이 복사를 수행하는 것이 좋습니다. 이 Copy Table을 사용하는 데 불편이 있습니까?

해결법

  1. ==============================

    1.우선 Snapshot이 CopyTable보다 낫습니다.

    우선 Snapshot이 CopyTable보다 낫습니다.

    버전 0.94.6 이전에는 테이블을 백업하거나 복제하는 유일한 방법은 CopyTable / ExportTable을 사용하거나 테이블을 비활성화 한 후 HDFS의 모든 hfile을 복사하는 것입니다. 이러한 방법의 단점은 리젼 서버 성능 (테이블 복사 / 내보내기)을 저하 시키거나 테이블을 비활성화해야한다는 것입니다. 즉, 읽기 또는 쓰기가 없습니다. 그리고 이것은 일반적으로 받아 들일 수 없습니다.

    또한 Snapshots + and + Repeatable + reads + for + HBase + Tables를 참조하십시오.

    스냅 샷 내부

    코드에서 다음과 같은 것을 구현할 수 있습니다. 이것은 mapreduce 작업을 작성하여 여러 put 레코드를 일괄 처리로 삽입하는 독립 프로그램입니다 (100000 일 수 있음).

    hbase 클라이언트에 대한 독립형 삽입의 성능이 향상되어 mapreduce 방식으로 시도 할 수 있습니다

    public void addMultipleRecordsAtaShot(final ArrayList<Put> puts, final String tableName) throws Exception {
            try {
                final HTable table = new HTable(HBaseConnection.getHBaseConfiguration(), getTable(tableName));
                table.put(puts);
                LOG.info("INSERT record[s] " + puts.size() + " to table " + tableName + " OK.");
            } catch (final Throwable e) {
                e.printStackTrace();
            } finally {
                LOG.info("Processed ---> " + puts.size());
                if (puts != null) {
                    puts.clear();
                }
            }
        }
    

    그것과 함께 당신은 또한 아래에서 고려할 수 있습니다 ...

    1) table.setAutoFlush (거짓)

    2) 버퍼 크기 설정

    <property>
             <name>hbase.client.write.buffer</name>
             <value>20971520</value> // you can double this for better performance 2 x 20971520 = 41943040
     </property>
                 OR
    
        void setWriteBufferSize(long writeBufferSize) throws IOException
    

    버퍼는 두 번만 플러시됩니다. 명시 적 플러시           flushCommits () 호출을 사용하여 영구 저장을 위해 서버로 데이터를 보냅니다.

    암시 적 플러시  put () 또는 setWriteBufferSize ()를 호출하면 트리거됩니다. 두 호출 모두 현재 사용 된 버퍼 크기를 구성된 제한과 비교하고 필요에 따라 flushCommits () 메소드를 호출합니다.

    전체 버퍼가 사용 불가능한 경우 setAutoFlush (true)를 설정하면 클라이언트가 put ()을 호출 할 때마다 flush 메소드를 강제로 호출합니다.

  2. from https://stackoverflow.com/questions/41760192/hbase-copytable-inside-java by cc-by-sa and MIT license