HBase详细的安装和使用方法
簡介
HBase的原型是Google的BigTable論文,受到了該論文思想的啟發,目前作為Hadoop的子項目來開發維護,用于支持結構化的數據存儲。
官方網站:http://hbase.apache.org
民間中文文檔:https://hbase.apachecn.org/#/
- 2006年Google發表BigTable白皮書
- 2006年開始開發HBase
- 2008年北京成功開奧運會,程序員默默地將HBase弄成了Hadoop的子項目
- 2010年HBase成為Apache頂級項目
- 現在很多公司基于HBase開發出了定制版,比如阿里云HBase
總結:
HBase是構建在HDFS之上的分布式、【面向列】的存儲系統,在需要實時讀寫、隨機訪問的超大規模數據集是,可以使用HBase。
為什么需要HBase
# 海量數據存儲一個表百億行 百萬列;(MySQL實戰最大值500萬行,30列) # 實時查詢1秒內查詢得到結果。HBase特點
# 1. 容量大HBase單表百億行,百萬列。 # 2. 面向列HBase存儲是面向列,可以再數據存在以后動態增加新列和數據,并支持列數據的獨立操作。 # 3. 多版本HBase每個數據,可以同時保存多個版本,按照時間去標記。 # 4. 稀疏性HBase每條數據的增刪,并不是要操作所有的列,的列可以動態增加,可以存在大量空白單元格,不會占用磁盤空間,這對于海量數據來講,非常重要。 # 5. 擴展性底層使用HDFS,存儲能力可以橫向擴展。 # 6. 高可靠性底層使用HDFS,擁有replication的數據高可靠性。 # 7. 高性能表數據達到一定規模,"自動分區",具備主鍵索引,緩存機制,使得HBase海量數據查詢能達到毫秒級。HBase和RDBMS對比
| 數據庫以**region**的形式存在 | 數據庫以Table的形式存在 |
| 使用**行鍵**(row key) | 支持主鍵PK |
| 使用行表示一條數據 | 一條數據用row代表 |
| 使用列 column、列族 column family | column代表列數據的含義 |
| 使用HBase shell命令操作數據 | 使用SQL操作數據 |
| 數據文件可以基于HDFS,是分布式文件系統, 可以任意擴展,數據總量取決于服務器數量 | 數據總量依賴于單體服務器的配置 |
| 不支持事務、不支持ACID | 支持事務和ACID |
| 不支持表連接 | 支持join表連接 |
HBase表邏輯結構
數據相關概念
# namespace 命名空間hbase管理表的結構,在HDFS中對應一個文件夾。 # table 表hbase管理數據的結構,在HDFS中對應一個文件。 # column family 列族表中數據的列,要屬于某個列族,所有的列的訪問格式(列族:列名) # rowkey 主鍵用來標記和檢索數據的主鍵key。 # cell 單元格由`row key+column family+column+version` 唯一確定的一條數據 # timestamp 時間戳時間戳,每個單元格可以保存多個值,每個值有對應的時間戳,每個cell中,不同版本的數據倒敘排序,排在最前面的是最新數據。HBase單機版安裝
下載
地址:http://archive.apache.org/dist/hbase/
準備
安裝
# 1. 安裝hbase 1. 解壓HBase[root@hadoop30 modules]# tar zxvf hbase-1.2.4-bin.tar.gz -C /opt/installs/ 2. 配置環境變量#JAVAexport JAVA_HOME=/opt/installs/jdk1.8export PATH=$PATH:$JAVA_HOME/bin# HADOOPexport HADOOP_HOME=/opt/installs/hadoop2.9.2/export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin# zookeeperexport PATH=$PATH:/opt/installs/zookeeper3.4.14/bin/# HBaseexport HBASE_HOME=/opt/installs/hbase-1.2.4/export PATH=$PATH:$HBASE_HOME/bin 3. 加載profile配置source /etc/profile # 2. 初始化配置文件 # 1 -------------------hbase-env.sh--------------------# 配置Java_home export JAVA_HOME=/opt/installs/jdk1.8# 注釋掉如下2行。 # export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m" # export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"# 禁用內置zookeeper export HBASE_MANAGES_ZK=false # 2. -------------------hbase-site.xml------------------------- <configuration><!-- hbase的入口,ns HaHadoop的虛擬命名空間 --><property><name>hbase.rootdir</name><value>hdfs://hadoop10:9000/hbase</value></property><!-- 使用偽分布式模式 --><property><name>hbase.cluster.distributed</name><value>true</value></property><!-- zookeeper集群地址,端口默認2181不需要指定 --><property><name>hbase.zookeeper.quorum</name><value>hadoop10</value></property></configuration> # -------------------配置regionservers(regionserver所在節點的ip) ------------------- hadoop10 # 3. 啟動hbase 啟動順序: 1. 啟動zookeeper 2. 啟動hdfs 3. 啟動hbase關閉順序: 1.關閉hbase 2.關閉hdfs 3.關閉zk # hbase啟動方式一 1. 啟動hbasestart-hbase.sh 2. 關閉hbasestop-hbase.sh# hbase啟動方式二 1. 啟動HMaster [root@hadoop10 installs]# hbase-daemon.sh start master # 關閉 [root@hadoop10 installs]# hbase-daemon.sh stop master 2. 啟動HRegionServer [root@hadoop10 installs]# hbase-daemon.sh start regionserver # 關閉 [root@hadoop10 installs]# hbase-daemon.sh stop master # 4. 驗證訪問 1. java進程查看 [root@hadoop10 installs]# jps 4688 NameNode 5618 HMaster 5730 HRegionServer 4819 DataNode 3509 QuorumPeerMain 6150 Jps 4984 SecondaryNameNode 2. HMaster WebUI查看 http://ip:16010 3. 進入客戶端 hbase shell hbase(main):001:0>HBase 命令
1. 客戶端進出命令
# 進入客戶端:./hbase shell # 退出客戶端命令:quit # 幫助help2. namespace操作
默認存在一個default的namespace #1. 查看namespacelist_namespace#2. 創建namespacecreate_namespace "命名空間名字"#3. 刪除namespacedrop_namespace "命令空間名字"3. 表操作
# 1. 查看所有表 hbase(main):024:0> list TABLE baizhins:t_person # namespace:表 t_user # default:表 default被省略了 2 row(s) in 0.1140 seconds# 2. 查看某個namespace下的所有表 hbase(main):027:0> list_namespace_tables "baizhins" TABLE t_person 1 row(s) in 0.3970 seconds# 3. 創建表 語法:create "namespace:表名","列族1","列族2" hbase(main):023:0> create "baizhins:t_person","info","edu" 0 row(s) in 9.9000 seconds# 4. 查看表結構 hbase(main):030:0> desc "baizhins:t_person" Table baizhins:t_person is ENABLED baizhins:t_person COLUMN FAMILIES DESCRIPTION {NAME => 'edu', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE',DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE =>'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'} {NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE' , DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE = > 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'} 2 row(s) in 1.6400 seconds# 5. 刪除表和禁用表 hbase(main):002:0> disable "namespace:表" 0 row(s) in 4.4790 secondshbase(main):002:0> drop "namespace:表" 0 row(s) in 4.4790 seconds4.數據增刪改查
# 1. 添加數據(每次只能添加一個列)put "namespace:表","rowkey","列族1:列名1","值"hbase(main):007:0> put 'baizhins:t_person','1001','info:name','zhangsan' 0 row(s) in 1.7250 seconds hbase(main):008:0> put 'baizhins:t_person','1001','info:age',20 0 row(s) in 0.0210 seconds hbase(main):009:0> put 'baizhins:t_person','1002','info:name','lisi' 0 row(s) in 0.0190 seconds hbase(main):010:0> put 'baizhins:t_person','1002','info:age',21 0 row(s) in 0.0620 seconds# 2. 根據rowkey查找數據get "namespace:表名","rowkey"hbase(main):015:0> get 'baizhins:t_person','1001' COLUMN CELLinfo:age timestamp=1598752891747, value=20info:name timestamp=1598752881461, value=zhangsan 2 row(s) in 0.1550 seconds# 3. 根據rowkey和列族查找數據get "namespace:表名","rowkey","列族:列"# 4. scan 查詢表中所有數據hbase(main):019:0> scan "baizhins:t_person"hbase(main):024:0> scan 'baizhins:t_person' ROW COLUMN+CELL1001 column=info:age, timestamp=1598753486814, value=201001 column=info:name, timestamp=1598753478658, value=zhangsan1002 column=info:age, timestamp=1598753520306, value=211002 column=info:name, timestamp=1598753509800, value=lisi 2 row(s) in 0.0410 seconds# 5. scan 查詢表中前2條數據hbase(main):022:0> scan "baizhins:t_person",{LIMIT=>2}# 6. 使用start row 和 end row 范圍查找hbase(main):029:0> scan "baizhins:t_person",{STARTROW=>"1001",STOPROW=>"1003"}hbase(main):032:0> scan 'baizhins:t_person',{STARTROW=>'1001',STOPROW=>'1003'} ROW COLUMN+CELL1001 column=info:age, timestamp=1598753486814, value=201001 column=info:name, timestamp=1598753478658, value=zhangsan1002 column=info:age, timestamp=1598753520306, value=211002 column=info:name, timestamp=1598753509800, value=lisi問題:HBase中的數據是按照Rowkey的ASCII字典順序進行全局排序的 假如有5個Rowkey:"012", "0", "123", "234", "3",按ASCII字典排序后的結果為:"0", "012", "123", "234", "3"。 Rowkey排序時會先比對兩個Rowkey的第一個字節,如果相同,然后會比對第二個字節,依次類推... 對比到第X個字節時,已經超出了其中一個Rowkey的長度,短的Rowkey排在前面。# 7. 使用start row和limit查找hbase(main):032:0> scan "baizhins:t_person",{STARTROW=>"1002",LIMIT=>2}hbase(main):033:0> scan 'baizhins:t_person',{STARTROW=>'1002',LIMIT=>2} ROW COLUMN+CELL1002 column=info:age, timestamp=1598753520306, value=211002 column=info:name, timestamp=1598753509800, value=lisi1003 column=info:name, timestamp=1598753628840, value=wangwu# 8. 修改數據(本質上是覆蓋)put "namespace:表","rowkey","列族:列名","值"# 9. 刪除數據(刪除某個cell)delete "namespace:表","rowkey","列族:列名"# 10. 刪除某個rowkey對應的數據deleteall "namespace:表","rowkey"# 11. 統計表中所有數據count "namespace:表"# 12. 清空表中的所有數據truncate "namespace:表"5. 多版本問題
# 1. 創建表 hbase(main):013:0> create "baizhins:user","info" # 2. 修改版本數 hbase(main):016:0> alter "baizhins:user",{NAME=>'info',VERSIONS=>2}# 表的列族的VERSIONS=>2表示的該列族的數據,要保存2個版本。如果put3次,則保留最新的2個版本。# 3. 同一個cell添加2次數據。 hbase(main):014:0> put "baizhi:user","10001","info:name","aaa" 0 row(s) in 0.2620 secondshbase(main):015:0> put "baizhi:user","10001","info:name","bb" 0 row(s) in 0.0290 seconds # 4. 查看多版本 hbase(main):017:0> get "baizhi:user","10001",{COLUMN=>'info:name',VERSIONS=>3} COLUMN CELLinfo:name timestamp=1586795010367, value=bbinfo:name timestamp=1586795004085, value=aaa 說明:1. 可以查看VERSIONS指定的版本數量的值。2. cell中多個版本的值,按照時間戳降序排序。3. 在get或者scan查詢數據,并不指定VERSIONS,默認讀取的cell中最新的1個的版本的值。HBase API
環境準備
-
依賴
<dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>1.2.4</version> </dependency><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-server</artifactId><version>1.2.4</version> </dependency> -
初始化配置
將hbase中的conf中的 hbase-site.xml放到resource配置文件目錄中。
conf.addResource("/hbase-site.xml")
-
windows配置ip映射
API介紹
| Configuration | 配置文件 | HBaseConfiguration.create(); |
| Connection | 連接,用來操作數據 | ConnectionFactory.createConnection(conf); |
| Admin | 客戶端,用來操作元數據 (namespace和table結構) | conn.getAdmin(); |
| NamespaceDescriptor | 命名空間相當于database | NamespaceDescriptor.create(“baizhins”).build(); |
| TableName | 表名 | TableName.valueOf(“baizhi:user”); |
| HTableDescriptor | 表 | new HTableDescriptor(tablename); |
| HColumnDescriptor | 列族 | new HColumnDescriptor(“info”); |
| Put | 添加數據 | new Put(Bytes.toBytes(“10001”)); |
| Delete | rowkey的刪除條件 | new Delete(Bytes.toBytes(“10001”)); |
| Get | scan多行查詢器 | new Get(Bytes.toBytes(“10019”)); |
| Scan | scan多行查詢器 | new Scan(); |
| Result | 查詢結果集(單條結果) | table.get(get); |
| ResultScanner | 查詢結果集(N條結果) | table.getScanner(scan); |
| Bytes | 類型轉化工具類,HBase中數據類型為字節, 所有類型存入后都變成字節,需要相互轉化。 |
HBase客戶端連接
注意:配置windows向linux的ip映射。
// 獲得客戶端 //1. 讀取配置文件 Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum","hadoop10"); BasicConfigurator.configure();//打印日志信息 //2. 建立連接 Connection conn = ConnectionFactory.createConnection(conf); //3. 獲得客戶端 admin = conn.getAdmin(); // 釋放資源 admin.close();常用API
1. 創建namespace
//1. 構建namespace信息。 NamespaceDescriptor baizhins = NamespaceDescriptor.create("baizhins").build(); //2. 創建namespace admin.createNamespace(baizhins);2. 表操作
操作表,使用admin
-
判斷表是否存在
//1. 創建表名 TableName tableName = TableName.valueOf("baizhins:person"); //2. 判斷表是否存在 boolean b = admin.tableExists(tableName); System.out.println(b?"存在":"不存在"); -
創建表
//1. 初始化表名 TableName person = TableName.valueOf("baizhins:person"); //2. 初始化列族信息 HColumnDescriptor info = new HColumnDescriptor("info"); HColumnDescriptor addr = new HColumnDescriptor("addr"); //3. 綁定表名,綁定列族 HTableDescriptor hTableDescriptor = new HTableDescriptor(person); hTableDescriptor.addFamily(info); hTableDescriptor.addFamily(addr); //4. 創建表 admin.createTable(hTableDescriptor);
3. 添加
操作數據使用conn
//1. 初始化要操作的表 Table table = conn.getTable(TableName.valueOf("baizhins:person")); //2. 創建 添加數據 Put put = new Put(Bytes.toBytes("1001"));//構造rowkey // Bytes是HBase提供的進行字節和java數據類型轉化的工具類 put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("name"),Bytes.toBytes("張三") ); put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("age"), Bytes.toBytes(18)); put.addColumn(Bytes.toBytes("addr"), Bytes.toBytes("zipCode"), Bytes.toBytes("45000")); //3. 將put數據添加。 table.put(put); //4. 釋放資源 table.close();4. 修改
//1. 初始化要操作的表 Table table = conn.getTable(TableName.valueOf("baizhins:person")); //2. 修改的本質就是添加,利用時間戳覆蓋舊的數據而已。 Put put = new Put(Bytes.toBytes("1001")); put.addColumn(Bytes.toBytes("addr"), Bytes.toBytes("zipCode"), Bytes.toBytes("45001")); //3. 添加到表中 table.put(put); //4. 關閉table table.close();5. 刪除
//1. 獲得要操作的表 Table table = conn.getTable(TableName.valueOf("baizhins:person")); //2. 創建要刪除的條件,以rowkey為條件 Delete delete = new Delete(Bytes.toBytes("1001"));//刪除某個列族 //delete.addFamily(Bytes.toBytes("cf2")); //刪除某個列 //delete.addColumn(Bytes.toBytes("cf1"),Bytes.toBytes("age"));//3. 執行刪除 table.delete(delete);6. 查詢
-
根據rowkey單條查詢。
//1. 獲得要操作的表 Table table = conn.getTable(TableName.valueOf("baizhins:person")); //2. 使用rowkey作為查詢條件 Get get = new Get(Bytes.toBytes("10019")); //3. 執行查詢 Result result = table.get(get); //4. 處理結果集:result.getValue; byte[] namebyte = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("name")); //下面代碼雷同。 byte[] agebyte = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("age")); byte[] zipbyte = result.getValue(Bytes.toBytes("addr"), Bytes.toBytes("zipCode")); //獲得rowkey byte[] rowbytes = result.getRow(); System.out.println(Bytes.toString(namebyte)); System.out.println(Bytes.toInt(agebyte)); System.out.println(Bytes.toString(zipbyte)); -
多條查詢
//1. 獲得要操作的表 Table table = conn.getTable(TableName.valueOf("baizhins:person")); //2. 創建scan掃描器,多行查詢 Scan scan = new Scan(); //3. 指定要投射的列族。 scan.addFamily(Bytes.toBytes("info")); scan.addFamily(Bytes.toBytes("addr")); //4. 設置起始和查詢條數 scan.setStartRow(Bytes.toBytes("1001")); scan.setFilter(new PageFilter(3)); //5. 執行查詢 ResultScanner result = table.getScanner(scan); //6. 處理結果集 for (Result res:result){byte[] namebyte = res.getValue(Bytes.toBytes("info"), Bytes.toBytes("name"));byte[] agebyte = res.getValue(Bytes.toBytes("info"), Bytes.toBytes("age"));byte[] zipCodebyte = res.getValue(Bytes.toBytes("addr"), Bytes.toBytes("zipCode"));String name = Bytes.toString(namebyte);int age = Bytes.toInt(agebyte);String zipcode = Bytes.toString(zipCodebyte);System.out.println(name+":"+age+":"+zipcode); } //7. 關閉table table.close();
-
范圍查詢
//1. 獲得要操作的表 Table table = conn.getTable(TableName.valueOf("baizhins:person")); //2. 創建scan掃描器,多行查詢 Scan scan = new Scan(); //3. 指定要投射的列族。 scan.addFamily(Bytes.toBytes("info")); scan.addFamily(Bytes.toBytes("addr")); //4. 設置起始和查詢條數 scan.setStartRow(Bytes.toBytes("1001")); scan.setStopRow(Bytes.toBytes("1003")); //5. 執行查詢 ResultScanner result = table.getScanner(scan); //6. 處理結果集 for (Result res:result){byte[] namebyte = res.getValue(Bytes.toBytes("info"), Bytes.toBytes("name"));byte[] agebyte = res.getValue(Bytes.toBytes("info"), Bytes.toBytes("age"));byte[] zipCodebyte = res.getValue(Bytes.toBytes("addr"), Bytes.toBytes("zipCode"));String name = Bytes.toString(namebyte);int age = Bytes.toInt(agebyte);String zipcode = Bytes.toString(zipCodebyte);System.out.println(name+":"+age+":"+zipcode); } //7. 關閉table table.close(); -
前綴查詢
Scan scan = new Scan(); Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new RegexStringComparator("a-")); scan.setFilter(filter);ResultScanner results = table.getScanner(scan);for (Result result : results) {byte[] nameByte = result.getValue(Bytes.toBytes("cf1"),Bytes.toBytes("name"));byte[] ageByte = result.getValue(Bytes.toBytes("cf1"),Bytes.toBytes("age"));System.out.println(Bytes.toString(nameByte) + "\t" + Bytes.toString(ageByte)); } table.close(); -
多版本查詢
Get get = new Get(Bytes.toBytes("1001")); //可以指定查詢某一個列 get.addColumn(Bytes.toBytes("cf1"),Bytes.toBytes("name")); get.setMaxVersions(5); Result result = table.get(get);Cell[] cells = result.rawCells(); for (Cell cell : cells) {System.out.println(Bytes.toString(CellUtil.cloneValue(cell))); }
HBase架構原理
讀寫數據操作原理
讀數據
寫數據
HBase底層原理
HBase架構體系
架構相關概念
HRegionServer
HRegionServer(和DataNode同一節點) 1. 存儲表數據部分 2. put delete get scan等針對數據的操作 3. 定時向Master報告自身節點的狀態 4. 管理表的數據的Table的數據HMaster
HMaster 1. Region Server狀態的管理 2. 表的管理:create drop alter 3. 實現HRegionServer的數據負載均衡,平衡HRegion的分布Zookeeper
Zookeeper 1. 解決HMaster的單點故障問題 2. 存放HMaster管理的HRegionServer的狀態信息,并通知HMaster 3. 存放HMaster管理的表的元數據信息表名、列名、key區間等。HRegion
HRegion表的橫向切片的物理表現,大表的子表,有(startkey endkey),多行數據。為了減小單表操作的大小,提高讀寫效率。Store
Store 1. 表的縱向切分的物理表現,按照列族作為切分。 2. 按照列族查詢,僅需要檢索一定范圍內的數據,減少全表掃描。HBase底層原理
Region Split 分區
-
分區原因
提高Region的負載和讀寫效率。
-
說明
Region一拆為二,并分布在不同的RegionServer上。
-
默認分區機制
Region中數據超過128M、512M、1152M… *Region數量2hbase.hregion.memstore.flush.size … 10G、10G
查看參數
hbase.hregion.memstore.flush.size=128M hbase.hregion.max.filesize=10G -
問題
默認分區容易導致數據傾斜,硬件資源無法利用。(數據熱點問題,大量的客戶端訪問,落在部分節點上,導致忙的忙死,閑的閑死。)
Region預分區
-
為什么
- 增加讀寫效率。(多個region分布在不同的RegionServer中,可以提高并發效率)
- 盡量保證每個Region中的數據量相當,防止數據傾斜。(合理利用計算資源)
-
分區的效果
每個Region維護一對StartKey和EndKey,限定維護輸入rowkey范圍。
添加數據時,將rowkey放入匹配的region中。
-
創建表時分區,手動指定
命令:
create "namespace:表","列族",SPLITS=>["100000","200000","300000","400000"]
效果:(http://ip:16030)訪問RegionServers
-
java代碼分區
MemStore Flush刷寫
-
說明
簡言:持久化,保護數據不丟失。
將RegionServer中內存中的數據Memstore,寫入到硬盤中。
-
圖
-
時機
- 當 region server 中 memstore 的總大小達到java_heapsize的閾值,默認值 0.4
- 到達自動刷寫的時間,默認 1 小時
- 單個Region中的數據文件大小超過128M。
-
手動flush
命令:flush "namespace:表名"
-
文件位置:
hdfs:ip:50070/hbase/data/baizhins/user2/faf64f7f6cfa6282c2a92864faa3909d
對應參數:hbase.regionserver.global.memstore.size
對應參數:hbase.regionserver.optionalcacheflushinterval
對應參數:hbase.hregion.memstore.flush.size
Store File Compaction 合并
-
目的
storefile小文件過多,查詢時,需要遍歷所有文件,效率低。
storefile中遍布過期數據,占用空間,且查詢效率低。
-
說明
簡言:為提高檢索效率,合并store。
-
圖
-
分類和時機
- minor compact(局部合并)
時機:發生頻率較高,不影響性能。
手動命令:compact "namespace:表名"
- major compact(全局合并)
時機:每7天執行一次:參數:hbase.hregion.majorcompaction
一般手動觸發。手動觸發命令:major_compact "namespace:表名"
rowkey設計
# rowkey對hbase有什么影響 1. 影響region數據分布,負載均衡,不好rowkey設計,會導致數據傾斜,導致數據熱點。希望:一段時間內,新增數據(訪問請求),盡可能均勻分布到不同的HRegion。 2. 唯一標記1條數據希望:rowkey唯一性。 3. 為查詢業務服務。希望:rowkey設計必須滿足查詢業務需求為什么HBase數據讀取速度快BlockCache
# 1 MemstoreRegion內存中特點:(內存)(數據最新的)(有序) # 2 BlockCache(LRU)HBase緩存中。緩存策略:LRU(數據淘汰機制),最近最少使用原則,保留最近最新使用多的數據。 # 3:磁盤storeFile(每個小file中rowkey是有序的) LSM磁盤的檢索速度慢是因為尋道。磁盤合并大storeFile(減少file數量,可以提高磁盤檢索效率)1. storefile文件數量少,減少遍歷。2. 文件內以及文件在磁盤中,rowkey有序,代碼檢索,磁盤尋道大大節省時間。HBase架構完整版
注意
false
總結
以上是生活随笔為你收集整理的HBase详细的安装和使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ThinkPHP6项目基操(15.实战部
- 下一篇: pythonjson序列化_Python