HBase
- 基于Google Bigtable的开æºå®žçŽ°ï¼›
- 分布å¼ã€å¯ä¼¸ç¼©ï¼›
- 列å¼å‚¨å˜ï¼ˆæœ‰äº‰è®®ï¼Œæˆ‘è®¤ä¸ºä¸æ˜¯ï¼Œè§ä¸‹æ–‡ï¼‰ï¼›
- 基于HDFS;
- 䏿”¯æŒRDBMS的一些高级特性,如事务机制,第二索引,高级查询è¯è¨€ï¼›
- 强读写一致性;
- 自动切分数æ®ï¼›
- RegionServer自动失效备æ´ï¼›
- æ•°å亿行 * 数百万列 * æ•°åƒä¸ªç‰ˆæœ¬ = TB或PB级的储å˜
关于 Bigtable是å¦ä¸ºåˆ—å¼å˜å‚¨æœ‰ä¸€å®šäº‰è®®ï¼Œæˆ‘è®¤ä¸ºä¸æ˜¯ã€‚
维基百科定义:
- åˆ—å¼æ•°æ®åº“是以列相关å˜å‚¨æž¶æž„进行数æ®å˜å‚¨çš„æ•°æ®åº“,主è¦é€‚åˆäºŽæ‰¹é‡æ•°æ®å¤„ç†ï¼ˆOLAPï¼‰å’Œå³æ—¶æŸ¥è¯¢ã€‚
- ç›¸å¯¹åº”çš„æ˜¯è¡Œå¼æ•°æ®åº“,数æ®ä»¥è¡Œç›¸å…³çš„å˜å‚¨ä½“系架构进行空间分é…,主è¦é€‚åˆäºŽå°æ‰¹é‡çš„æ•°æ®å¤„ç†ï¼Œå¸¸ç”¨äºŽè”机事务型数æ®å¤„ç†ï¼ˆOLTP)。
HBase 有这么一个介ç»ï¼šHBase is a column-oriented database management system that runs on top of Hadoop Distributed File System (HDFS)。由于翻译ä¸å½“,所以被误认为 HBase 是列å¼å˜å‚¨æ•°æ®åº“。应当翻译为 HBase 是è¿è¡Œåœ¨ HDFS 之上的é¢å‘列的数æ®åº“管ç†ç³»ç»Ÿ
HBase 底层å˜å‚¨çš„æ•°æ®ç»“构为 LSM(Log-Structured Merge-Tree),å³ä¸æ˜¯åˆ—å¼å˜å‚¨ï¼Œä¹Ÿä¸æ˜¯è¡Œå¼å˜å‚¨ï¼Œè€Œæ˜¯é¢å‘列æ—的。如下图:

那么,HBase 底层å˜å‚¨å¤§è‡´å¦‚下:

- ä¸åŒçš„列æ—å˜åœ¨ä¸åŒçš„æ–‡ä»¶ä¸ã€‚
- æ•´ä¸ªæ•°æ®æ˜¯æŒ‰ç…§ Rowkey 进行å—典排åºçš„。
- æ¯ä¸€åˆ—æ•°æ®åœ¨åº•层 HFile 䏿˜¯ä»¥ KV å½¢å¼å˜å‚¨çš„。
- 相åŒçš„一行数æ®ä¸ï¼Œå¦‚果列æ—ä¹Ÿä¸€æ ·ï¼Œé‚£ä¹ˆè¿™äº›æ•°æ®æ˜¯é¡ºåºæ”¾åœ¨ä¸€èµ·çš„。
- ä¸åŒè¡Œç›¸åŒçš„åˆ—æ—æ•°æ®æ˜¯ç›¸é‚»å˜å‚¨çš„,åŒä¸€è¡Œä¸åŒåˆ—æ—çš„æ•°æ®æ˜¯å˜å‚¨åœ¨ä¸åŒä½ç½®çš„。
列å¼å˜å‚¨çš„优点:
- 更容易压缩:列å¼å˜å‚¨æŠŠä¸€åˆ—çš„æ•°æ®æ”¾åœ¨ä¸€èµ·å˜å‚¨ï¼ŒåŒä¸€åˆ—的数æ®å¾€å¾€ç±»åž‹æ˜¯ä¸€æ ·çš„,更容易压缩。
- æ›´é€‚åˆ OLAP:OLTP 通常对数æ®è®°å½•è¿›è¡Œå¢žåˆ æŸ¥æ”¹ï¼Œæ‰€ä»¥è¡Œå¼å˜å‚¨æ›´é€‚åˆï¼›ä½†æ˜¯ OLAP ä¸€èˆ¬å¯¹å¤§é‡æ•°æ®è¿›è¡Œæ±‡æ€»å’Œåˆ†æžï¼Œæ›´é€‚åˆåˆ—å¼å˜å‚¨ã€‚
A Bigtable is a sparse, distributed, persistent multidimensional sorted map.The map is indexed by a row key, column key, and a timestamp; each value in the map is an uninterpreted array of bytes.
HBaseçš„æ•°æ®æ¨¡åž‹éžå¸¸ç›¸ä¼¼ï¼š

