为什么有hbase?hbase是什么?Hbase的架构。 一、 为什么有hbase? 数据量越来越大,传统的关系型数据库不能满足存储和查询的需求。而hive虽然能满足存储的要求,但是hive不能满足非结构化、半结构化数据的存储和查询。 二、hbase是什么? hbase是一个开源的、分布式的、多版本的、可扩展的非关系型数据库。hbase是bigtable的开源java版本,建立在hdfs之上,提供高可靠性的、高性能、列式存储、可伸缩、实时读写的nosql数据库系统。适用的场景如:需要对海量非结构化的数据进行存储。 需要随机近实时的读写管理数据。 三、hbase的架构 client\zookeeper\hmaster\ hregionserver\hlog\hregion\memstore\storefile\hfile client:hbase的客户端,包含访问hbase的接口(linux shell 、java api) client维护一些cache来加快访问hbase的速度,比如region的位置信息。 zookeeper:监控hmaster的状态,保证有些仅有一个active的hmaster,达到高可用。存储所有region的寻址入口,--root表在那台服务器上。实时监控hregionserver的状态,将regionserver的上下线信息实时通知给hmaster。存储hbase的所有表的信息(hbase的元数据) hmaster:(hbase的老大)为regionserver分配region(新建表等)。负责regionserver的负载均衡。负责region的重新分配(hregionserver异常、hregion裂变)。hdfs上的垃圾文件回收。处理schema的更新请求。 hregionserver:(hbase的小弟)hregionserver维护master分配给他的region(管理本机器上region)。处理client对这些region的IO请求,并和hdfs进行交互 region server负责切分在运行过程中变大的region。 hlog:对hbase的操作进行记录,使用WAL写数据,优先写入log,然后再写入memstore,以防数据丢死可以进行回滚。 hregion:hbase中分布式存储和负载均衡的最小单元,表或者表的一部分。 store:相当于一个列簇。 memstore:128M内存缓冲区,用于将数据批量刷新到hdfs上。 hstorefile(hfile):hbase中的数据是以hfile的形式存储在hdfs上。 各组件间的数量关系: hmaster:hregionserver=1:n hregionserver:hregion=1:n hregionserver:hlog=1:1 hregion:hstore=1:n store:memstore=1:1 store:storefile=1:n storefile:hfile=1:1 hbase关键字词: rowkey:行键,和mysql的主键是一样的,不允许重复,有顺序。 columnfamily:列簇(列的集合)。 column:列。 timestamp:时间戳,默认显示最新的时间戳。 version:版本号。 cell:单元格。 四、hbase和hadoop的关系 hbase是基于hadoop:hbase的存储依赖于hdfs。具体说hbase的特点: 模式:无模式。 数据类型:单一 byte[]。 多版本:每个值都可以有多个版本。 列式存储:一个列簇存储到一个目录。 稀疏存储:如果key-value为null,则将不占用存储空间。 再说hbase的安装: 1、standalone模式 1)解压并配置环境变量 tar -zxvf hbase-1.2.1-bin.tar.gz -C /usr/local cd /usr/local vi /etc/profile source /etc/profile 2)测试hbase的安装 hbase version 配置hbase的配置文件 vi conf/hbase-env.sh JAVA_HOME 注意: # Configure PermSize. Only needed in JDK7. You can safely remove it for JDK8+ export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"。 export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"。 vi hbase-site.xml hbase.rootdir file:///usr/local/hbasedata hbase.zookeeper.property.dataDir /usr/local/zookeeperdata 启动hbase服务: bin/start-hbase/sh 启动客户端: bin/hbase shell 2、伪分布式 3、全分布式 解压并配置环境变量 配置hbase的配置文件 vi conf/hbase-env.sh export HBASE_MANAGES_ZK=false vi regionservers vi backup-masters vi hbase-site.xml hbase.cluster.distributed true hbase.rootdir hdfs://qianfeng/hbase hbase.zookeeper.property.dataDir /usr/local/zookeeperdata hbase.zookeeper.quorum hadoop05:2181,hadoop06:2181,hadoop07:2181 注意: 如果hdfs是高可用的,要讲hadoop下的core-site.xml和hdfs-site.xml copy到hbase/conf目录下。 分发: scp -r hbase-1.2.1 root@hadoop06:$PWD scp -r hbase-1.2.1 root@hadoop07:$PWD 启动: 1)启动zk 2)启动hdfs 3)启动hbase hbase集群的时间必须同步。 hmaster:16010 hregionserver:16030 hbase的shell操作 help help "COMMAND" help "COMMAND_GROUP" 列举出当前namespace下的所有表 list 创建表: create 'test','f1', 'f2' namespace: hbase没有库的概念,但是有名称空间或者组的概念,namespace相当于(库) hbase默认有两个组: default: hbase: 列举出所有的namespcae: list_namespace list_namespace_tables 'hbase' create_namespace 'ns1' describe_namespace 'ns1' alter_namespace 'ns1', {METHOD => 'set', 'NAME' => 'gjz1'} alter_namespace 'ns1', {METHOD => 'unset', NAME => 'NAME'} drop_namespace 'ns1' ###只能删除一个空的namespace DDL: Group name: ddl Commands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, locate_region, show_filters 创建表: create 'test','f1', 'f2' create 'ns1:t_userinfo',{NAME=>'base_info',BLOOMFILTER => 'ROWCOL',VERSIONS => '3'} create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40'] --事先分配好region所管辖的rowkey的范围。 修改表:(有则更新,无则新增) alter 'ns1:t_userinfo',{NAME=>'extra_info',BLOOMFILTER => 'ROW',VERSIONS => '2'} alter 'ns1:t_userinfo',{NAME=>'extra_info',BLOOMFILTER => 'ROWCOL',VERSIONS => '5'} 删除列簇: alter 'ns1:t_userinfo', NAME => 'extra_info', METHOD => 'delete' alter 'ns1:t_userinfo', 'delete' => 'base_info' 删除表:(先要禁用表) disable 'ns1:t1' drop 'ns1:t1' DML: Group name: dml Commands: append, count, delete, deleteall, get, get_counter, get_splits, incr, put, scan, truncate, truncate_preserve 插入数据:(不能一次性插入多列) put 'ns1:test','u00001','cf1:name','zhangsan' put 'ns1:t_userinfo','rk00001','base_info:name','gaoyuanyuan' put 'ns1:t_userinfo','rk00001','extra_info:pic','picture' 更新数据: put 'ns1:t_userinfo','rk00001','base_info:name','zhouzhiruo' put 'ns1:t_userinfo','rk00002','base_info:name','zhaoming' 表扫描(scan) scan 'ns1:t_userinfo' scan 'ns1:t_userinfo',{COLUMNS => ['base_info:name','base_info:age']} 设置查询条件:(包头不包尾) scan 'ns1:t_userinfo',{COLUMNS => ['base_info:name','base_info:age'],STARTROW=>'rk000012',LIMIT=>2} scan 'ns1:t_userinfo',{COLUMNS => ['base_info:name','base_info:age'],STARTROW=>'rk000012',ENDROW=>'rk00002',LIMIT=>2} 查询数据:(GET) get 'ns1:t_userinfo','rk00001' get 'ns1:t_userinfo','rk00001',{TIMERANGE=>[1534136591897,1534136667747]} get 'ns1:t_userinfo','rk00001',{COLUMN=>['base_info:name','base_info:age'],VERSIONS =>4} get 'ns1:t_userinfo','rk00001',{TIMESTAMP=>1534136580800} 删除数据:(DELETE) delete 'ns1:t_userinfo','rk00002','base_info:age' 'ns1:t_userinfo','rk00001',{TIMERANGE=>[1534138686498,1534138738862]} 删除指定的版本:(往上删除版本) delete 'ns1:t_userinfo','rk00001','base_info:name',TIMESTAMP=>1534138686498 表判断: exists 'ns1:t_userinfo' disable 'ns1:t_userinfo' enable 'ns1:t_userinfo' desc 'ns1:t_userinfo' 统计表:(统计效率较差,不建议使用) count 'ns1:t_userinfo' 清空表: truncate 'ns1:test' 学习大数据开发,内容包含Linux&&Hadoop生态体系、大数据计算框架体系、云计算体系、机器学习&&深度学习。 |
|