[HADOOP] HBase에서 여러 행을 효율적으로 삭제하는 방법
HADOOPHBase에서 여러 행을 효율적으로 삭제하는 방법
HBase에서 여러 행을 삭제하는 효율적인 방법이 있습니까? 아니면 HBase에 적합하지 않은 사용 사례 냄새가 있습니까?
차트에있는 항목이 포함 된 '차트'라는 테이블이 있습니다. 행 키의 형식은 다음과 같습니다. 차트 | date_reversed | ranked_attribute_value_reversed | content_id
때로는 주어진 날짜의 차트를 다시 생성하기를 원하므로 'chart | date_reversed_1'에서 'chart | date_reversed_2'까지의 모든 행을 삭제하고 싶습니다. 스캔으로 발견 된 각 행에 대해 삭제를 실행하는 것보다 나은 방법이 있습니까? 삭제할 모든 행은 서로 가깝게 될 것입니다.
하나의 항목 (하나의 content_id)이 해당 항목의 roles_attribute_value가 변경된 경우 (차트의 재생성이 필요한 이유) 여러 항목을 갖기를 원하지 않기 때문에 행을 삭제해야합니다.
HBase 초보자이기 때문에 열이 더 좋을 것 같은 행을 잘못 사용하고있을 수도 있습니다. 설계 제안이 있으면 멋진 코드 일 것입니다. 또는 파일 (예 : 출력용 HBase 없음)에서 차트를 생성하는 것이 더 좋을 수도 있습니다. MapReduce를 사용하고 있습니다.
해결법
-
==============================
1.첫째, 범위 삭제 지점에 오면 HBase, AFAIK에서 범위 삭제가 아직 없습니다. 그러나 HTableInterface API에서 한 번에 둘 이상의 행을 삭제하는 방법이 있습니다. 이를 위해 단순히 행 키가있는 Delete 객체를 스캔하여 List에 넣고 API를 사용합니다. 스캔 속도를 높이려면 스캔 결과에 열 패밀리가 포함되지 않도록 전체 행을 삭제하기위한 행 키만 있으면됩니다.
첫째, 범위 삭제 지점에 오면 HBase, AFAIK에서 범위 삭제가 아직 없습니다. 그러나 HTableInterface API에서 한 번에 둘 이상의 행을 삭제하는 방법이 있습니다. 이를 위해 단순히 행 키가있는 Delete 객체를 스캔하여 List에 넣고 API를 사용합니다. 스캔 속도를 높이려면 스캔 결과에 열 패밀리가 포함되지 않도록 전체 행을 삭제하기위한 행 키만 있으면됩니다.
둘째, 디자인에 관한 것입니다. 먼저 요구 사항에 대한 이해는 콘텐츠 id가있는 콘텐츠가 있고 각 콘텐츠에는 차트가 생성되어 해당 데이터가 저장됩니다. 날짜별로 콘텐츠 당 여러 개의 차트가있을 수 있으며 순위에 따라 다릅니다. 또한 마지막으로 생성 된 콘텐츠의 차트가 표의 맨 위에 표시되기를 원합니다.
요구 사항을 가정 할 때 auto_id, content_charts 및 generated_order의 세 테이블을 사용하는 것이 좋습니다. content_charts의 행 키는 해당 콘텐츠 ID이고 generated_order의 행 키는 HTableInterface API를 사용하여 자동 감소 된 long이됩니다. 감소 시키려면 '-1'을 앱의 첫 번째 시작시 또는 auto_id 테이블에서 Long.MAX_VALUE 값을 오프셋 및 초기화 할 양으로 사용하십시오. 이제 차트 데이터를 삭제하려면 delete를 사용하여 열 패밀리를 정리 한 다음 새 데이터를 다시 입력 한 다음 generated_order 테이블에 넣으십시오. 이 방식으로 최신 삽입은 컨텐츠 ID를 셀 값으로 유지하는 최신 삽입 테이블의 맨 위에 있습니다. generated_order에 내용 당 하나의 항목 만 있는지 확인하려면 generated_order id를 먼저 저장하고 값을 가져 와서 열을 넣을 때 content_charts에 저장하고 열 패밀리를 삭제하기 전에 먼저 generated_order에서 행을 삭제하십시오. 이 방법을 사용하면 최대 2 회 가져 오기를 사용하고 차트에 필요한 스캔을 사용하지 않고도 콘텐츠를 조회하고 차트 할 수 있습니다.
이것이 도움이되기를 바랍니다.
-
==============================
2.관련 범위 (시작 행, 끝 행, 필터)를 정의하는 검색을 사용하는 대량 삭제 프로토콜을 사용할 수 있습니다.
관련 범위 (시작 행, 끝 행, 필터)를 정의하는 검색을 사용하는 대량 삭제 프로토콜을 사용할 수 있습니다.
여길 봐
-
==============================
3.나는 당신의 상황에 부딪쳤다. 그리고 이것은 당신이 원하는 것을 구현하는 나의 코드이다.
나는 당신의 상황에 부딪쳤다. 그리고 이것은 당신이 원하는 것을 구현하는 나의 코드이다.
Scan scan = new Scan(); scan.addFamily("Family"); scan.setStartRow(structuredKeyMaker.key(starDate)); scan.setStopRow(structuredKeyMaker.key(endDate + 1)); try { ResultScanner scanner = table.getScanner(scan); Iterator<Entity> cdrIterator = new EntityIteratorWrapper(scanner.iterator(), EntityMapper.create(); // this is a simple iterator that maps rows to exact entity of mine, not so important ! List<Delete> deletes = new ArrayList<Delete>(); int bufferSize = 10000000; // this is needed so I don't run out of memory as I have a huge amount of data ! so this is a simple in memory buffer int counter = 0; while (entityIterator.hasNext()) { if (counter < bufferSize) { // key maker is used to extract key as byte[] from my entity deletes.add(new Delete(KeyMaker.key(entityIterator.next()))); counter++; } else { table.delete(deletes); deletes.clear(); counter = 0; } } if (deletes.size() > 0) { table.delete(deletes); deletes.clear(); } } catch (IOException e) { e.printStackTrace(); }
from https://stackoverflow.com/questions/4618980/efficient-way-to-delete-multiple-rows-in-hbase by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] EC2에서 spark 클래스 경로 설정 : spark.driver.extraClassPath 및 spark.executor.extraClassPath (0) | 2019.07.25 |
---|---|
[HADOOP] hadoop에서 많은 수의 작은 파일을 어떻게 처리 할 수 있습니까? (0) | 2019.07.25 |
[HADOOP] 하이브 오류 : 구문 분석 누락 된 EOF (0) | 2019.07.25 |
[HADOOP] 데이터를 복사하지 않고 Hive 테이블로 데이터를 가져올 수 있습니까? (0) | 2019.07.25 |
[HADOOP] Windows의 Nutch : 경로의 사용 권한을 설정하지 못했습니다. (0) | 2019.07.25 |