赞
踩
分布式、面向列开源数据库
Big Table开源实现
适合非结构化数据的存储
PB级别数据
可以支撑在线业务
分布式系统特点 :易于扩展,支持动态伸缩,并发数据处理
HBase | 关系型数据库 | |
---|---|---|
数据库大小 | PB级别 | GB TB |
数据类型 | Bytes | 丰富的数据类型 |
事务支持 | ACID只支持单个Row级别 | 全面的ACID支持, 对Row和表 |
索引 | 只支持Row-key | 支持 |
吞吐量 | 百万写入/秒 | 数千写入/秒 |
ID | FILE NAME | FILE PATH | FILE TYPE | FILE SIZE | CREATOR |
---|---|---|---|---|---|
1 | file1.txt | /home | txt | 1024 | tom |
2 | file2.txt | /home/pics | jpg | 5032 | jerry |
RowKey | FILE INFO | SAVE INFO |
---|---|---|
1 | file_info:name:file1.txt file_info:type:txt file_info:size:1024 | path:/home/pics creator:Jerry |
2 | file_info:name:file2.jpg file_info:type:jpg file_info:size:5032 | path:/home creator:Tom |
关系型数据库:行式存储 每一行数据都是连续的 所有的记录都放到一个连续的存储空间中
列数据库: 列式存储 每一列对应一个文件 不同列并不对应连续的存储空间
结构化数据 V.S. 非结构化数据
创建HBase表的时候只需要指定表名 和 列族
每一个行当中 只需要列族相同就可以了 至于每个列族中的 key:value key可以完全不同
Client
Zookeeper
HMaster
HRegionServer
HRegion
HStore
HLog
在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况。
下载安装包 http://archive.cloudera.com/cdh5/cdh/5/hbase-1.2.0-cdh5.7.0.tar.gz
配置伪分布式环境
环境变量配置
export HBASE_HOME=/usr/local/development/hbase-1.2.4
export PATH=$HBASE_HOME/bin:$PATH
配置hbase-env.sh
export JAVA_HOME=/usr/local/development/jdk1.7.0_15
export HBASE_MANAGES_ZK=false --如果你是使用hbase自带的zookeeper就是true,如果使用自己的zk就是false
配置hbase-site.xml
<property>
<name>hbase.rootdir</name> --hbase持久保存的目录
<value>hdfs://hadoop001:8020/opt/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name> --是否是分布式
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name> --指定要连接zk的端口
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name> <value>/home/hadoop/app/hbase/zkData</value>
</property>
启动hbase(启动的hbase的时候要保证hadoop集群已经启动)
/hbase/bin/start-hbase.sh
输入hbase shell(进入shell命令行)
名称 | 命令表达式 |
---|---|
创建表 | create ‘表名’, ‘列族名1’,‘列族名2’,‘列族名n’ |
添加记录 | put ‘表名’,‘行名’,‘列名:’,'值 |
查看记录 | get ‘表名’,‘行名’ |
查看表中的记录总数 | count ‘表名’ |
删除记录 | delete ‘表名’, ‘行名’,‘列名’ |
删除一张表 | 第一步 disable ‘表名’ 第二步 drop ‘表名’ |
查看所有记录 | scan “表名称” |
查看指定表指定列所有数据 | scan ‘表名’ ,{COLUMNS=>‘列族名:列名’} |
更新记录 | 重写覆盖 |
create 'user','base_info'
disable 'user'
drop 'user'
create_namespace 'test'
list_namespace
create 'test:user','base_info'
list_namespace_tables 'test'
插入数据
put ‘表名’,‘rowkey的值’,’列族:列标识符‘,’值‘
put 'user','rowkey_10','base_info:username','Tom'
put 'user','rowkey_10','base_info:birthday','2014-07-10'
put 'user','rowkey_10','base_info:sex','1'
put 'user','rowkey_10','base_info:address','Tokyo'
put 'user','rowkey_16','base_info:username','Mike'
put 'user','rowkey_16','base_info:birthday','2014-07-10'
put 'user','rowkey_16','base_info:sex','1'
put 'user','rowkey_16','base_info:address','beijing'
scan 'user'
get 'user','rowkey_16'
get 'user','rowkey_16','base_info'
get 'user','rowkey_16','base_info:username'
get 'user', 'rowkey_16', {COLUMN => ['base_info:username','base_info:sex']}
delete 'user', 'rowkey_16', 'base_info:username'
truncate 'user'
alter 'user', NAME => 'f2'
alter 'user', 'delete' => 'f2'
desc 'user'
Table user is ENABLED
user
COLUMN FAMILIES DESCRIPTION
{NAME => 'base_info', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_B
HE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MI
ER => 'NONE', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOM
se', COMPRESSION => 'NONE', BLOCKCACHE => 'false', BLOCKSIZE => '65536'}
put 'user','rowkey_10','base_info:username','Tom'
get 'user','rowkey_10',{COLUMN=>'base_info:username',VERSIONS=>2}
alter 'user',NAME=>'base_info',VERSIONS=>10
可以通过HbaseUi界面查看表的信息
端口60010打不开的情况,是因为hbase 1.0 以后的版本,需要自己手动配置,在文件 hbase-site
<property>
<name>hbase.master.info.port</name>
<value>60010</value>
</property>
import happybase hostname = '192.168.19.188' table_name = 'users' column_family = 'cf' row_key = 'row_1' conn = happybase.Connection(hostname) def show_tables(): print('show all tables now') tables = conn.tables() for t in tables: print t def create_table(table_name, column_family): print('create table %s' % table_name) conn.create_table(table_name, {column_family:dict()}) def show_rows(table, row_keys=None): if row_keys: print('show value of row named %s' % row_keys) if len(row_keys) == 1: print table.row(row_keys[0]) else: print table.rows(row_keys) else: print('show all row values of table named %s' % table.name) for key, value in table.scan(): print key, value def put_row(table, column_family, row_key, value): print('insert one row to hbase') # column_family:qualifier:value # column_qualifier = name table.put(row_key, {'%s:name' % column_family:'name_%s' % value}) def put_rows(table, column_family, row_lines=30): print('insert rows to hbase now') for i in range(row_lines): put_row(table, column_family, 'row_%s' % i, i) def delete_row(table, row_key, column_family=None, keys=None): if keys: print('delete keys:%s from row_key:%s' % (keys, row_key)) key_list = ['%s:%s' % (column_family, key) for key in keys] table.delete(row_key, key_list) else: print('delete row(column_family:) from hbase') table.delete(row_key) def delete_table(table_name): pretty_print('delete table %s now.' % table_name) conn.delete_table(table_name, True) def main(): table = conn.table(table_name) show_rows(table) put_rows(table, column_family) show_rows(table) # 更新操作 # put_row(table, column_family, row_key, 'xiaoh.me') # show_rows(table, [row_key]) # 删除数据 # delete_row(table, row_key) # show_rows(table, [row_key]) # delete_row(table, row_key, column_family, ['name']) # show_rows(table, [row_key]) # delete_table(table_name) if __name__ == "__main__": main()
DDI 目的是为了克服HBase架构上的缺陷(join繁琐 只有row key索引等)
设计HBase表时需要注意的特点
设计表保存应用中用户互粉的信息
设计
最终设计(DDI)
案例总结
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。