读取数百万条记录后HBase读数放缓

时间:2015-03-07 12:40:30

标签: hbase apache-kafka

我有批处理作业计划从HBase表加载大约2.5亿条记录到Kafka Queue。

批次最初以大约1250行/秒开始扫描或读取。但是在阅读了大约4到5百万条记录后,读取速度会降低到90行/秒并永久保持。

我尝试了各种方法来刷新每400万条记录的连接,但它仍然在减慢速度。

以下是它的配置和逻辑。

private Configuration mHbaseConf;
private int MAX_HBASE_BATCH_SIZE = 1000;

private void hbaseConfCreation() {
    this.mHbaseConf = HBaseConfiguration.create();
    this.mHbaseConf.setLong(HConstants.HBASE_RPC_TIMEOUT_KEY, 4000000);
    this.mHbaseConf.setLong(
            HConstants.HBASE_REGIONSERVER_LEASE_PERIOD_KEY, 3600000);
    this.mHbaseConf.set("hbase.zookeeper.quorum", this.properties
            .getProperty("ip.hbase.zookeeper.quorum"));
    this.mHbaseConf
    .set("hbase.zookeeper.property.clientPort",
            this.properties
            .getProperty("ip.hbase.zookeeper.property.clientPort"));
}

以下是读取和发布逻辑

HTable table = new HTable(this.mHbaseConf, tableName);
Scan s = new Scan();
s.setCaching(this.MAX_HBASE_BATCH_SIZE);
s.setCacheBlocks(false);
ResultScanner rs = table.getScanner(s);

for (Result result : rs) {
    //prepare the value
    KafkaMsgPublisher.send(value);
}

kafka消息发送立即发生,但扫描速度正在减慢。我已经使用正确的日志验证了相同的内容,这些日志显示读取消耗一直在消耗。

我有整个作业单线程迭代循环。我尝试每4M记录重新加载配置,这也没有帮助。

这项工作需要数天或数月才能完成。有什么方法可以改善这个。造成这种减速的原因是什么。

1 个答案:

答案 0 :(得分:0)

这个问题上周解决了。问题是我正在进行文件写操作以存储Hbase记录的密钥。我这样做是为了存储Key的例外情况。文件写入操作没有单个Hbase记录读取那么快,并且时间增加了近100倍。

        FileWriter fileWriter = new FileWriter(file, true);
        BufferedWriter bufferWriter = new BufferedWriter(fileWriter);
        bufferWriter.write(rowKey);
        bufferWriter.write("\n");
        bufferWriter.close();

一旦我评论了这个逻辑并将其移到Catch块中,这个工作就非常快了。大约有2亿条记录在12小时内完成处理。