一、回顾
-》Hadoop
-》数据存储:hdfs
-》数据计算:MapReduce
-》Hive
>> 作用:构建数据仓库进行数据管理
>>hive对比Hadoop就是将文件映射成表,底层还是文件,只是加上映射关系,让文件变成了表
-》数据管理:hdfs,映射
-》提供SQL化的数据计算
-》Hbase:
-》Google三篇论文:
-》GFS
-》MapReduce
-》bigtable
-》chubby
-》bigdata
-》HDFS
-》MapReduce
-》Hbase
-》zookeeper
21世纪大数据的前三辆马车 GFSHDFS MapReduce bigtableHbase
Spark已经替代了Hadhoop中的MapReduce,但是目前大数据框架还没有哪个
框架可以替代HBase
hdfs可以做到海量数据存储,但是实时查询hdfs是做不到的。这也促进了HBase的诞生
Sqoop:局限性很大,只能将MySql的数据写到hive\HBase中去
二、Hbase的介绍
-》应用:对于大数据快速读写存储
hdfs:起初hdfs能解决大数据存储问题但是效率极其低下,HBase可以显示快速读写存储
hive:添加了映射表文件,读数据方面得到了改善
但是写的方面还是MapReduce,这样的效率还是很慢
-》大数据的存储必然依赖于分布式存储文件系统:HDFS(底层还是HDFS)
-》实时查询业务
-》海量数据存储
-》金融、游戏、电商、广告、电信、政府
-》消费记录存储、查询
-》订单、用户日志、用户等级、实时读取
-》订单
-》分类:
当前短期的数据:mysql、oracle
历史数据存储:nosql
例如京东读取2019年的全部订单,如果是关系型数据库用户并发读取,这样数据库读取的效率
会极其低下,所以历史数据都是存放在NoSql中。
大数据分析和传统数据库分析?
传统数据库:抽样方式对某一部分的数据进行分析得出结论
大数据分析:将所有数据进行分析
-》全文检索引擎
-》Lucene
-》solr+Hbase
-》ElasticSearcch+Logstash+Kibana
我们在淘宝上查询我们的订单,如果只用关系型数据库的话估计需要一两分钟,
这时候的用户体验就会非常差。所以查询不会只依赖关系型数据库。
这时候就诞生了全文搜索引擎,这就解决了大数据查询问题。
分布式列存储NoSQL数据库
-》分布式:主从架构
主:Master -》 NameNode
Backup Master
从:RegionServer -》DataNode
-》列存储
rdbms:行存储
对于一行来说,每一列都是有的,即使某些列没有值为null值,该列也存在
hbase:列存储
对于一行来说,列有值,才有该列,如果该列没有值,则该行没有该列
-》NoSQL:Not Only SQL
-》不支持SQL
-》有自己的语言
-》数据库:
RDBMS:
数据库、表、行、列
NoSQL:
key:列的名称
value:列的值
MySQL:
Database:student
Table:stu_info
id name age sex address phone
110 laoda 18 male shanghai 110
120 laoer 20 female 120
119 laodan 22 beijing 119
select id,sex,address from stu_info where id=120 or id = 119;
120 female null
119 null beijing
关系型数据库缺陷:存储慢、查询效率低
企业中的开发模式:NOSQL缓存,最终存储是关系型数据。快速存储和查询用NOSQL做中转(中间层),
然后将数据写入到关系型数据库中(底层)。
Hbase:
NameSpace:student
Table:stu_info
rowkey:行健,等同于rdbms中的主键
主键是单独的,不属于任何列簇
column family:列簇
将拥有相似属性的列进行分组
所有的列不允许单独存在,必须属于某个列簇下,每张表至少要有一个列簇
列簇下面可以没有列
rowkey:110
cf1:basic_info
name laoda
age 18
sex male
cf2:family_info
address shanghai
phone 110
rowkey:120
cf1:basic_info
name laoer
age 20
sex female
cf2:family_info
phone 120
rowkey:119
cf1:basic_info
name laosan
age 22
cf2:family_info
address beijing
phone 119
-》如果Hbase支持SQL语句
select id,sex,address from stu_info where id=120 or id = 119;
error:120的记录中没有address这一列,119的记录中没有sex这一列
特殊概念
-》namespace:相当于mysql中的database
-》rowkey:行健、相当于mysql中的主键,是hbase中数据读写的唯一索引
-》列簇:列的分组,将拥有相似读写属性的列放入同一个列簇
至少一个一般两个,但不要超过3个 原因:随着数据的增加,HBase的查询
性能会很慢
名称任意,只要进行分组即可
-》version:多版本,hbase可以将之前存储过的值继续保留,而不被覆盖
查询时可以通过指定版本查询对应的数据
一般来说,通过每条记录的timestamp来区分版本
-》列标签:相当于mysql中的列
-》keyvalue格式:hbase底层存储将每一列变成keyvalue 进行存储
key:rowkey+cf+column+timestamp
value:该列某个版本的值
-》创建表时:表名+列簇
>>不需要给列,列是动态的不是固定的(这也是与关系型数据库不同的地方)
-》hbase中没有数据类型之分,全部是字节数组类型
写入:将其他类型转换成字节数组
读出:将字节数组转换为可读类型
hbase的基本架构
-》主从架构:server
master:管理
regionserver:存储读写
-》zookeeper:
-》存储hbase的元数据
-》client
三、Hbase安装部署
-》Hadoop:安装启动
-》zookeeper:存储元数据
安装Zookeeper
五个框架都在用Zookeeper:hadoop、hive、HBase、sqoop、Spark Streaming
[root@bigdata-training01 tools]# tar -zxvf zookeeper-3.4.5-cdh5.7.6.tar.gz -C /opt/cdh-5.7.6/
[root@bigdata-training01 zookeeper-3.4.5-cdh5.7.6]# mkdir datas
[root@bigdata-training01 datas]# cd datas/
[root@bigdata-training01 datas]# pwd
[root@bigdata-training01 datas]# cd ../conf
[root@bigdata-training01 datas]#ll
修改zoo.cfg
修改Zookeeper的存储目录
dataDir=/opt/cdh-5.7.6/zookeeper-3.4.5-cdh5.7.6/datas
[root@bigdata-training01 zookeeper-3.4.5-cdh5.7.6]# bin/zkServer.sh
[root@bigdata-training01 zookeeper-3.4.5-cdh5.7.6]# bin/zkServer.sh start
[root@bigdata-training01 zookeeper-3.4.5-cdh5.7.6]# jps
[root@bigdata-training01 zookeeper-3.4.5-cdh5.7.6]# bin/zkServer.sh status
单节点模式:
原因:这里练习使用所以装的是伪分布式,不是分布式。所以就是单节点模式,不是主从架构。
安装hbase
如何找到hdfs-default文件:
/opt/cdh-5.7.6/hbase-1.2.0-cdh5.7.6/lib/hbase-common-1.2.0-cdh5.7.6.jar
tar -zxvf /opt/tools/hbase-1.2.0-cdh5.7.6.tar.gz -C /opt/cdh-5.7.6/
修改配置
hbase-env.sh
修改环境变量
export JAVA_HOME=/opt/modules/jdk1.8.0_91
#hbase管理我们的zk(默认ture,改为flase表示不希望HBASE管理我们的zk)
export HBASE_MANAGES_ZK=false
hbase-site.xml
[root@bigdata-training01 hbase-1.2.0-cdh5.7.6]# mkdir datas
[root@bigdata-training01 hbase-1.2.0-cdh5.7.6]# pwd
是否是分布式应用:
配置zookeeper地址:
客户端只有访问Zookeeper才能读取元数据
regionservers:配置所有从节点的地址
bigdata-training01.erongda.com
启动服务
启动主节点:
bin/hbase-daemon.sh start master
启动从节点:
bin/hbase-daemon.sh start regionserver
如果配置了SSH免秘钥登录,就可以使用下面命令启动:
测试
-》web端:60010
apache hbase1.x: 16010
http://192.168.134.222:60010/master-status
-》客户端
bin/hbase shell
四、实现hbase的DDL与DML
在MySql中执行db_order.sql文件
创建namespace
help 'create_namespace'
create_namespace 'ns1'
list_namespace
创建表
语法:create 'namespace:tablename','cf_name'
create 'ns1:order', 'info'
查看表
插入数据
Mysql中数据:
help 'put'
put 'ns1:t1', 'r1', 'c1', 'value'
put 'namespace:tablename','rowkey','columnfamily:column','value'
一次put只能插入一行中的一列
put 'ns1:order','40419271_2015-04-21:00:00:21_314295453511152','info:date','2015-04-21 00:00:21'
put 'ns1:order','40419271_2015-04-21:00:00:21_314295453511152','info:order_id','314295453511152'
put 'ns1:order','40419271_2015-04-21:00:00:21_314295453511152','info:user_id','17291404'
put 'ns1:order','40419271_2015-04-21:00:00:21_314295453511152','info:order_amt','55'
put 'ns1:order','40419271_2015-04-21:00:00:21_314295453511152','info:order_id_new','251115354592413'
注意:必须要给出列簇
查询数据
get:自己回去看语法
语法:scan 'hbase:meta':扫描查询整张表
help 'scan'
scan 'ns1:order'
注意:这是MySql中的一条数据,一列对应一行,行键和列簇都是冗余的
HBase注意事项:
注意:这里每一行存每一个字段都是用key-value的格式
这里的keys是由row,column,timestamp组成的,这里会有冗余。
注意:
1-语法中不要有分号结尾
2-删除时请按住Ctrl键
3-hbase中没有use,不能切换数据库
想要使用数据库,在表名前面加上ns的名称即可
退出hbase shell
exit