0

我有一个场景,我们必须定期将 HFiles 加载到 HBase 表中。

每次运行的 HFile 大小可以在每个区域 50 到 150 MB 之间。这些负载可能是每天 12 次,在某些情况下可能是每 15 分钟一次。

在进行测试时,我观察到即使在区域中立即拥有超过 3 个文件后,Minor 压缩也不会被触发。这可能会导致问题有很多文件持有相同行键的行。

我已经看到在 10000 秒(大约 2 小时 45 分钟)后唤醒的压缩线程正在开始压缩并将压缩任务放入队列中。

是否有任何配置可以告诉在批量加载(completebulkload)写入 3 个或更多 hFile 时触发次要压缩,而不管 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
4

1 回答 1

0

在查看 API 时,我发现可以在 hbase 表级别异步调用次要或主要压缩。

如果批量加载更频繁地推送冗余数据并使用恒定区域拆分大小策略,则可以使用 HBase Admin 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();
    }

} 
于 2020-01-24T08:23:50.910 回答