hbase_1

常见的RDBMS:(数据库排行)
    ** mysql      --开源[社区版] 、收费[企业版]
                --市场占有率高、web领域被广泛使用
        ** 2008年被oracle收购
        ** mysql主从架构[集群的一种]
        ** 端口:3306
    ** oracle
        ** oracle集群性能比较强
        ** mysql集群性能相对比较差一下
        ** 端口:1521
    ** sqlserver 
        ** 微软公司[windows 2008\2012\2012R2]
        ** windows项目、微软平台下面的项目用得比较多
        ** 端口:1433


数据量增加,RMDBS的应对:
1 读写分离,主数据库用于写,其他用于读
2 增加缓存
3 垂直扩容和横向扩展
4 采用逆范式化结构
5 停用存储过程和放弃辅助索引


非关系型数据库 NoSQL(Not Only SQL):
    ** HBase、mongoDB、redis
    ** 没有sql语句
    ** 性能和效率较高
    ** 尤其是当单表数据量过大,又必需进行全表扫描,且不能分库分表时,可以考虑使用非关系型数据库
    ** 注意:非关系型数据库并非万能的,需要根据业务来选择使用何种数据库

====HBase部署=================================

1、安装Apache Hadoop,并启动

2、启动zookeeper(未安装的需要安装)
    $ bin/zkServer.sh start
    ----------------依赖zookeeper的原因是存储元数据,通过他找到对应的regionserver
    
3、解压HBase

4、配置hbase-env.sh:
export JAVA_HOME=/opt/modules/jdk1.7.0_67

# 关闭掉HBase自带的zookeeper
export HBASE_MANAGES_ZK=false        //不使用自带的zookeeper

5、配置hbase-site.xml:
<!--用来存放HBase数据-->
<property>
    <name>hbase.rootdir</name>
    <value>hdfs://blue01.mydomain:8020/hbase</value>
</property>
<!--启用集群模式,当前为伪分布式-->
<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
</property>
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>blue01.mydomain</value>
</property>

6、regionservers文件:(替换localhost)
blue01.mydomain

7、替换lib目录中低版本的hadoop和zookeeper的jar包
$ rm -rf lib/hadoop-*
$ rm -rf lib/zookeeper-3.4.6.jar
拷贝对应的jar包到lib目录

8、启动服务
$ bin/hbase-daemon.sh start master
$ bin/hbase-daemon.sh start regionserver
** $ bin/start-hbase.sh
** $ bin/stop-hbase.sh

访问:http://192.168.122.128:60010/

PS:
HBase默认配置文件hbase-default.xml 在 hbase-common-0.98.6-hadoop2.jar

=================================================================

结构化与非结构化数据:

结构化(表)
name  cardid  age   sex   addr  job1  job2  job3   edu1  edu2
张三    1     23    男    上海  谷歌  电信         北大     同济
李四    2           女    北京                       清华

非结构化
rowkey:身份证cardid(相当于primary key)

cardid: 1
name:张三
age: 23
sex:男 
addr: 上海
job1:谷歌
job2:电信
edu1:同济    

cardid: 2                    
name:李四
sex:女  
addr: 北京

使用"键值对"进行查询(key-value): rowkey + Column family + column + timestamp----> value 
如:cardid(2)+CF+name: 李四
    cardid(2)+CF+sex : 女


HBase数据类型
    ** HBase不区分数据类型
    ** 数据存储读取时:字节数组


HBase中数据存储的重要术语
    ** rowkey:行键
        用来唯一标识每一行数据,类似RDBMS中的主键
    ** Column Family[CF] :  列族
        用来组织列, 一个列族里包含多个列
        在实际环境中,从性能上考虑,列族个数<=2,最好是一个
    ** Column : 列
        字段名,列名
    ** timestamp:
        数据插入到表中的时间
    ** Cell : 单元格 
        最小或最基本的存储单元,列的实际值存储
    ** 版本
        HBase中每个列的值可以有多个版本[副本]
        默认情况下,有3个版本,通常显示最新版本
    ** 基于Key-Value对形式存取数据
       rowkey + CF + Column + timestamp : value

======================================================================

PS: hbase默认不支持退格键,解决方案:
a) 使用Ctrl+Backspace
b) Xshell:
    文件--属性--终端--键盘--两个都选择ASCII 127
c) secureCRT:(百度)
    选项--会话选项--仿真--终端--选择Linux
    选项--会话选项--映射键--勾上:backspace发送delete和delete发送backspace
    
----shell命令-------------------

$ bin/hbase shell
hbase(main):001:0> 

> help
> list     --显示所有数据表
> create 'emp','info'    --表名,列族
> desc 'emp'      --查看表信息
> describe 'emp'  --同上
> create 't1',{NAME => 'f1'},{NAME => 'f2'},{NAME => 'f3'}    --多个列族

