2015-09-16 31 views
21

私は「mytableは」HBaseのテーブルにこれらのキーを使用して、次の行を持ってhbaseの複数の行を一括削除する方法は?

user_1 
user_2 
user_3 
... 
user_9999999 

私はから行を削除するには、HBaseのシェルを使用したい:

をuser_900する

user_500私が知っています削除する方法はありませんが、これを行うには "BulkDeleteProcessor"を使用する方法がありますか?

私はここを参照してください:

https://github.com/apache/hbase/blob/master/hbase-examples/src/test/java/org/apache/hadoop/hbase/coprocessor/example/TestBulkDeleteProtocol.java

私は輸入に貼り付けると、シェルにこれを貼り付けるが、どのようにこのことについてに行くには考えているしたいと思います。 jrubyのhbaseシェルからこのエンドポイントをどのように使用できるのか誰にでも分かりますか?

JRubyでこれを行う方法がない場合は、複数の行をすばやく削除するJavaまたは別の方法で問題ありません。

+2

ちょうど不思議なことに、ルビーはどういう印象を持っていますか? – lcguida

+1

フラグが削除され、それはもっとjrubyです。 – Rolando

答えて

15

他にもいろいろな良い方法があるので、本当にシェルでやりたいですか?一つの方法は、削除の配列リスト

  • パスTable.deleteメソッドに、この配列リストを作成ネイティブJava API

    • を使用している

    方法1:あなたはすでにキーの範囲を知っていれば。

    public void massDelete(byte[] tableName) throws IOException { 
        HTable table=(HTable)hbasePool.getTable(tableName); 
    
        String tablePrefix = "user_"; 
        int startRange = 500; 
        int endRange = 999; 
    
        List<Delete> listOfBatchDelete = new ArrayList<Delete>(); 
    
        for(int i=startRange;i<=endRange;i++){ 
         String key = tablePrefix+i; 
         Delete d=new Delete(Bytes.toBytes(key)); 
         listOfBatchDelete.add(d); 
        } 
    
        try { 
         table.delete(listOfBatchDelete); 
        } finally { 
         if (hbasePool != null && table != null) { 
          hbasePool.putTable(table); 
         } 
        } 
    } 
    

    方法2:スキャン結果に基づいてバッチ削除を実行する場合。

    public bulkDelete(final HTable table) throws IOException { 
        Scan s=new Scan(); 
        List<Delete> listOfBatchDelete = new ArrayList<Delete>(); 
        //add your filters to the scanner 
        s.addFilter(); 
        ResultScanner scanner=table.getScanner(s); 
        for (Result rr : scanner) { 
         Delete d=new Delete(rr.getRow()); 
         listOfBatchDelete.add(d); 
        } 
        try { 
         table.delete(listOfBatchDelete); 
        } catch (Exception e) { 
         LOGGER.log(e); 
    
        } 
    } 
    

    ここでは、CoProcessorを使用しています。あなたがHBaseの専門家でない限り、「CoProcessorを使用しないでください」という唯一のアドバイスです。 CoProcessorsには、必要な場合に多くの組み込みの問題があります。詳細な説明を提供できます。 HBaseから何かを削除すると、Hbaseから直接削除されることはありません。そこには、墓石のマーカーがそのレコードにアタッチされ、後で大規模な圧縮中に削除されるため、リソースが徹底的なコプロセッサを使用する必要はありません。

    バッチ操作をサポートする変更されたコード。

    int batchSize = 50; 
    int batchCounter=0; 
    for(int i=startRange;i<=endRange;i++){ 
    
    String key = tablePrefix+i; 
    Delete d=new Delete(Bytes.toBytes(key)); 
    listOfBatchDelete.add(d); 
    batchCounter++; 
    
    if(batchCounter==batchSize){ 
        try { 
         table.delete(listOfBatchDelete); 
         listOfBatchDelete.clear(); 
         batchCounter=0; 
        } 
    }} 
    

    HBaseの作成とテーブルインスタンスの取得。

    Configuration hConf = HBaseConfiguration.create(conf); 
    hConf.set("hbase.zookeeper.quorum", "Zookeeper IP"); 
    hConf.set("hbase.zookeeper.property.clientPort", ZookeeperPort); 
    
    HTable hTable = new HTable(hConf, tableName); 
    
  • +0

    削除する行数が非常に多い場合は、多くのDeleteオブジェクトが存在する可能性があるため、両方のソリューションでヒープサイズを考慮する必要があります。 (おそらく、バッチで削除を実行する) –

    +0

    はい、間違いなく非常に簡単に行うことができます。 –

    +0

    はい、これは、必要なサイズのバッチを作成するためのもう1つのforループの助けを借りて非常に簡単に行うことができます。 HBaseバッチ(List )メソッドの呼び出しを使用することを提案している場合、少し速くなりますが、ヒープの使用量を最小限に抑えたり、ヒープ使用量を増やすのに役立ちません。これを行うには、ループのためにもう1つ作成する必要があります –

    4

    あなたはHBaseのテーブルから削除するレコードのrowkeysのすでに認識して、あなたは、次のアプローチを使用することができる場合

    1.Firstは、リストを作成するには、これらのrowkeys持つオブジェクト

    for (int rowKey = 1; rowKey <= 10; rowKey++) { 
        deleteList.add(new Delete(Bytes.toBytes(rowKey + ""))); 
    } 
    

    2。その後、完全なコードは次のようになりますリスト

    table.delete(deleteList); 
    

    を渡すことで、()

    Table table = connection.getTable(TableName.valueOf(tableName)); 
    

    が3.Onceあなたがテーブルオブジェクトの呼び出しは削除しているHBaseの接続を使用して、テーブルオブジェクトを取得し、以下の

    Configuration config = HBaseConfiguration.create(); 
    config.addResource(new Path("/etc/hbase/conf/hbase-site.xml")); 
    config.addResource(new Path("/etc/hadoop/conf/core-site.xml")); 
    
    String tableName = "users"; 
    
    Connection connection = ConnectionFactory.createConnection(config); 
    Table table = connection.getTable(TableName.valueOf(tableName)); 
    
    List<Delete> deleteList = new ArrayList<Delete>(); 
    
    for (int rowKey = 500; rowKey <= 900; rowKey++) { 
        deleteList.add(new Delete(Bytes.toBytes("user_" + rowKey))); 
    } 
    
    table.delete(deleteList); 
    
    関連する問題