복붙노트

[HADOOP] HBase에서 여러 행을 효율적으로 삭제하는 방법

HADOOP

HBase에서 여러 행을 효율적으로 삭제하는 방법

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. ==============================

    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. ==============================

    2.관련 범위 (시작 행, 끝 행, 필터)를 정의하는 검색을 사용하는 대량 삭제 프로토콜을 사용할 수 있습니다.

    관련 범위 (시작 행, 끝 행, 필터)를 정의하는 검색을 사용하는 대량 삭제 프로토콜을 사용할 수 있습니다.

    여길 봐

  3. ==============================

    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();
    }
    
  4. from https://stackoverflow.com/questions/4618980/efficient-way-to-delete-multiple-rows-in-hbase by cc-by-sa and MIT license