[HADOOP] Java 내부의 Hbase CopyTable
HADOOPJava 내부의 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.우선 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 메소드를 강제로 호출합니다.
from https://stackoverflow.com/questions/41760192/hbase-copytable-inside-java by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 여러 레코드를 포함하는 삽입 문을 작성하는 Sqoop (0) | 2019.09.08 |
---|---|
[HADOOP] 컨테이너 내부에서 YARN ContainerId를 어떻게 얻습니까? (0) | 2019.09.08 |
[HADOOP] 확률과 예측이 모든 것을 동일하게 만드는 Spark MLLib 관련 문제 (0) | 2019.09.08 |
[HADOOP] 하둡 작업 추적기 문제 (0) | 2019.09.08 |
[HADOOP] start-dfs.sh를 실행할 수 없습니다 (0) | 2019.09.08 |