Notes
Search…
⌃K

HBase

1. 简介

  • 基于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 ä¸€èˆ¬å¯¹å¤§é‡æ•°æ®è¿›è¡Œæ±‡æ€»å’Œåˆ†æžï¼Œæ›´é€‚åˆåˆ—å¼å­˜å‚¨ã€‚

2. æ•°æ®æ¨¡åž‹

​Google Bigtable Paper中对Bigtable的定义:
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"
表格中的空白å•å…ƒä¸ä¼šå ç”¨ç‰©ç†å­˜å‚¨ç©ºé—´ï¼Œåªæ˜¯æ¦‚念上存在

3. 安装

hbase有Standaloneã€Pseudo-Distributed(伪分布å¼ï¼‰ã€Fully Distributed(分布å¼ï¼‰ä¸‰ç§éƒ¨ç½²æ–¹å¼ï¼›

3.1. Standalone安装

Standalone模å¼åœ¨å•节点è¿è¡Œï¼Œä¸”所有的daemon(HMaster, HRegionServer, and ZooKeeper)都在一个 JVM 进程中è¿è¡Œï¼›
  • ​下载 HBase,建议下载stable版本;
  • 解压并移动目录;
$ 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
quitå¯ä»¥é€€å‡ºshellï¼›
$ bin/hbase shell
  • 关闭hbaseæœåŠ¡
$ bin/stop-hbase.sh

3.2. 伪分布å¼å®‰è£…

ä¼ªåˆ†å¸ƒå¼æ¨¡å¼ä¹Ÿæ˜¯åœ¨å•个节点è¿è¡Œï¼Œä½†æ˜¯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
​webUI​

3.3. 分布å¼å®‰è£…

åˆ†å¸ƒå¼æ¨¡å¼åœ¨å¤šä¸ªèŠ‚ç‚¹ä¸­è¿è¡Œï¼Œé›†ç¾¤æœ‰å¤šä¸ªèŠ‚ç‚¹ï¼Œæ¯ä¸ªèŠ‚ç‚¹è¿è¡Œä¸€ä¸ªæˆ–多个HBaseçš„daemon,包括主ã€å‰¯Master节点,多个Zookeeper节点,多个RegionServer节点;

4. æ“作

HBase Shell是一个Ruby脚本,å¯ä»¥æ“作HBaseæ•°æ®ï¼›
HBase是java写的,所以æä¾›äº†java API,是访问HBase最快的方å¼ï¼›

4.1. 连接

连接
$ 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();
}
}

4.2 General Command

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

4.3 Table Operation

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"));

4.4 Data Operation

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'

4.5 过滤器

HBase主è¦çš„æ•°æ®è¯»å–函数是get()å’Œscan()ï¼Œå®ƒä»¬éƒ½æ˜¯æŒ‡å®šè¡Œå¥æ¥è®¿é—®æ•°æ®ã€‚å¯ä»¥åœ¨æŸ¥è¯¢ä¸­æ·»åŠ æ›´å¤šçš„é™åˆ¶æ¡ä»¶ï¼ˆè¿‡æ»¤å™¨ï¼‰æ¥å‡å°‘查询得到的数æ®é‡ã€‚
过滤器在客户端创建,通过RPCä¼ é€åˆ°æœåŠ¡ç«¯ï¼Œç„¶åŽåœ¨æœåŠ¡ç«¯æ‰§è¡Œè¿‡æ»¤æ“作。
比较过滤器ã€åˆ—æ—过滤器ã€åˆ—å过滤器ã€å€¼è¿‡æ»¤å™¨ã€æ—¶é—´æˆ³è¿‡æ»¤å™¨ã€è‡ªå®šä¹‰è¿‡æ»¤å™¨ã€‚。。

4.6 å处ç†å™¨

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

4.7 Phoenix

​phoenix把SQL语å¥ç¼–译æˆHBase API,æä¾›äºŒçº§ç´¢å¼•等功能。

5. æž¶æž„

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

