Introduction - NOSQL
•HBase is a type of "NoSQL" database.
•"NoSQL" is a general term meaning that the database isn’t an RDBMS which supports SQL as its primary access language.
•It lacks many of the features of RDBMS, such as secondary indexes, triggers, and advanced query languages
•there are many types of NoSQL databases:
http://db-engines.com/en/ranking
为什么需要NoSQL?
1、高并发读写 2、海量数据的高效存储和访问 3、高可拓展性和高可用性
NoSQL特点:
1、易拓展 2、大量数据、高性能 3、灵活的数据类型 4、高可用
NoSQL种类:redis、hbase、mongoDB
NoSQL数据库的四大分类:
1、键值(key-value)存储如redis 2、列存储如hbase 3、文档数据库mongoDB 4、图形数据库
When Should I Use HBASE ?
•HBASE isn’t suitable for every problem.
•First, make sure you have enough data.
ØIf you have hundreds of millions or billions of rows, then HBASE is a good candidate.
ØIf you only have a few thousand/million rows, then using a traditional RDBMS might be a better choice
•HBASE is a distributed column-oriented database built on top of HDFS.
•HBASE is the Hadoop application to use when you require real-time read/write random access to very large datasets.
•built with very large scale and distribution in mind
•It is built from the ground up to scale linearly just by adding nodes.
•HBASE is not relational and does not support SQL, but it is able to do what an RDBMS cannot: host very large, sparsely populated tables on clusters made from commodity hardware.
HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族(row family)
Row Key
与nosql数据库们一样,row key是用来检索记录的主键。访问hbase table中的行,只有三种方式:
1 通过单个row key访问
2 通过row key的range
3 全表扫描
Row key行键 (Row key)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,row key保存为字节数组。
存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)
注意:
字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行键必须用0作左填充。
行的一次读写是原子操作 (不论一次读写多少列)。这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为。
列族
hbase表中的每个列,都归属与某个列族。列族是表的chema的一部分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如courses:history , courses:math 都属于 courses 这个列族。
访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中,列族上的控制权限能 帮助我们管理不同类型的应用:我们允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因 为隐私的原因不能浏览所有数据)。
时间戳
HBase中通过row和columns确定的为一个存贮单元称为cell。每个 cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由hbase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个 cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。
Cell
由{row key, column( =<family> + <label>), version} 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。
hbase 查询相当简单,提供了get和scan两种方式,scan是全表扫描,get是根据rowkey作查找。
hbase知识点总结:https://blog.youkuaiyun.com/lukabruce/article/details/80624619
hbase 提供了很多过滤器,可对行键,列,值进行过滤。过滤方式可以是子串,二进制,前缀,正则比较等。条件可以是AND,OR等 组合。
filter like "where" in "SQL", such as select * from tablea where id = 123 and name like 'tom%';
过滤器类型
列值型过滤器 SingleColumnValueFilter
键值元数据过滤器 FamilyFilter QualifierFilter ColumnPrefixFilter
行键过滤器 RowFilter
other FirstKeyOnlyFilter
比较器
RegexStringComparator 支持值比较的正则表达式
SubstringComparator 用于检测一个子串是否存在于值中。大小写不敏感。
BinaryPrefixComparator 二进制前缀比较
BinaryComparator 二进制比较
hbase特点:
容量大:单表可以存储几百亿行,百亿列
面向列:动态增加列,可以对每一列单独操作,列(族)独立检索
稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
一些常用hbase命令:
1、进入hbase console :hbase shell
创建namespace :create_namespace 'namespace'
查看namespace :describe_namespace 'namespace'
删除namespace :drop_namespace 'namespace'
在namespace下创建表 :create 'namespace:table','fml'
查看namespace下的表 :list_namespace_tables 'namespace'
2、建表
hbase>create 't1','f1','f2' //ti 表名 f1、f2列族名
例如:hbase>create 'app:message','msgbody','msgheader'
3、查看表
scan 'app:message','msgbody'
4、清空表
truncate 'app:message'
5、删除表( 分两步)
disable 'app:message'
drop 'app:message'
6、查看rowkey(范围)
scan 'app:message', {STARTROW=>'rowkey1',ENDROW=>'rowkey2'}
7、查看表结构
describe 'app:message'
8、删除具体记录(删除该rowkey记录的所有数据)
deleteall 'app:message','Rowkey'
9、获取指定行的数据
get 'app:message' , 'Rowkey'
10、增加列族
disable 'app:message'
alter 'app:message',NAME=>'status' //新增列族名status
describe 'app:message' //查看是否添加成功
使用了disable 'app:message'再使用enable 'app:message' 才可以继续操作
11、写入数据
put 'app:message' , 'rowkey' , 'msgid:id', '123'
hbase应用场景:交通、金融、电商、通信
HBase优化方法有哪些?
优化手段主要有以下四个方面
1)减少调整
减少调整这个如何理解呢?HBase中有几个内容会动态调整,如region(分区)、HFile,所以通过一些方法来减少这些会带来I/O开销的调整
- Region
如果没有预建分区的话,那么随着region中条数的增加,region会进行分裂,这将增加I/O开销,所以解决方法就是根据你的RowKey设计来进行预建分区,减少region的动态分裂 - HFile
HFile是数据底层存储文件,在每个memstore进行刷新时会生成一个HFile,当HFile增加到一定程度时,会将属于一个region的HFile进行合并,这个步骤会带来开销但不可避免,但是合并后HFile大小如果大于设定的值,那么HFile会重新分裂。为了减少这样的无谓的I/O开销,建议估计项目数据量大小,给HFile设定一个合适的值
2)减少启停
数据库事务机制就是为了更好地实现批量写入,较少数据库的开启关闭带来的开销,那么HBase中也存在频繁开启关闭带来的问题。
- 关闭Compaction,在闲时进行手动Compaction
因为HBase中存在Minor Compaction和Major Compaction,也就是对HFile进行合并,所谓合并就是I/O读写,大量的HFile进行肯定会带来I/O开销,甚至是I/O风暴,所以为了避免这种不受控制的意外发生,建议关闭自动Compaction,在闲时进行compaction - 批量数据写入时采用BulkLoad
如果通过HBase-Shell或者JavaAPI的put来实现大量数据的写入,那么性能差是肯定并且还可能带来一些意想不到的问题,所以当需要写入大量离线数据时建议使用BulkLoad
3)减少数据量
虽然我们是在进行大数据开发,但是如果可以通过某些方式在保证数据准确性同时减少数据量,何乐而不为呢?
- 开启过滤,提高查询速度
开启BloomFilter,BloomFilter是列族级别的过滤,在生成一个StoreFile同时会生成一个MetaBlock,用于查询时过滤数据 - 使用压缩:一般推荐使用Snappy和LZO压缩
4)合理设计
在一张HBase表格中RowKey和ColumnFamily的设计是非常重要,好的设计能够提高性能和保证数据的准确性
-
RowKey设计:应该具备以下几个属性
- 散列性:散列性能够保证相同相似的rowkey聚合,相异的rowkey分散,有利于查询
-
简短性:rowkey作为key的一部分存储在HFile中,如果为了可读性将rowKey设计得过长,那么将会增加存储压力
-
唯一性:rowKey必须具备明显的区别性
-
业务性:举些例子
- 假如我的查询条件比较多,而且不是针对列的条件,那么rowKey的设计就应该支持多条件查询
- 如果我的查询要求是最近插入的数据优先,那么rowKey则可以采用叫上Long.Max-时间戳的方式,这样rowKey就是递减排列
-
列族的设计
列族的设计需要看应用场景- 多列族设计的优劣
- 优势:HBase中数据时按列进行存储的,那么查询某一列族的某一列时就不需要全盘扫描,只需要扫描某一列族,减少了读I/O;其实多列族设计对减少的作用不是很明显,适用于读多写少的场景
- 劣势:降低了写的I/O性能。原因如下:数据写到store以后是先缓存在memstore中,同一个region中存在多个列族则存在多个store,每个store都一个memstore,当其实memstore进行flush时,属于同一个region
的store中的memstore都会进行flush,增加I/O开销。
- 多列族设计的优劣
每天百亿数据存入HBase,如何保证数据的存储正确和在规定的时间里全部录入完毕,不残留数据?
1、存入HBase:普通写入是用API put来实现,批量导入推荐使用BulkLoad
2、保证数据的正确:这里需要考虑RowKey的设计、预建分区和列族设计等问题
3、在规定时间内完成也就是存入速度不能过慢,并且当然是越快越好,使用BulkLoad
说一下你对hadoop生态圈的认识
没有固定答案,主要从hdfs底层存储,hbase数据库,hive数据仓库,flume收集,Kafka缓存,zookeeper分布式协调服务,spark大数据分析,sqoop数据互转来说。
Hadoop 是一个开源软件框架,用于存储大量数据,并发处理/查询在具有多个商用硬件(即低成本硬件)节点的集群上的那些数据。总之,Hadoop 包括以下内容:
HDFS(Hadoop Distributed File System,Hadoop 分布式文件系统):HDFS 允许你以一种分布式和冗余的方式存储大量数据。例如,1 GB(即 1024 MB)文本文件可以拆分为 16 * 128MB 文件,并存储在 Hadoop 集群中的 8 个不同节点上。每个分裂可以复制 3 次,以实现容错,以便如果 1 个节点故障的话,也有备份。HDFS 适用于顺序的“一次写入、多次读取”的类型访问。
MapReduce:一个计算框架。它以分布式和并行的方式处理大量的数据。当你对所有年龄> 18 的用户在上述 1 GB 文件上执行查询时,将会有“8 个映射”函数并行运行,以在其 128 MB 拆分文件中提取年龄> 18
的用户,然后“reduce”函数将运行以将所有单独的输出组合成单个最终结果。
YARN(Yet Another Resource Nagotiator,又一资源定位器):用于作业调度和集群资源管理的框架。
Hadoop 生态系统,拥有 15 多种框架和工具,如 Sqoop,Flume,Kafka,Pig,Hive,Spark,Impala 等,以便将数据摄入 HDFS,在 HDFS 中转移数据(即变换,丰富,聚合等),并查询来自 HDFS 的数据用于商业智能和分析。某些工具(如 Pig 和 Hive)是 MapReduce 上的抽象层,而 Spark 和 Impala 等其他工具则是来自 MapReduce 的改进架构/设计,用于显著提高的延迟以支持近实时(即 NRT)和实时处理
Hadoop集群有哪些运行模式?
单机(本地)模式
伪分布式模式
全分布式模式