全部產品
Search
文件中心

Lindorm:如何統計錶行數

更新時間:Aug 28, 2026

本文介紹如何擷取 Lindorm寬表的行數大小的方法。

Lindorm 支援擷取表的精確行數以及預估行數的多種方法。統計精確行數往往需要掃描全表,而統計預估行數通常是直接從檔案層面擷取中繼資料,因此一般情況下,統計預估行數的速度要遠快於統計精確行數。

關於 Lindorm 寬表的精確行數和預估行數使用的區分如下所示:

精確行數

預估行數

統計方式

通常是掃描全表,擷取一張表中準確的行數。

直接從檔案層面擷取中繼資料,因此與真實表大小可能存在出入。

統計效能

統計耗時間長度,並發執行時帶來的額外負載高。

統計耗時短,並發執行時帶來的額外負載低。

適用情境

資料搬遷前後的資料校正等情境。

應用頁面展示表大小的變化趨勢時用於顯示錶資訊的情境。

統計寬表精確行數的方法

可通過以下多種方式擷取寬表的精確行數,建議結合具體業務情境選擇使用:

說明

使用 Lindorm SQL 統計錶行數通常情況下比使用 HBase RowCounter 更快,因為 Lindorm 自動將 COUNT 操作分布式平行處理(多線程執行),而 HBase Shell 是單線程統計。但 COUNT 仍需掃描全表,且預設 120 秒逾時,逾時會報錯。對於大表,可通過 SQL 中的 HINT 調大逾時時間。Lindorm SQL 處理速度可達每台每秒數十萬行,由於COUNT是分布式進行,叢集的機器越多越快。

基於 SQL 統計寬表的精確行數

您可使用Lindorm-cli,MySQL命令列或者DMS串連 Lindorm 寬表引擎來統計行數,或者可直接參考基於SQL的應用開發在您的業務代碼中直接執行 SQL 來使您的業務應用在運行時擷取寬表的行數。

比如:可執行以下 SQL,統計表 table_name 的行數,且設定該語句的執行逾時時間為 5 分鐘。

SELECT  /*+  _l_operation_timeout_(300000) */ COUNT(*) FROM table_name;

執行結果如下:

+--------+
| EXPR$0 |
+--------+
| 160000 |
+--------+
重要

精確統計表的行數需要掃描全表,請謹慎操作,如果資料量超過百萬,建議如下:

  1. 使用搜尋索引加速:通過搜尋索引查詢寬表資料。

  2. 在語句中添加 _l_operation_timeout這個 HINT 調大語句逾時時間:HINT。
    如 SELECT /*+ _l_operation_timeout(600000)_ */ COUNT(*) FROM table。

基於 HBase Shell 統計寬表的精確行數

首先,通過HBase Shell串連Lindorm寬表引擎,具體操作請參見通過Lindorm Shell訪問寬表引擎。

使用COUNT命令(常用方法)

通過HBase Shell工具使用COUNT命令可以精確地統計HBase錶行數。執行COUNT命令的原理是將表的資料分批次全部掃描出來進行統計,所以建議在相同內網的ECS用戶端上執行COUNT命令。如果通過公網執行COUNT命令,網路使用率會較大,導致統計效率降低。根據表結構的不同,掃描的速度會有所差別,使用COUNT命令掃描全表的速度可以小於10萬行每秒。執行以下語句統計table表的總行數。

count 'table_name'

執行結果如下:統計結果顯示

使用 HBase RowCounter 外掛程式加速

在 HBase Shell 中使用 count 命令,固然可以擷取寬表的精確行數,但是當表很大時,這個速度會很慢。RowCounter外掛程式會在本地啟動一個偽分布式的MR任務來進行COUNT操作。預設情況下這種方式是按照單個線程來執行的,統計速率與HBase Shell執行COUNT命令的統計速率差不多。如果您想提高統計速度,可以通過指定Dmapreduce.local.map.tasks.maximum=線程數來進行多線程並發執行,需要注意以下兩點:

  • 線程數小於等於表Region的個數。

  • 線程數增多可能造成叢集負載過高從而影響線上業務,請根據業務需求設定。

比如,在HBase Shell中執行下述命令來使用 RowCounter 外掛程式統計Lindorm寬表的行數。

在HBase Shell中執行以下代碼統計Lindorm寬表的行數。

  • 使用 RowCounter 外掛程式統計目標表table的總行數。

./alihbase-2.0.18/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter  "table_name"
  • 使用 RowCounter 外掛程式以 16個線程並發統計表 table 的總行數。

./alihbase-2.0.18/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter -Dmapreduce.local.map.tasks.maximum=16 "table_name"
  • 使用 RowCounter 外掛程式統計NameSpace為ns中的目標表table的總行數。

./alihbase-2.0.18/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter  "ns:table_name"

RowCounter 外掛程式執行後的統計結果都儲存在Log目錄中的hbase.log檔案,如下所示 image

統計寬表預估行數的方法

可通過以下多種方式擷取寬表的預估行數:

基於 SQL 擷取寬表的預估行數

與統計精確行數時使用SELECT語句不同,擷取預估行數需要通過以下SHOW語句來擷取:

重要

要求寬表引擎版本為2.8.2.6及以上,Lindorm SQL版本為2.9.3.6及以上。

SHOW ESTIMATED ROWS FROM table_name;

執行結果如下:

+---------------------+
| ESTIMATED_ROW_COUNT |
+---------------------+
| 15000               |
+---------------------+

通過叢集管理系統查看錶的預估行數

請先登入叢集管理系統。

Lindorm叢集管理系統中,在概覽頁面可以粗略查看錶行數。該估計值是通過將資料檔案的行數元資訊累加計算出來的。如果使用者存在更新,刪除等操作,同一行資料可能分布在多個檔案當中。同時,檔案的行數元資訊是在組建檔案時統計的,如果使用者使用了TTL功能,檔案中的部分資料可能已經到期了,從而導致該資訊不準。因此,該值僅僅只是一個估計值。但如果使用者的表沒有更新,沒有刪除和TTL到期,顯示的行數是完全準確的,可以在歷史資料移轉完成時用於估計資料完整性。

Lindorm叢集管理系統中,單擊左側導覽列概覽,在當前idc地區下,找到目標表,在預估行列中單擊查看,查看目標表的粗略行數。

說明

如果表中有資料但預估行數顯示為0,則說明當前Lindorm寬表引擎小版本過低,請升級Lindorm寬表引擎小版本。如何升級,請參見升級小版本。