本文介紹如何統計Lindorm寬表的總行數。
注意事項
Lindorm是基於LSM-Tree儲存結構的NoSQL資料庫,如果您要精確查詢Lindorm寬表的行數,需要掃描全表,表越大,耗時越長,所以不建議頻繁在Lindorm寬表中進行COUNT操作。如果您確實需要擷取表的行數,可以通過以下方式統計錶行數。
如果您要粗略查詢Lindorm寬表的行數,可以通過Lindorm叢集管理系統的表概覽頁面進行查看,詳情請參見通過叢集管理系統粗略查看錶行數。
通過HBase Shell工具統計錶行數
已通過HBase Shell串連Lindorm寬表引擎,具體操作,請參見通過Lindorm Shell訪問寬表引擎。
通過HBase Shell工具使用COUNT命令可以精確的統計HBase錶行數。執行COUNT命令的原理是將表的資料分批次全部掃描出來進行統計,所以建議在相同內網的ECS用戶端上執行COUNT命令。如果通過公網執行COUNT命令,網路使用率會較大,導致統計效率降低。根據表結構的不同,掃描的速度會有所差別,使用COUNT命令掃描全表的速度可以小於10萬行每秒。執行以下語句統計table表的總行數。
count 'table'執行結果如下:
使用HBase RowCounter統計錶行數
已通過HBase Shell串連Lindorm寬表引擎,具體操作請參見通過Lindorm Shell訪問寬表引擎。
RowCounter會在本地啟動一個偽分布式的MR任務來進行COUNT操作。預設情況下這種方式是按照單個線程來執行的,統計速率與HBase Shell執行COUNT命令的統計速率差不多。如果您想提高統計速度,可以通過指定Dmapreduce.local.map.tasks.maximum=線程數來進行多線程並發執行,需要注意以下兩點:
線程數小於等於表Region的個數。
線程數增多可能造成叢集負載過高從而影響線上業務,請根據業務需求設定。
在HBase Shell中執行以下代碼統計Lindorm寬表的行數。
統計目標表table的總行數。
./alihbase-2.0.18/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter "table"統計目標表table的總行數,16個線程並發執行。
./alihbase-2.0.18/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter -Dmapreduce.local.map.tasks.maximum=16 "table"統計NameSpace為ns中的目標表table的總行數。
./alihbase-2.0.18/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter "ns:table"
執行結果儲存在Log目錄中的hbase.log檔案。
通過Lindorm SQL統計錶行數
統計精確錶行數
通過Lindorm SQL統計錶行數的速度比使用HBase RowCounter統計錶行數的速度快,是因為Lindorm自動將COUNT的統計邏輯分布式地下發給每一個Lindorm進程,相當於多線程進行統計,而HBase Shell是單線程進行統計。但是COUNT的統計過程仍然是掃描全表,同時Lindorm SQL中的執行語句預設逾時時間為120秒,如果120秒內仍然無法統計出結果,該語句會逾時報錯。使用Lindorm SQL統計錶行數的速度大概可以達到每台每秒數十萬行,由於COUNT是分布式進行,叢集的機器越多越快。
執行以下代碼統計table錶行數。
SELECT COUNT(*) FROM table;執行結果如下:
+--------+
| EXPR$0 |
+--------+
| 16000 |
+--------+統計行數需要掃描全表,請謹慎操作,如果資料量超過百萬,建議使用搜尋索引加速:通過搜尋索引查詢寬表資料。
統計預估錶行數
要求寬表引擎版本為2.8.2.6及以上,Lindorm SQL版本為2.8.2.6及以上。
執行以下SQL統計預估錶行數:
SHOW ESTIMATED ROWS FROM table;執行結果如下:
+---------------------+
| ESTIMATED_ROW_COUNT |
+---------------------+
| 15000 |
+---------------------+通過叢集管理系統粗略查看錶行數
請先登入叢集管理系統。
Lindorm叢集管理系統中,在概覽頁面可以粗略查看錶行數。該估計值是通過將資料檔案的行數元資訊累加計算出來的。如果使用者存在更新,刪除等操作,同一行資料可能分布在多個檔案當中。同時,檔案的行數元資訊是在組建檔案時統計的,如果使用者使用了TTL功能,檔案中的部分資料可能已經到期了,從而導致該資訊不準。因此,該值僅僅只是一個估計值。但如果使用者的表沒有更新,沒有刪除和TTL到期,顯示的行數是完全準確的,可以在歷史資料移轉完成時用於估計資料完整性。
Lindorm叢集管理系統中,單擊左側導覽列概覽,在當前idc地區下,找到目標表,在預估行列中單擊查看,查看目標表的粗略行數。
如果表中有資料但預估行數顯示為0,則說明當前Lindorm寬表引擎小版本過低,請升級Lindorm寬表引擎小版本。如何升級,請參見升級小版本。