hbase堆载hfiles周期性和小压实关系

u4dcyp6a  于 2021-06-07  发布在  Hbase
关注(0)|答案(1)|浏览(387)

我有一个场景,我们必须定期地将hfiles加载到hbase表中。
每次运行的hfile大小可能在每个区域50到150 mb之间。这些负荷可能是12次一天,以及在某些情况下每15分钟。
在进行测试时,我发现即使在区域中立即有3个以上的文件,也不会触发轻微的压缩。这可能会导致问题,因为有许多文件为同一行键保存行。
我已经看到在10000秒(大约2小时45分钟)后被唤醒的压缩线程正在开始压缩并将压缩任务放入队列中。
是否有任何配置可以告诉我们,一旦批量加载(completebulkload)写入3个或3个以上的hfiles,不管hfile的大小,就触发轻微压缩?
hbase版本:hbase 1.1.2.2.6.5.4-1

Configuration:
   hbase.hstore.compaction.max = 10
   hbase.hstore.compactionThreshold = 3
   hbase.server.thread.wakefrequency = 10000
46qrfjad

46qrfjad1#

在查看API时,我发现可以在hbase表级别异步调用次要或主要压缩。
如果批量加载更频繁地推送冗余数据并使用恒定区域拆分大小策略,则可以使用hbase管理api根据避免拆分的需要调用压缩。
下面是一个用java实现的示例代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Table;

public class Compaction {

    private String tableName;
    private String compactionType;
    private Configuration conf;
    private Connection hbaseConnection;
    private String confFile = "/usr/hdp/current/hbase-client/conf/hbase-site.xml";
    private Admin admin;
    private Table table;
    private int sleepTime = 1 ;

    public Compaction(String tableName, String compactionType) {
        this.tableName = tableName;
        this.compactionType = compactionType;

    }

    private void initHBaseConnection() {
        this.conf = HBaseConfiguration.create();
        try {
            conf.addResource(new FileInputStream(new File(confFile )));
            hbaseConnection = ConnectionFactory.createConnection(conf);
            table = hbaseConnection.getTable(TableName.valueOf(tableName));
            admin = hbaseConnection.getAdmin();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public boolean perfom() throws InterruptedException {

          System.out.println("Performing action: Compact table " + tableName + ", compact type =" + compactionType);
          try {
            if (compactionType.equalsIgnoreCase("major")) {
              admin.majorCompact(table.getName());
            } else {
              admin.compact(table.getName());
            }
          } catch (Exception ex) {
            System.err.println("Compaction failed, might be caused by other chaos: " + ex.getMessage());
            return false;
          }
          if (sleepTime  > 0) {
            Thread.sleep(sleepTime);
          }
        return true;
    }
    public static void main(String[] args) throws InterruptedException {
        String tableName = args[0];
        String compactionType = args[1];
        Compaction compaction = new Compaction(tableName, compactionType);
        compaction.initHBaseConnection();
        compaction.perfom();
    }

}

相关问题