> put 'emp','1001','info:name','zhangsan'    --插入
> put 'emp','1001','info:name','aaa'         --更新
> put 'emp','1001','info:age','25'
......
> scan 'emp'

--查看数据
> get 'emp','1001'
> get 'emp','1001','info'
> get 'emp','1001','info:name'
> get 'emp','1001', {COLUMN => ['info:name']}    --同上
> get 'emp','1001','info:name','info:age'
> get 'emp','1001', {COLUMN => ['info:name', 'info:age']}
> get 'emp','1001', 'info:name', 'info:age', 'info:sex'        --有不存在的列
> get 'emp','1001', {COLUMN => ['info:name', 'info:age', 'info:sex']} 

--scan(范围)
> put 'emp','1003','info:name','wangwu'
> scan 'emp'
> scan 'emp',{COLUMNS=>'info:name'}
> scan 'emp',{COLUMNS=>['info:name','info:age']}    --多列,结果和列序无关
> scan 'emp',{STARTROW => '1002'}
> scan 'emp',{STOPROW => '1003'}
> scan 'emp',{COLUMNS=>['info:name','info:age'],STARTROW => '1002',STOPROW => '1003'}    --[1002,1003)
> scan 'emp',{LIMIT => 3}    --rowkey的上限,而非记录条数的上限
                    
--删除数据
> delete 'emp','1001','info:age'    --至少3个参数
> deleteall 'emp','1001'            --至少2个参数,可以删除整行
> deleteall 'emp','1001','info:age' --也可以用来删除列
> truncate 'emp'    --清空表数据

--删除表
> disable 'emp'  --禁用
> scan 'emp'
> enable 'emp'   --启用
> scan 'emp'
> drop 'emp'     --需要先禁用

统计一张表有多少行数据
> count 'emp'     --rowkey数

===================================================

HBase的几个角色:
master:是HBase的主节点,用来调度管理客户端应用程序和RegionServer,
        管理分配region给regionserver服务器。---负责region的存储regionserver位置,保证负载均衡
regionserver:
       是从节点,管理当前自己这台服务器上的region。region是HBase表
       的基础单元组件,它存储了分布式表。所以HBase表和HBase集群
       利用Master和RegionServer来协同工作。
ZooKeeper:
       监控master和regionserver的状态--------管理元数据
       HBase有内置zookeeper,但实际环境中我们通常会使用其他ZK集群
       
通常情况下:
1、Master和Hadoop的NameNode进程运行在同一台主机上,与DataNode通信以读写HDFS的数据
2、RegionServer跟Hadoop的DataNode运行在同一台主机上


HBase特点:
    ** 存储数据和检索数据
    ** 非严格的列式存储数据库,但它利用了磁盘上的列存储格式
    ** 分布式、非关系型数据库
    ** HBase源自于bigtable
    ** HBase通常是和Hadoop结合使用-------------上层一来于hadoop,将数据存储在hadoop上面
    ** 适合于【非结构化数据】存储的数据库
    ** 非结构化的字段数量可以根据用户的需求而定
    ** 以key-value的形式来存储数据
    ** 高可靠性、高性能、面向列、可伸缩的分布式存储系统
    ** 利用HBase技术可以在商用机上搭建出大规模的数据库系统


HBase数据存储目录
    ** /hbase/data/default
       存储默认命名空间表文件,如果创建表时不指定命令空间,就属于默认命名空间
    ** /hbase/data/hbase
       存储HBase元数据
        默认情况下,有这两个命名空间,命名空间可以理解为数据库
===================================================

面试题:
***** 理解、记住 *****
Hive和HBase的区别?
Hive
    ** 是一个数据仓库,不是数据库
    ** 一般用来做业务分析,不会直接接入业务
    ** hive实际上是把hql语句转换成MapReduce运行在yarn平台上
HBase
    ** 是一个分布式面向列的非关系型数据库
    ** 核心功能是用来存储和检索数据、可以直接接入业务系统
    ** 不依赖yarn和MapReduce

***** 理解、记住 *****
RDBMS和HBase的区别:
    ** HBase是分布式架构,支持服务器节点在线添加和移除
    ** RDBMS可以使用sql语句,HBase通常使用API来访问
    ** RDBMS是基于行存储,HBase是基于列存储,能更好地支持存储和压缩
    ** RDBMS适合存储结构化的数据,HBase适合结构化和非结构化的数据存储
    ** RDBMS支持比较好的事务,HBase不支持事务
    ** RDBMS支持多表Join,HBase不支持Join
    ** 通常HBase表的应用场景比较简单,不适合业务逻辑很复杂的查询环境
    ** HBase索引简单,RDBMS的索引强大而且完善
    ** HBase通常应用于单表数据量巨大,用关系型数据库无法满足,不适合分库分表的场景

 

posted @ 2019-04-27 15:00  问题不大1  阅读(237)  评论(0编辑  收藏  举报