1.传统的关系型数据库
mysql
1. 开源【社区版】,收费版【企业版】
2.市场占有率最高特别是在web领域
3.安装及操作比oracle简单许多
4.
端口:3306
oracle
1. 实用环境比较严格
2.收费
3.08年收购了mysql
4.MariaDB--相当于是mysql的升级版
5.集群能力比mysql强 --- 10台
6.端口:1521
sqlserver
1.微软平台下的项目中使用
2.收费
3.端口:1433
2.nosql--非关系型数据库
(not only sql)
不支持sql语句(SQL99标准)
1.hbase 列存储数据库 -- 列家族:列簇/列族
2.MongoDB 文档型数据库 -- 爬虫项目中
3.redis 基于内存的键值对数据库
flume+kafka+sparkStreaming/storm+redis+机器学习/前端报表展示
4.Neo4J 图形结构数据库
什么时候选用nosql数据库:
1.当单表数据量过大,又不得不全表扫描,且不能进行分库分表,可以考虑使用nosql数据库
2.单表行上亿条时 --oracle 性能瓶颈
nosql数据库对事务的支持不佳:
事务: 确认支付-》更新所买产品的库存量-》与支付平台的系统交互确认-》订单生成并保存到数据库 -》更新用户的订单库数据-》完成
3.hbase的应用场景:
1.直接接入业务在线查询使用:
借助hbase的强大的分布式查询系统及完善的检索机制,可以使客户从海量数据中快速的实时查询
1.电商 订单
物流 --信息
2.快递物流公司的物理信息存储查询
3.大型社交网站数据
4.银行数据 -- 信用卡
5.电信公司
6.医疗、交通.............
2.大数据平台数据存储:
1.直接在线从hbase系统中获取数据进行需要分析
MapReduce、hive、spark可以直接从hbase中获取数据进行分析
2.离线分析平台的临时数据的存储
驴妈妈离线分析平台中的应用
3.作为实时数据展示的数据临时存储库
flume+kafka+sparkStreaming/storm+redis/hbase+前端报表展示
4.hbase的特点:
1.在生态系统中的位置 :hbase是构建在hdfs上
2.hbase源于谷歌的BigTable ,和hdfs结合使用
google的三大潮流:GFS MapReduce BigTable --- HBASE的前身
3.为海量数据提供检索和存储平台
4.基于【列存储】的分布式nosql数据库
列存储和行存储:
1.RDBMS都是基于行存储:
每行的数据是一个连续的存储单元
每行的数据被保存在一起,
插入数据或更新数据更简单
如果select时只涉及到几个字段,行所有的数据都会被加载,系统io加大
2.Hbase列存储:
每列的数据被保存在一起
每列数据是一个连续的存储单元,
插入数据或更新数据比较麻烦
如果select时只涉及到几个字段,只有涉及的列才会被系统加载读取,系统io大大减小
以列为单位进行存储,每列数据类型相同,更容易实现压缩和存储,数据更加安全
5.合适【结构化】和【非结构化】数据的存储
针对日志的类型进行讲解:
结构化的日志每条日志的字段数量和种类固定;
非结构化的日志每条日志的字段数量和种类可能不一样;
各种文档、图片、视频也都是属于非结构化数据;
6. 基于key-value形式存储的数据库
1.key:rowkey+列簇+列+时间戳 -> vlaue
2.高可用性、高性能、可伸缩的分布式数据库
高可用性、可伸缩:基于hdfs
高性能:对比RDBMS,hbase是大规模的高并发的分布式数据库;
借助强大的搜索引擎,可以快速的从海量数据中检索数据 。
结构化的日志数据 例如: Apache的访问日志
访问ip 时间 资源 http状态 访问流量
101.81.13.86 2017-1019 Get xx 200 98kb
101.81.13.88 2017-1019 Get xx 200 98kb
101.81.13.88 2017-1019 Get xx 200 98kb
非结构化的日志数据 例如:用户行为日志数据
日志类型 uuid umid 时间 浏览器
pv 001 110 15xxx Chrome
日志类型 uuid umid 时间 浏览器 订单id 金额 支付方式
支付请求 001 110 15xxx Chrome 999 88 aliapy
日志类型 uuid 订单id 金额
支付成功 001 999 88
pv 001 110 15xxx Chrome
支付请求 001 110 15xxx Chrome 999 88 aliapy
支付成功 001 999 88
如何将以上三种类型的日志数据存储到一张表中
5.hive与hbase区别
1.hive:
1.高延迟,存储的是结构化的数据
2.面向分析的,使用hql语句
3.hive不能接入业务中使用
hive与RDBMS的区别??
1.hive是面向行存储的数据仓库工具,是纯逻辑表 (不是物理表)
2.hive本身不存储和计算数据,完全依赖hdfs和MapReduce,本质就是将hql转换为MapReduce
2.hbase:
低延迟,适合存储结构化和非结构化的数据
面向数据检索和存储的,是一个数据库
hbase可以接入业务中使用
hbase是列存储,hbase中的表时物理表,通过索引可以快速进行数据的检索更新等操作
hbase是一种nosql数据库,是一个构建在hdfs上的面向列存储的分布式数据库
6.hbase的架构:
主从架构
master:
主节点,用来管理调度regionserver从节点;
负责分布表的region给regionserver节点
。
region是hbase表存储及管理的基本单元;
region就是表在行方向上的拆分,大表拆分成一些小表进行管理。
regionserver:
从节点,负责管理当前节点上的表的region;
负责响应客户端的读写请求。
zookeeper:
hbase,kakfa , storm 强依赖于zookeeper;
持有hbase表的元数据表的寻址入口;
监听master和regionserver的运行状态及节点宕机后的容灾处理;
基于观察者模式监控hbase运行状态;
保证hbase集群的高可用性。
hdfs :
hbase 构建在hdfs上的数据库
1.hbase的分布式的安装部署:
1、Hadoop安装部署并启动hdfs服务,在开启hbase前一定要开启hdfs
2、zookeeper的安装部署及服务启动,在开启hbase前一定要开启zookeeper
$ bin/zkServer.sh start
3、上传并解压hbase安装包
$ tar zxf hbase-0.98.6-cdh5.3.6.tar.gz
4、完全分布式配置:
(1) 修改hbase-env.sh
# The java implementation to use. Java 1.6 required.
export JAVA_HOME=/opt/modules/jdk1.7.0_67
# Tell HBase whether it should manage it's own instance of Zookeeper or not.
export HBASE_MANAGES_ZK=false //声明不使用hbase内置的zookeeper服务
(2) 修改hbase-site.xml
hbase.rootdir
hdfs://192.168.88.134:8020/hbase
hbase.cluster.distributed
true
hbase.zookeeper.quorum
192.168.88.134
(3)修改 regionservers文件
添加regionserver节点的主机名或ip地址 例如:com.bigdata
5、替换hbase的lib目录中关于Hadoop和zookeeper的依赖jar包 (仅限使用Apache版本的hbase时需要查看并执行的)
如果使用的是Apache版本的hbase,
查看 hbase的lib目录下的Hadoop和zookeeper的jar包版本是否为2.5.0和3.4.5
6、启动hbase服务
$ bin/hbase-daemon.sh start master
$ bin/hbase-daemon.sh start regionserver
hbase的web监控管理界面
http://com.bigdata:60010/master-status
1. Backup Masters ( master节点的备份) --类似 ha
2. user table :用户表
3. catalog tables : hbase的系统表
hbase:meta -> hbase上所有用户表的元数据表
hbase:namespace -> hbase上命名空间相关数据
7、启动hbase服务进程后两处变化
1)hdfs上 http://com.bigdata:50070/explorer.html#/hbase/data
/hbase/data
目录为hbase上所有表的数据在hdfs上的存储路径
用户自定义的命名空间(库)会出现在data目录下
/hbase/data/default
是hbase的默认命名空间库--类似hvie的default库
当用户创建表时不指定库(命名空间)时会在该默认库下创建表
/hbase/data/hbase
是hbase的系统表的命名空间库
hbase:meta -> hbase上所有用户表的元数据表
hbase:namespace -> hbase上命名空间相关数据
2)zookeeper上
[zk: localhost:2181(CONNECTED) 4] ls /hbase
[meta-region-server, backup-masters, table, draining, region-in-transition, table-lock, running, master, namespace, hbaseid, online-snapshot, replication, splitWAL, recovering-regions, rs]
hbase启动后会将自己的节点元数据等信息注册到zookeeper上
hbase的数据存储模型:
bhase表中的数据类型:
1.hbase中没有数据类型之分
mysql-》 int char string float double
2.bhase表的数据在读或写时都
以字节数组的形式存在
写 -》需要将数据先转换为字节数组
读 -》需要将读取的字节数组转换为其他格式进行显示
hbase中的数据存储模型术语:
rowkey:行键。用来标识唯一一行数据,类似RDBMS中的主键
。
column family【cf】:列簇、列族 。将相同类型或功能的列聚集在一起, 目的是对列增加一层索引。
列簇的数量:从性能上考虑数量≤3
column:列 字段。一个列必须存在于某个列簇中。
cell : 单元格 。最新最基本的存储单元,单元格内是实际值的存储。
时间戳: 值插入到hbase表的cell时的时间(时间戳表示)
可以用来控制cell数据的多个历史版本, 通过指定时间戳来获取cell的历史值
版本:hbase中每个cell中的值可以有多个基于时间戳的版本,
默认建表时只允许保留一个版本,可以在建表时指定cell可存储版本的数量
默认获取一个cell单元格值时显示的是最新的值
如何确定一个单元格的值:
key :
rowkey+cf+column+时间戳
2.hbase shell的基本使用
$ bin/start-hbase.sh
$ bin/hbase shell 进行shell交互命令行
repl命令行
hbase shell命令行默认无法退格解决:
xshell :
文件-属性-终端-键盘-两个都选择ASCII127
CRT :
选项-会话选项-仿真-终端-选择linux
选项-会话选项-映射键-勾选:
hbase(main):005:0> help
COMMAND GROUPS:
Group name: general
Commands: status, table_help, version, whoami
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, show_filters
Group name: namespace
Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables
Group name: dml
Commands: append, count, delete, deleteall, get, get_counter, incr, put, scan, truncate, truncate_preserve
Group name: tools
Commands: assign, balance_switch, balancer, catalogjanitor_enabled, catalogjanitor_run, catalogjanitor_switch, close_region, compact, flush, hlog_roll, major_compact, merge_region, move, split, trace, unassign, zk_dump
Group name: replication
Commands: add_peer, disable_peer, enable_peer, list_peers, list_replicated_tables, remove_peer, set_peer_tableCFs, show_peer_tableCFs
Group name: snapshots
Commands: clone_snapshot, delete_snapshot, list_snapshots, rename_snapshot, restore_snapshot, snapshot
Group name: quotas
Commands: list_quotas, set_quota
Group name: security
Commands: grant, revoke, user_permission
Group name: visibility labels
Commands: add_labels, clear_auths, get_auths, set_auths, set_visibility
hbase(main):007:0> create //回车后提示命令的用法
hbase(main):007:0> help 'create' 查看create的用法
> create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}
//表示在ns1命名空间下创建一个名称为t1的表,表的列簇命名f1,且该列簇下的cell的版本数都是5个
> create_namespace 'ns1' //创建一个名称为ns1的命名空间
> create 't1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'}
//默认命名空间下创建一个名称为t1的表,并且该表有三个列簇,名称分别为 f1 f2 f3
> create 't2', f1, 'f2', 'f3' //效果同上
> create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true},{NAME => 'f2'}
{NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}
//这是列簇f1,里面的属性设置只针对f1
{NAME => 'f2'}
//这是列簇f2,属性全是使用的默认值
表的属性是针对某个列簇进行配置的,一张表中的多个列簇的属性可以不一样,创建表时需要使用{NAME => 'f2'}在内部定义某个列簇的属性
> create 't3', {NAME => 'f1', VERSIONS => 3, TTL => 2592000, BLOCKCACHE => true},{NAME => 'f2'}
> desc 't3'
DESCRIPTION ENABLED
't3', {NAME => 'f1', DATA_BLOCK_ENCODI true NG => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '3', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => '2592000 SECONDS (30 DAYS)', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}, {NAME => 'f2', DATA_BLOCK_ENCODING => 'NONE', BLOOFMILTER => 'R
OW', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TT
L => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY = > 'fa
lse', BLOCKCACHE => 'true'}
以员工表演示:
> create 'emp' , 'info'
> put 'emp' , '10001' ,'info:name','tom'
> put 'emp' , '10001' ,'info:age','22'
> put 'emp' , '10002' ,'info:name','lio'
> put 'emp' , '10002' ,'info:age','23'
> put 'emp' , '10002' ,'info:sex','boy'
> put 'emp' , '10003' ,'info:name','lili'
> put 'emp' , '10003' ,'info:age','19'
> put 'emp' , '10003' ,'info:age','20' 覆盖数据
> scan 'emp' 扫描表
总结hbase shell常用的命令
scan 扫描表
> scan 'emp' 全表扫描
> scan 'emp', {COLUMNS => 'info:name'} 扫描某一列的数据
> scan 'emp', {COLUMNS => 'info'} 扫描某一个列簇的数据
> scan 'emp', {COLUMNS => ['info:name','info:age']} 扫描多列数据
> scan 'emp', {COLUMNS => 'info:name',LIMIT => 2} 扫描前2条数据
> scan 'emp', {STARTROW =>'10002'} 指定起始rowkey
> scan 'emp', {STARTROW =>'10001',STOPROW=>'10003'} 指定起止rowkey,默认左闭右开
> scan 'emp',{ VERSIONS=>5 } 扫描获取每个cell的最多5个历史版本数据
get 获取数据
> get 'emp' ,'10002' 获取某条数据的cell
> get 'emp' ,'10002',{COLUMN => 'info'} 获取某条数据的某个列簇下的cell
> get 'emp' ,'10002',{COLUMN => 'info:name'} 获取某个cell的值
delete删除数据
> deleteall 'ns1:t1', 'r1' 删除某一行数据
> deleteall 't1', 'r1', 'c1' 删除的某个cell的数据
> deleteall 't1', 'r1', 'c1', ts1 删除的某个cell指定的时间戳的值及该时间戳之前的
删除数据并没有直接将数据从hbase库中删除,而是给对应的cell打上一个‘删除’标签
打上‘删除’标签的cell不能再通过get或scan或java api读取
这些打上‘删除’标签的cell在会大合并期间进行清除
truncate清空数据
> truncate 't1' //清空一张表的数据
Truncating 't1' table (it may take a while):
- Disabling table...
- Dropping table...
- Creating table...
drop
> drop 't1'
ERROR: Table t1 is enabled. Disable it first.
> disable 't1'
> drop 't1'
version版本:
支持cell的多版本数据
优点:可以保持多个cell的历史值,客户端可以获取历史值
缺点:过多的版本会占用空间,影响读写性能,根据业务需求设计尽量少的版本
> create 't5' , {NAME => 'f1', VERSIONS => 5}
> put 't5','10001','f1:age','21'
> put 't5','10001','f1:age','25'
> get 't5','10001',{COLUMN => 'f1:age', TIMESTAMP => 1508399069424} 获取时间戳 1508399069424的历史版本值
> get 't5','10001',{COLUMN => 'f1:age', VERSIONS => 4} 获取最新的4个版本
> scan 't5',{VERSIONS => 5}
> delete 't5','10001','f1:age',1508399069424 删除指定时间戳的版本及该版本之前的所有历史版本
> scan 't5',{VERSIONS => 5}
> count 'emp' 统计多少条数据
3.hbase表的物理模型 :
hbase中将表分成了多个reigon进行管理
region是hbase中表数据存储和管理的基本单元
hbase集群的负载均衡也是以region为单位
思考以下问题:
1.region如何划分的?
hbase中存储元数据的表meta由zookeeper管理,根据zookeeper找到对应的regioner,hbase表中的数据的存储默认是按照rowkey的字典顺序排序的, 表在行的方向上基于rowkey被分割成了多个region.master宕掉之后会维持一段时间的读写
2.region如何被分配管理的?
1.
分布式管理:一张表的多个region会被随机分配给集群的regionserver节点进行管理,分配是由master来执行;
2.
负载均衡: 同一张表的多个region会均匀分散在regionserver上 ;每个regionserver节点可以维护管理不同表的region,并且每个regionserver上所管理的region的个数是趋向相等的
3.
分布式存储:每张表在建表时没有指定预分区的情况下有1个region,随着region数据量的增大,达到一定阈值(小于10G的一个动态阈值)时会进行split分割,region一分为二,原region会offline,新的region会被master随机分配给regionserver管理
3.region的划分的好处:
region是hbase中
分布式存储
、管理和
负载均衡的最小单元
负载均衡-》每个regionserver上所管理的region的个数是趋向相等的
4.region的结构:
每个region是由1个或多个store组成的,每个store保存了一个列簇的数据,即
由列簇决定(
列簇的数量与store的数量相等)
每个store的组成?
由一个memstore和多个 storeFile以及一个Hlog组成
1.
memstore:是一个hbase表
写入数据时的内存缓存区,
为了加速hbase的数据写速度,默认占用的内存大小128M
查看hbase默认配置文件的途径:
/opt/modules/cdh//hbase-0.98.6-cdh5.3.6/hbase-common/src/main/resources/hbase-default.xml
http://com.bigdata:60010/conf
memstore配置如下:
hbase.hregion.memstore.flush.size
134217728
Memstore will be flushed to disk if size of the memstore
exceeds this number of bytes. Value is checked by a thread that runs
every hbase.server.thread.wakefrequency.
2.storeFile:
是由memstore中flush出的数据,存储在hdfs上,最终落地为Hfile,数量可能有1个也可能有多个,最终会被大合并成一个storeFile文件
3.每个region还包含一个Hlog预写日志(新版本中允许一个regionserver配置一个Hlog)
当向hbase表中写数据时数据会先写入到Hlog中, 预写日志可以用来临时保存写入的数据,防止memstore内的数据因宕机而丢失, memstore内的数据丢失后可以从Hlog预写日志恢复。
hbase表在hdfs及web上的体现: http://com.bigdata:50070/explorer.html#/hbase/data/default/emp/