- 表(table)ï¼šä¸€å¼ è¡¨æœ‰å¤šè¡Œã€‚
- 行(row):一行包括一个行å¥(row key),多个列æ—(column family)ï¼Œä¸€å¼ è¡¨ä¸æŒ‰ç…§è¡Œå¥æŽ’åºï¼Œä»¥è¡Œå¥ä¸ºç´¢å¼•。如,row1。
- 列æ—(column family):æ¯ä¸ªåˆ—æ—包å«å¤šä¸ªåˆ—(column),需è¦åœ¨å»ºè¡¨æ—¶å®šä¹‰å¥½ã€‚如dataã€meta。
- 列(column):æ¯ä¸ªåˆ—都属于æŸä¸€ä¸ªåˆ—æ—,以 列æ—å:列å(column qualifier) 表示。如 meta:minetype。
- 版本(version):默认是时间戳。
- å•å…ƒæ ¼(cell):由[行,列,版本å·]æ¥å”¯ä¸€ç¡®å®šã€‚
{
// ...
"row1" : {
"family1" : {
"column1" : {
timestamp2 : "value1",
timestamp3 : "value2"
},
"column2" : {timestamp : "value3"}
},
"family2" : { ... }
},
"row2" : {
"family3" : { ... }
},
// ...
}
官方例å:
Row Key | Time Stamp | Family contents | Family anchor | Family people |
"com.cnn.www" | t9 | ​ | anchor:cnnsi.com = "CNN" | ​ |
"com.cnn.www" | t8 | ​ | anchor:my.look.ca = "CNN.com" | ​ |
"com.cnn.www" | t6 | contents:html = "<html>… | ​ | ​ |
"com.cnn.www" | t5 | contents:html = "<html>… | ​ | ​ |
"com.cnn.www" | t3 | contents:html = "<html>… | ​ | ​ |
"com.example.www" | t5 | contents:html = "<html>… | ​ | people:author: "John Doe" |
è¡¨æ ¼ä¸çš„空白å•å…ƒä¸ä¼šå 用物ç†å˜å‚¨ç©ºé—´ï¼Œåªæ˜¯æ¦‚念上å˜åœ¨
hbase有Standaloneã€Pseudo-Distributed(伪分布å¼ï¼‰ã€Fully Distributed(分布å¼ï¼‰ä¸‰ç§éƒ¨ç½²æ–¹å¼ï¼›
Standalone模å¼åœ¨å•节点è¿è¡Œï¼Œä¸”所有的daemon(HMaster, HRegionServer, and ZooKeeper)都在一个 JVM 进程ä¸è¿è¡Œï¼›
- 解压并移动目录;
$ tar -xzvf hbase-1.2.6-bin.tar.gz
$ mv hbase-1.2.6 /usr/local/hbase
- é…ç½®JAVA_HOME环境å˜é‡
$ cd /usr/local/hbase
$ vi conf/hbase-env.sh
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
- é…ç½®hbase-site.xml
é…置属性 hbase.rootdir,file表示使用本地文件系统作为hbase的数æ®å‚¨å˜ï¼ŒæŒ‡å®šhdfs://namenode.example.org:8020/hbaseå¯ä»¥æŒ‡å®šHDFS作为储å˜ä»‹è´¨ï¼›
$ vi conf/hbase-site.xml
​
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///usr/local/hbase/data</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/hbase/zookeeper</value>
</property>
</configuration>
- å¯åЍhbase
$ bin/start-hbase.sh
- 连接hbase
quitå¯ä»¥é€€å‡ºshellï¼›
$ bin/hbase shell
- å…³é—hbaseæœåŠ¡
$ bin/stop-hbase.sh
ä¼ªåˆ†å¸ƒå¼æ¨¡å¼ä¹Ÿæ˜¯åœ¨å•个节点è¿è¡Œï¼Œä½†æ˜¯daemon(HMaster, HRegionServer, and ZooKeeper)分别在ä¸åŒçš„jvm进程ä¸ï¼›
å¯åŠ¨å¤šä¸ªmaster
bin/local-master-backup.sh start 2 3 4
å¯åŠ¨å¤šä¸ªregionserver
bin/local-regionservers.sh start 2 3 4
查看端å£å 用
lsof -nP -iTCP -sTCP:LISTEN
åˆ†å¸ƒå¼æ¨¡å¼åœ¨å¤šä¸ªèŠ‚ç‚¹ä¸è¿è¡Œï¼Œé›†ç¾¤æœ‰å¤šä¸ªèŠ‚ç‚¹ï¼Œæ¯ä¸ªèŠ‚ç‚¹è¿è¡Œä¸€ä¸ªæˆ–多个HBaseçš„daemon,包括主ã€å‰¯Master节点,多个Zookeeper节点,多个RegionServer节点;
HBase Shell是一个Ruby脚本,å¯ä»¥æ“作HBaseæ•°æ®ï¼›
HBase是java写的,所以æä¾›äº†java API,是访问HBase最快的方å¼ï¼›
连接
$ cd /usr/local/hbase
​
$ bin/hbase shell
​
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hbase/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.2.6, rUnknown, Mon May 29 02:25:32 CDT 2017
​
hbase(main):001:0>
退出
hbase(main):001:0> exit
java API
Configuration conf = HBaseConfiguration.create();
conf.set(HConstants.ZOOKEEPER_QUORUM, "172.16.233.78");
try {
Connection conn = ConnectionFactory.createConnection(conf);
Admin admin = conn.getAdmin();
}finally {
if (conn!=null && !conn.isClosed()) {
conn.close();
}
}
status
hbase(main):002:0> status
1 active master, 0 backup masters, 1 servers, 0 dead, 3.0000 average load
version
hbase(main):005:0> version
1.2.6, rUnknown, Mon May 29 02:25:32 CDT 2017
table_help
hbase(main):007:0> table_help
whoami
hbase(main):008:0> whoami
zhaoyun (auth:SIMPLE)
groups: staff, everyone, localaccounts, _appserverusr, admin, _appserveradm, _lpadmin, com.apple.sharepoint.group.1, _appstore, _lpoperator, _developer, com.apple.access_ftp, com.apple.access_screensharing, com.apple.access_ssh-disabled
Create Table
创建一个å为element的表,å«é‡ä¸¤ä¸ªåˆ—æ—,分别为baseå’Œextï¼›
hbase(main):021:0> create 'element' , 'base', 'ext'
java API
HTableDescriptor tableDescriptor = new HTableDescriptor(TableName.valueOf("element"));
tableDescriptor.addFamily(new HColumnDescriptor("base"));
tableDescriptor.addFamily(new HColumnDescriptor("ext"));
admin.createTable(tableDescriptor);
List Table
hbase(main):021:0> list
java API
HTableDescriptor[] tables = admin.listTables();
Disable Table
è‹¥è¦åˆ 除或者修改一个表,先需è¦disable它;
hbase(main):021:0> disable 'element'
​
hbase(main):030:0> is_disabled 'element'
​
hbase(main):032:0> disable_all 'e.*'
java API
if (!admin.isTableDisabled(TableName.valueOf("element"))) {
admin.disableTable(TableName.valueOf("element"));
}
Enable Table
hbase(main):021:0> enable 'element'
​
hbase(main):021:0> is_enabled 'element'
java API
if (!admin.isTableEnabled(TableName.valueOf("element"))) {
admin.enableTable(TableName.valueOf("element"));
}
Describe Table
hbase(main):021:0> describe 'element'
​
Table element is ENABLED
element
COLUMN FAMILIES DESCRIPTION
{NAME => 'base', 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 => 'ext', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', B
LOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
Alter Table
# 把element表的base列æ—çš„VERSIONS属性设为5
hbase(main):021:0> alter 'element', NAME => 'base', VERSIONS => 5
​
hbase(main):021:0> alter 'element' , READONLY
​
hbase(main):021:0> alter 'element', METHOD => 'table_att_unset',NAME => 'MAX_FILESIZE'
​
# åˆ é™¤åˆ—æ—ext
hbase(main):021:0> alter 'element', 'delete' => 'ext'
java API
admin.addColumn(TableName.valueOf("element"), new HColumnDescriptor("newColFamily"));
admin.deleteColumn(TableName.valueOf("element"), "newColFamily".getBytes());
Exists
hbase(main):021:0> exists 'element'
​
Table element does exist
java API
boolean exists = admin.tableExists(TableName.valueOf("element"));
Drop Table
åœ¨åˆ é™¤ä¸€ä¸ªè¡¨æ—¶ï¼Œå…ˆå¿…é¡»disable它;
hbase(main):021:0> drop 'element'
​
hbase(main):021:0> drop_all 'ele.*'
java API
if (!admin.isTableDisabled(TableName.valueOf("element"))) {
admin.disableTable(TableName.valueOf("element"));
}
admin.deleteTable(TableName.valueOf("element"));
Scan
hbase(main):021:0> scan 'element'
Create Data
å‘element表的第1行的baseåˆ—æ—æ·»åŠ elementId列,值设为1234ï¼›
hbase(main):021:0> put 'element', '1', 'base:elementId','1234'
java API
Table table = conn.getTable(TableName.valueOf("element"));
Put put = new Put("1".getBytes());
put.addColumn("base".getBytes(), "elementId".getBytes(), "1234".getBytes());
table.put(put);
table.close();
Update Data
把element表的第1行的base列æ—çš„elementId列的值更新为12345ï¼›
hbase(main):021:0> put 'element', '1', 'base:elementId','12345'
java API
Table table = conn.getTable(TableName.valueOf("element"));
Put put = new Put("1".getBytes());
put.addColumn("base".getBytes(), "elementId".getBytes(), "12345".getBytes());
table.put(put);
table.close();
Read Data
hbase(main):021:0> get 'element' , '1'
​
COLUMN CELL
base:elementId timestamp=1501833865714, value=12345
java API
Table table = conn.getTable(TableName.valueOf("element"));
Get get = new Get("1".getBytes());
Result result = table.get(get);
table.close();
Delete Data
# delete a cell
hbase(main):021:0> delete 'element', '1','base:elementId'
​
# delete a row
hbase(main):021:0> delete 'element', '1'
java API
Table table = conn.getTable(TableName.valueOf("element"));
Delete delete = new Delete("1".getBytes());
delete.addColumn("base".getBytes(), "elementId".getBytes());
table.delete(delete);
table.close();
Count
hbase(main):021:0> count 'element'
Truncate
hbase(main):021:0> truncate 'element'
HBase主è¦çš„æ•°æ®è¯»å–函数是get()å’Œscan()ï¼Œå®ƒä»¬éƒ½æ˜¯æŒ‡å®šè¡Œå¥æ¥è®¿é—®æ•°æ®ã€‚å¯ä»¥åœ¨æŸ¥è¯¢ä¸æ·»åŠ æ›´å¤šçš„é™åˆ¶æ¡ä»¶ï¼ˆè¿‡æ»¤å™¨ï¼‰æ¥å‡å°‘查询得到的数æ®é‡ã€‚

过滤器在客户端创建,通过RPCä¼ é€åˆ°æœåŠ¡ç«¯ï¼Œç„¶åŽåœ¨æœåŠ¡ç«¯æ‰§è¡Œè¿‡æ»¤æ“作。
比较过滤器ã€åˆ—æ—过滤器ã€åˆ—å过滤器ã€å€¼è¿‡æ»¤å™¨ã€æ—¶é—´æˆ³è¿‡æ»¤å™¨ã€è‡ªå®šä¹‰è¿‡æ»¤å™¨ã€‚。。

coprocessor,å¯ä»¥è®©ç”¨æˆ·æŠŠä¸€éƒ¨åˆ†è®¡ç®—移动到数æ®å˜æ”¾ç«¯ï¼ˆRegionServer)。
æ•°æ®çš„å¤„ç†æµç¨‹ç›´æŽ¥æ”¾åˆ°æœåŠ¡å™¨ä¸Šæ‰§è¡Œï¼Œç„¶åŽè¿”回一个å°çš„处ç†ç»“果集。类似于一个MapReduce框架,将工作分å‘到整个集群。
å处ç†å™¨åœ¨æ¯ä¸ªregion䏿Œ‰ç…§é¡ºåºæ‰§è¡Œã€‚


- HMaster:负责监控集群ã€ç®¡ç†RegionServers的负责å‡è¡¡ç‰ï¼Œå¯ä»¥ç”¨ä¸»-备形å¼éƒ¨ç½²å¤šä¸ªMaster。
- HRegionServer:负责å“应用户的I/Oæ“作请求,客户端对HBaseè¯»å†™æ•°æ®æ˜¯ä¸ŽRegionServer交互。
- Zookeeper:负责选举Master的主节点;æœåŠ¡æ³¨å†Œï¼›ä¿å˜RegionServers的状æ€ç‰ã€‚å¯ä»¥ 使用系统内建的zookeeper,也å¯ä»¥ä½¿ç”¨ç‹¬ç«‹çš„zookeeper。
- HDFS:真æ£çš„æ•°æ®æŒä¹…层,并éžå¿…须是HDFS文件系统,但æé…HDFS是最佳选择,也是目å‰åº”用最广泛的选择。
- 所有的regionä¿¡æ¯ï¼›
- ä¿å˜åœ¨Zookeeperä¸ï¼›

- 分é…Region:1ã€å¯åŠ¨æ—¶ï¼›2ã€RegionServer失效时;3ã€Region切分时;
- 监控集群ä¸çš„æ‰€æœ‰RegionServer,实现其负载å‡è¡¡ï¼›
- DDLï¼šè¡¨æ ¼çš„åˆ›å»ºã€åˆ 除和更新-列æ—的更新;
- HDFS上的垃圾文件回收;
HRegionServer是HBase䏿œ€ä¸»è¦çš„组件,负责tableæ•°æ®çš„实际读写,管ç†Region。
在分布å¼é›†ç¾¤ä¸ï¼ŒHRegionServer一般跟DataNode在åŒä¸€ä¸ªèŠ‚ç‚¹ä¸Šï¼Œç›®çš„æ˜¯å®žçŽ°æ•°æ®çš„æœ¬åœ°æ€§ï¼Œæé«˜è¯»å†™ 效率。
- å“应client的读写请求,进行I/Oæ“作(直接绕过HMaster);
- 与HDFS交互,管ç†tableæ•°æ®ï¼›
- 当Region的大å°åˆ°è¾¾é˜€å€¼æ—¶åˆ‡åˆ†Regionï¼›


- 定期å‘Master汇报;
- 管ç†Region,执行Flushã€Compactionã€Openã€Closeã€Loadç‰æ“作;
- 管ç†WALï¼›
- æ‰§è¡Œæ•°æ®æ’å…¥ã€æ›´æ–°å’Œåˆ 除æ“作;
5.3.2.1 WAL: Write Ahead Log
- 记录RegionServer上的所有编辑信æ¯ï¼ˆPuts/Deletesæ“作,属于哪个Region),在写到memstore之å‰ï¼›
- 用于RegionServer失效时,通过Replayæ¢å¤RegionServer上memstoreä¸å°šæœªæŒä¹…化的数æ®ï¼›
5.3.2.2 MemStore
- 是Regionä¸çš„é‡è¦ç»„æˆéƒ¨åˆ†ï¼›
- 写缓å˜ï¼›
- æ•°æ®å…ˆå†™åˆ°MemStore,flush触å‘åŽåˆ·æ–°åˆ°ç£ç›˜ï¼›
- KeyValue的形å¼ï¼›
5.3.2.3 BlockCache
- 读缓å˜ï¼›
- æ¯ä¸ªRegionServerä¸åªæœ‰ä¸€ä¸ªBlockCache实例;
5.3.2.4 Region
- HBaseè¡¨æ ¼æ ¹æ®row key 划分æˆâ€œRegionsâ€ï¼›
- 一个Region包å«è¯¥è¡¨æ ¼ä¸ä»Žèµ·å§‹key到结æŸkey之间的所有行;
- 当Region的大å°è¾¾åˆ°æŒ‡å®šçš„阀值时,RegionServer会执行Region的切分,分裂执行完毕åŽï¼Œä¼šå°†åRegionæ·»åŠ åˆ°hbase:meta并且汇报给Masterï¼›
å¯ä»¥é¢„建分区以å‡å°‘Region切分

5.3.3.1 åˆå§‹åŒ–

- Client从ZooKeeperä¸è¯»å–hbase:meta表;
- Clinet从hbase:metaèŽ·å–æƒ³è¦æ“作的Regionçš„ä½ç½®ä¿¡æ¯ï¼Œç¼“å˜ï¼›
- Clientå‘ç›®æ ‡Region所在的RegionServerå‘é€è¯·æ±‚,执行æ“作;
- 当一个regionå› ä¸ºMaster执行负载å‡è¡¡æˆ–者RegionServer挂掉而执行的é‡å®šä½ä¹‹åŽï¼ŒClient需è¦é‡æ–°è¯»å–hbase:meta进行缓å˜ï¼›
5.3.3.2 写

- Clientæäº¤ä¸€ä¸ªPut请求到RegionServer,数æ®é¦–先会写到WALä¸ï¼›
- 当数æ®å†™åˆ°WAL之åŽï¼Œæ•°æ®ä¼šå†™åˆ°MemStoreä¸ï¼Œç‰å¾…刷新到ç£ç›˜ä¸ï¼›
- æ•°æ®å†™åˆ°MemStore完æˆä¹‹åŽï¼ŒRS会给Clientå‘é€ç¡®è®¤ä¿¡æ¯ï¼›
5.3.3.3 读

- 首先扫æBlockCache(读缓å˜ï¼‰ä¸å¯»æ‰¾row cellï¼›
- 若没有,扫æMemStore(写缓å˜ï¼‰ä¸å¯»æ‰¾row cellï¼›
- 若没有,HBase会使用BlockCache索引和bloom filtersæ¥åŠ è½½é‚£åŒ…å«ç›®æ ‡row cellsçš„HFile到内å˜ï¼›
- å˜å‚¨hbase:metaï¼Œå³æ‰€æœ‰Regionçš„ä½ç½®ä¿¡æ¯ï¼›
- å˜å‚¨HBaseä¸è¡¨æ ¼çš„元数æ®ä¿¡æ¯ï¼›
- ZooKeeper集群本身使用一致性åè®®(PAXOSåè®®)ä¿è¯æ¯ä¸ªèŠ‚ç‚¹çŠ¶æ€çš„一致性;
- ä¿è¯é›†ç¾¤ä¸æœ‰ä¸”åªæœ‰ä¸€ä¸ªHMaster为Activeï¼›

​ | HBase | Hive |
类型 | åˆ—å¼æ•°æ®åº“ | æ•°æ®ä»“库 |
内部机制 | æ•°æ®åº“引擎 | MapReduce |
å¢žåˆ æ”¹æŸ¥ | éƒ½æ”¯æŒ | åªæ”¯æŒå¯¼å…¥å’ŒæŸ¥è¯¢ |
Schema | åªéœ€è¦é¢„先定义列æ—,ä¸éœ€è¦å…·ä½“到列列å¯ä»¥åЍæ€ä¿®æ”¹ | 需è¦é¢„å…ˆå®šä¹‰è¡¨æ ¼ |
应用场景 | 实时 | ç¦»çº¿å¤„ç† |
特点 | 以K-Vå½¢å¼å˜å‚¨ | ç±»SQL |
- ZooKeeper会监控HRegionServer的上下线情况,当ZKå‘现æŸä¸ªHRegionServer宕机之åŽä¼šé€šçŸ¥HMasterï¼›
- 该HRegionServerä¼šåœæ¢å¯¹å¤–æä¾›æœåŠ¡ï¼Œå°±æ˜¯å®ƒæ‰€è´Ÿè´£çš„regionæš‚æ—¶åœæ¢å¯¹å¤–æä¾›æœåŠ¡ï¼›
- HMaster会将该HRegionServer所负责的region转移到其他HRegionServer上,并且会对HRegionServer上å˜åœ¨memstoreä¸è¿˜æœªæŒä¹…化到ç£ç›˜ä¸çš„æ•°æ®è¿›è¡Œæ¢å¤ï¼›
- 这个æ¢å¤çš„工作是由WAL replayæ¥å®Œæˆï¼›

Last modified 3yr ago