kafka-connect-hbase 写入性能调优

     在实践中需要将kafaka中的数据写入到hbase 中,采用了kafka-connect-hbase这个扩展插件,但经过性能测试,写入速度较低,平均在200条/s左右,无法满足线上8000万数据的实时写入,但采用hbase的压测工具测试写入速度可达10000条/s以上,故对kafka-connect-hbase进行了性能测试。思路如下,在kafka-connect-hbase的关键步骤中增加采点,记录关键步骤的耗时,经采点发现hbaseclient.write写入速度较慢,占据了整个批次处理时间的2/3。       

  public void write(final TableName table, final List puts) {
        Preconditions.checkNotNull(table);
        Preconditions.checkNotNull(puts);
        try(final Connection connection = this.connectionFactory.getConnection();
            final BufferedMutator mutator = connection.getBufferedMutator(table);) {
            mutator.mutate(puts);
            mutator.flush();
        } catch(Exception ex) {
            final String errorMsg = String.format("Failed with a [%s] when writing to table [%s] ", ex.getMessage(),
              table.getNameAsString());
            throw new SinkConnectorException(errorMsg, ex);
        }
    }

   hbaseclient.write方法采用了BufferedMutator 批量写的方式,是正确的处理方式,由于第一次使用hbase,对整体hbase的架构和配置不是很清楚,经过调研和学习,总结了以下因素:

   (1)hbase 表region 数

     如果hbase 表region 数为较少,则在集群内只有部分regionserver提供服务,其他regionserver空闲,导致hbase表的写入和读取并行度大大减少。

      解决方案:所以在新建hbase表时需将进行预region ,通过splits实现,例如:

create 'customer_profile',{NAME => 'features', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'},SPLITS =>['0','1','2','3','4','5','6','7','8','9']

   经测试合理进行预region,可有效提供hbase写入速度。   

(2)每批  次处理的大小

     如果kafka中每条数据较大,则在hbase connector一个批次内,转化为hbase字节数组将较大,本人在200列的情况下,poll=1000的情况下,数据大小达到20-30M,此时hbaseclient.write将有较大延迟。

    解决方案: 控制每条kafka数据大小,避免大value数据。

   (3)hbase.client.write.buffer 客户端写入缓存

   客户端写入缓存大小默认值2MB,当客户端写入量达到2MB时,将向hbase 发起写请求,如果hbase.client.write.buffer调大,可减少request请求量,但同时会增加客户端和服务器端的内存压力。

    解决方案:谨慎设置hbase.client.write.buffer 值,需综合考虑客户端和服务器端的内存使用情况,经测试hbase.client.write.buffer越大,写入速度越快。

   (4)hbase 列族是否压缩

      hbase列族的压缩可有效减少磁盘IO负载,并减少磁盘占用。

    解决方案:列族进行压缩处理,经测试压缩后写入速度大于非压缩。

 (5)hbase connector task个数

     理论上task.max越大,hbase connector的并行度越好,前提是服务器具备较多的空闲cpu,如果 空闲CPU较少,较大的tasknum并不起到较大的效果,这种情况下cpu 之间的切换较为耗时,所以并不是tasknum越大越好。

    解决方案:控制task.max个数,根据实际情况这是。建议1-3个。

 此外像hbase.regionserver.handler.count(RegionServers受理的RPC Server实例数量)也会影响写入速度,建议参看官网重要推荐配置并结合上述进行相关参数的设置。

 

 

 

你可能感兴趣的:(hbase)