读取几百万条记录后 HBase 读取速度变慢
HBase reading slowing down after reading few miilion records
我计划将大约 2.5 亿条记录从 HBase table 加载到 Kafka 队列。
批次最初在大约 1250 rows/sec 开始扫描或读取。但是在读取大约 4 到 5 百万条记录后,读取速度减慢到 90 rows/sec 并永远保持它。
我尝试了各种方法每 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 条记录重新加载配置,但也无济于事。
像这样完成这项工作需要几天或几个月的时间。有什么办法可以改善这一点。速度变慢的原因是什么。
上周已解决此问题。问题是我正在执行文件写入操作来存储 Hbase 记录的密钥。我这样做是为了存储 Key 以防万一。文件写入操作不如单个 Hbase 记录读取快,并且增加了近 100 倍的时间。
FileWriter fileWriter = new FileWriter(file, true);
BufferedWriter bufferWriter = new BufferedWriter(fileWriter);
bufferWriter.write(rowKey);
bufferWriter.write("\n");
bufferWriter.close();
一旦我评论了这个逻辑并将其移动到 Catch 块中,这项工作就非常快了。在不到 12 小时内处理了大约 2 亿条记录。
我计划将大约 2.5 亿条记录从 HBase table 加载到 Kafka 队列。
批次最初在大约 1250 rows/sec 开始扫描或读取。但是在读取大约 4 到 5 百万条记录后,读取速度减慢到 90 rows/sec 并永远保持它。
我尝试了各种方法每 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 条记录重新加载配置,但也无济于事。
像这样完成这项工作需要几天或几个月的时间。有什么办法可以改善这一点。速度变慢的原因是什么。
上周已解决此问题。问题是我正在执行文件写入操作来存储 Hbase 记录的密钥。我这样做是为了存储 Key 以防万一。文件写入操作不如单个 Hbase 记录读取快,并且增加了近 100 倍的时间。
FileWriter fileWriter = new FileWriter(file, true);
BufferedWriter bufferWriter = new BufferedWriter(fileWriter);
bufferWriter.write(rowKey);
bufferWriter.write("\n");
bufferWriter.close();
一旦我评论了这个逻辑并将其移动到 Catch 块中,这项工作就非常快了。在不到 12 小时内处理了大约 2 亿条记录。