5.1 hbase:meta

  • 所有的regionä¿¡æ¯ï¼›
  • ä¿å­˜åœ¨Zookeeper中;

5.2 HMaster

  • 分é…Region:1ã€å¯åŠ¨æ—¶ï¼›2ã€RegionServer失效时;3ã€Region切分时;
  • 监控集群中的所有RegionServer,实现其负载å‡è¡¡ï¼›
  • DDL:表格的创建ã€åˆ é™¤å’Œæ›´æ–°-列æ—的更新;
  • HDFS上的垃圾文件回收;

5.3 RegionServer

HRegionServer是HBase中最主è¦çš„组件,负责tableæ•°æ®çš„实际读写,管ç†Region。
在分布å¼é›†ç¾¤ä¸­ï¼ŒHRegionServer一般跟DataNode在åŒä¸€ä¸ªèŠ‚ç‚¹ä¸Šï¼Œç›®çš„æ˜¯å®žçŽ°æ•°æ®çš„æœ¬åœ°æ€§ï¼Œæé«˜è¯»å†™æ•ˆçŽ‡ã€‚
  • å“应client的读写请求,进行I/Oæ“作(直接绕过HMaster);
  • 与HDFS交互,管ç†tableæ•°æ®ï¼›
  • 当Region的大å°åˆ°è¾¾é˜€å€¼æ—¶åˆ‡åˆ†Regionï¼›

5.3.1 功能

  • 定期å‘Master汇报;
  • 管ç†Region,执行Flushã€Compactionã€Openã€Closeã€Loadç­‰æ“作;
  • 管ç†WALï¼›
  • æ‰§è¡Œæ•°æ®æ’å…¥ã€æ›´æ–°å’Œåˆ é™¤æ“作;

5.3.2 组件

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 æµç¨‹

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到内存;

5.4 Zookeeper

  • 存储hbase:metaï¼Œå³æ‰€æœ‰Regionçš„ä½ç½®ä¿¡æ¯ï¼›
  • 存储HBase中表格的元数æ®ä¿¡æ¯ï¼›
  • ZooKeeper集群本身使用一致性åè®®(PAXOSåè®®)ä¿è¯æ¯ä¸ªèŠ‚ç‚¹çŠ¶æ€çš„一致性;
  • ä¿è¯é›†ç¾¤ä¸­æœ‰ä¸”åªæœ‰ä¸€ä¸ªHMaster为Activeï¼›

6. FAQ

HBase与Hive的对比

​
HBase
Hive
类型
åˆ—å¼æ•°æ®åº“
æ•°æ®ä»“库
内部机制
æ•°æ®åº“引擎
MapReduce
增删改查
都支æŒ
åªæ”¯æŒå¯¼å…¥å’ŒæŸ¥è¯¢
Schema
åªéœ€è¦é¢„先定义列æ—,ä¸éœ€è¦å…·ä½“到列列å¯ä»¥åЍæ€ä¿®æ”¹
需è¦é¢„先定义表格
应用场景
实时
离线处ç†
特点
以K-Vå½¢å¼å­˜å‚¨
ç±»SQL

HRegionServer宕机如何处ç†

  • ZooKeeper会监控HRegionServer的上下线情况,当ZKå‘现æŸä¸ªHRegionServer宕机之åŽä¼šé€šçŸ¥HMasterï¼›
  • 该HRegionServerä¼šåœæ­¢å¯¹å¤–æä¾›æœåŠ¡ï¼Œå°±æ˜¯å®ƒæ‰€è´Ÿè´£çš„regionæš‚æ—¶åœæ­¢å¯¹å¤–æä¾›æœåŠ¡ï¼›
  • HMaster会将该HRegionServer所负责的region转移到其他HRegionServer上,并且会对HRegionServer上存在memstore中还未æŒä¹…化到ç£ç›˜ä¸­çš„æ•°æ®è¿›è¡Œæ¢å¤ï¼›
  • 这个æ¢å¤çš„工作是由WAL replayæ¥å®Œæˆï¼›

总结

å‚考文献