NoSQL在大数据体系中的作用
- 数据存储工具
- 把数据存储或映射为表格形式
- 把数据存储成适于使用的模式
- 实现分布式存储
- 数据管理工具
- 对数据“库”、“表”或类似的概念进行管理
- 对存储的数据进行管理,对数据的性能和可靠性等进行管理
- 对分布式系统进行管理,对系统的配置方式、运行状态等进行管理
- 数据查询工具
- 快速查询海量数据
- 提供易用的客户访问接口
- 一般无法进行过于复杂的查询,或查询性能极低
NoSQL一般不会
- 提供实时数据采集功能
- 提供复杂的数据预处理、数据分析、数据挖掘等功能
- 提供完整的数据可视化等功能
大多数NoSQL系统需要在分布式系统中存储数据
- 希望通过并行处理提高数据查询和处理效率,因此进行数据分片, 使用布隆过滤器等
- 为提高可靠性采用数据多副本机制,由此带来一致性等问题,进而延伸出主从结构下的分布式选举等问题(引出Paxos),以及集群时间同步等问题
- 系统可伸缩(横向扩展、移除或更换故障节点等)
- 系统要易用
- 大数据场景下,数据一般是一次写入多次读取的,很多设计策略是与此相关的
HBase的基本特点
- 分布式、主从架构、底层基于HDFS,基于Java语言开发
- 可伸缩、高可靠性、易于使用
- 基于键值对+基于列(族)的数据存储模式
- 可以基于Shell进行操作
- 原生的Java语言调用接口,支持远程调用
- 支持通过thrift,实现跨语言、跨平台调用
- 实现数据的分布式存储和统一管理
- 实现数据条目的随机增删改
- 实现大数据的实时查询
HBase的主要弊端
- 不支持复杂的统计和处理操作
- 不支持二级索引,行键天然是一级索引,对于键值对内容无法方便的实现 索引
- 对时序数据的存储,需要考虑热点问题
- 是否可以让“NoSQL”支持“SQL”语言
HBase和关系型数据库对比
- 无模式和表结构、数据结构简单
- 无法实现事务、多表查询等机制
- 可以存储多个版本的数据
- 分布式存储、易扩展
- 面向列的存储模式,更适合存储稀疏数据
HBase和其他NoSQL对比
- 需要部署HDFS+HBase,甚 至Zookeeper等组件,部署过程 相对复杂
- 大数据的(简单)查询功能出色
- 和MapReduce、Spark等大数据 处理工具配合良好
- 采用主从式架构
- 应用广泛、扩展组件很多
表名、列族名
行键、列名、时间戳、值
Hmaster和Hregionserver
HMaster负责对Hregionrever的管理范围 进行分配,但不负责管理用户数据表
每个Hregionrever只会对一部 分分区进行管理——负责数据的写入、 查询、缓存和故障恢复等。用户表最终 是以文件形式存储在HDFS上,但如何写入并维护这些文件,则是由 Hregionrever负责的
bin:集群控制命令和HBase shell命令
lib:HBase的各种库包(Jar包)
conf:配置文件
通过浏览器访问:http://hmaster:16010/ 查看HBase的运行情况
进入shell:hbase shell
hbsae shell
- 不支持SQL
- 列名、表名采用单括号包括
- 参数大小写敏感
- 同一个表中不能有同名的列族
Hbase基本操作
- create:创建表
- alter:修改表结构
- describe:描述表结构
- exist:确认表是否存在
- list:显示所有表名列表
- disable/enable:禁用/解禁一个表
- disable_all/enable_all:禁用/解禁所有表
- is_disabled:确认表是否被禁用
- drop/drop_all:删除一个或全部表
- truncate:禁用、删除并重建一个表
- Put:即插入(insert)和更新 (update)
- get:根据行键获取一条数据
- scan:扫描一个表,可以指定行键范围或使用过滤器限制范围
- count:查询逻辑行的数量
HBase的存储和读写机制
- 预写日志WAL的作用
- 出现节点宕机、线程重启等问题时,memstore中未持久化的数据会丢失。当Regionserver恢复后,会查看当前WAL中的数据,并将记录进行重放(replay),根据记录的表名和分区名,将数据恢复到指定的store中
- 数据的写入
- Regionserver负责向对应的表分区和列族中写入数据,管理缓存和排序,以及实现容错
- 打破HDFS无法随机更新的限制
- HFile的结构及布隆过滤器如何发挥作用
- Storefile可以看做简单封装的HFile,其内容一旦写入就无法更改
- HFile是一种经过排序的序列化文件
- 内容基本都是以键值对方式存储的,易于被HDFS分块
- Hfile格式仍处在不断演进当中,目前通用的是Hfile v3版本
- Storefile对应列族
- Storefile可以看做简单封装的HFile,其内容一旦写入就无法更改
- 合并与拆分,面向列族还是分区
- 分区(Region):对应表的横向拆分
- Store:对应(列族)纵向拆分
- HBase三种分区方式:自动分区、预分区和手动拆分
HBase的高可用性机制
HBase可以进行的扩展操作
- 协处理器机制
- 轻量级的分布式处理机制
- Observer和Endpoint两种模式,Observer模式就如同关系型数据库中的 触发器,而Endpoint如同关系型数据库中的存储过程
- 基于HBase的分布式处理
- Hive可以直接建立、读取HBase的表 ,并映 射为Hive表
- Hive提供了类似SQL和Hive QL语言
- Hive在进行复杂的数据统计和聚合操作时,省去了编写MapReduce程序的过程,提高了易用性
- Mapreduce可以直接将HBase表作为数据源或作为处理目的地
- 扩展开源软件
- 面向时序数据管理的OpenTSDB
- OpenTSDB所存储的实际数据都存储在名为tsdb的HBase表中
- 提供SQL语言支持的Apache Phoenix
MongoDB
- 文档型的数据模型,可以在一个表中存储复杂的数据结构
- 支持分片、多副本等分布式数据管理机制,也可以单机使用
- 支持地理信息索引
- 具有一个轻量级的分布式文件系统
- 并未提供类似SQL的操作方法
- 可以和Java、Python以及Javascript等常见语言配合使用,支持同步或异步的调用方式
图数据库
- 图数据库是一种简单易用的、处理点 线关系的数据库
- 在Windows上安装方便
- 一般单机使用,而非集群化部署
- 通过Cypher语言操作数据
内存数据库
- 可以看作键值对数据库的分支
- 通常作为WEB架构中的缓存系统
- 其分布式部署策略和Cassandra、 MongoDB等均有相通之处
全文检索和搜索引擎
- 可能和Hadoop、HBase建立联 系
- 学习的重点在于算法和优化
- 可以直接使用Solr、 Elasticsearch等集成化软件
CPA和BASE、弱一致性
分片和多副本的代价
采用灵活的数据模型,是为了分布式环境下更好的灵活性和分片性能
关系数据库的特点
- 数据的存储将独立于硬件
- 呈现给 用户的是二维表结构
- 可以通过SQL语句实现数据定义和操作
- 支持事务和ACID一致性
非关系型与关系型数据库的比较
- 非关系的数据模型
- 弱化模式或表结构、弱化完整性约束、弱化甚至取消事务机制
- 无法支持,或不能完整的支持SQL语句
- 实现强大的分布式部署能力——一 般包括分区容错性、伸缩性和访问效率( 可用性)等
- 不同类型的关系型或NoSQL数据库侧重点 不同,不能简单地说谁更优秀
大数据4V特征
- 大量(volume)
- 高速(velocity)
- 多样(variety)
- 低价值密度(value)
NoSQL的主要特点
- 非关系型存储模式
- 通过牺牲事务、一致性、SQL语句等RDBMS中重要的机制,换取更好的分 布式部署特性
- 和RDBMS有不同的侧重点(大数据量、简单查询)
- 习惯统称,并非严谨定义
ACID
原子性、一致性、隔离性、持久性
CAP
一致性、可用性、分区容错性
BASE
最终一致性,即事务存在中间状态,但经历一段时间之后,最终会一致
数据分片的目的
使数据均匀分布到多个节点上,执行查询或处理任务时,各个节点只查询自身数据, 实现并行处理
架构
- 主从架构:主节点负责存储元数据,和客户端访问接口,从节点负责存储数据分片
- 对等结构:无主节点,各个节点都可以接受客户端访问请求,如果自身没有存储相关 分片,则该节点回去向其他节点查询数据
关系模型
实体、属性、实体标识符、联系
关系模型中的完整性约束
域完整性、实体完整性、参照完整性、用户自定义完整性
NoSQL经常用来处理日志、存档资料类的信息,例如交易记录
RDBMS经常用来处理业务数据,例如账户余额
在分布式数据管理中,需要保持集群的高性能、高可靠性和易用性
进行分布式数据管理的主要目的是通过横向扩展提升数据存储、管理、查询和 处理性能
负载均衡:数据分片,并均匀分布在各个节点上;计算本地化,节点只查 询自身的数据
集群可伸缩:集群规模可以随着数据增长进行横向扩展
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q3qRLpFf-1625117886704)(https://i.loli.net/2021/06/26/5t2cN4oIX6TPZUy.png)]
HDFS:分布式文件系统
YARN:分布式资源管理
MapReduce:分布式计算框架
Hive:分布式数据仓库
HBase:分布式NoSQL数据库
Spark、Tez:分布式计算引擎
Flume:数据采集
Sqoop:和关系型数据库进行数据互转
Oozie/Hue:工作流、可视化操作
Ambari/Cloudera:集成化解决方案
Mahout:分布式数据挖掘
Pig:通过简化的数据操作语言执行MapReduce
Zookeeper:分布式协调服务
NameNode:负责存储文件和分块信息
SecondaryNameNode:只负责帮助NameNode压缩元数据
DataNode:负责存储具体分块
一台物理节点可能同时部署为NN、SNN、DN
NameNode数据结构:
- FSImage:只读状态,在NN启动时整体读入内存
- EditLog:以日志方式存储文件信息的变动情况
在NN启动时,构造新的FSImage,并将其读入内存,此过程中HDFS接受读请求,不接受写请求,该过程称为安全模式
EditLog需要定期合并,形成新的FSImage,FSImage文件过大,可能造成启动缓慢
HDFS写数据:
数据一旦写入,则无法被随意修改,否则会提高多副本一致性上的复杂度, 以及提高元数据维护上的复杂度
HDFS读数据:
NN将当前数据副本 的所在节点列表发给 客户端,客户端可以 找到一个可用的节点 进行读取
客户端可以从NN 持 续获得所有数据块的 存储位置,并直接向 合适的DN读取数据
HDFS可以通过http://namnode:50070/查看 系统的状态
stop-dfs.sh
start-dfs.sh
Hive的实时检索能力很弱。因此,Hive一般不会被当作NoSQL数据库使用, 而是作为数据仓库工具或MapReduce的替代性工具使用
Hive可以将HDFS文件映射为二 维数据表,并且支持将SQL语句(实际是Hive QL语言,简称HQL)转化为 MapReduce或Tez过程,其目的是将复杂的MapReduce编程转换为简单的 SQL语句编写
HDFS不能实现表格化管理与查询,无法实现数据的随机更新
输入访问地址:http://localhost:7474/,进入 neo4j的web操作界面
Redis的特点
- 支持数据多副本、主从复制机制
- 支持主节点选举机制
- 在内存管理方面,Redis支持最近最少使用算法(Least Recently Used, LRU)
- 提供了多种数据持久化(存储到硬盘)策略,常见的策略有RDB和 AOF
- RDB是指在指定时间间隔,将数据保存为快照(.rdb文件),其经常 用于整个数据集的备份,存储格式比较紧凑,备份恢复性能较高
- AOF是指逐次记录写入服务器的数据条目,追加到一个.aof文件末尾。 AOF文件的易读性、实时性较好,但文件体积较大
- 支持发布订阅机制(即可以作为消息队列使用)
- 支持多种数据格式:字符串(string)、散列(hash)、列表(list)、 集合(set)、有序集合(sorted set)等
- 支持200多个Redis命令(操作方法)
- 支持多种主流编程语言
- 支持“事务”——实际上是一种批处理机制,并非RDBMS的事务
- 存在多种图形化管理工具
9042(默认的CQL本地服务端口)、9160(默认的Cassandra服务端口)、 7000(Cassand集群内节点间通信端口)、7199(Cassandra JMX 监控端 口)等端口
systemctl start Cassandra
nodetool info
nodetool status
CQL
- 不支持批量写入(包括insert、 update或delete)
- 不支持join查询
- 不支持事务、锁等机制
- 不支持 group by、having、max、 min、sum、distinct 等分组聚合 查询语法
- 条件查询时的限制较多
CQL数据类型
- 字符串
- ASCII
- text/varchar
- 整型
- tinyint
- smallint
- int
- bigint
- varint
- 浮点型
- decimal
- float
- double
- 时间型
- data
- time
- timestamp
- timeuuid
- duration
- 其他类型
- blob:任意字节数组
- boolean
- counter
- inet:IP地址
- uuid
list、map和set类型的列如果是非frozen限定的(序列化),均无法作为主键, 而元组(tuple)类型(col5)无此限制
计数器列不能作为主键,且计数器列不能建立索引
BSON支持的数据类型
- ObjectID:对象ID,每个文档必 须拥有一个唯一的ID
- String:utf-8编码的字符串,在 文档中使用双引号引用
- Boolean:布尔值,true 或者 false
- Integer:整数
- Double:浮点数
- Arrays:数组或者列表
- Object:嵌入文档,一个值为一 个文档
- Null:空值
- Timestamp:时间戳
- Minkey/Maxkey:BSON中的最 低值和最高值
- Date:UNIX格式的日期或时间
- BinaryDate:二进制数据
- BSoN中还包括正则表达式、 JavaScript代码等
- 通过支持Arrays,文档可以支持嵌 套
MongoDB支持三种分片策略:升序分片、哈希分片和位置分片,分片在存储时分成默认64M大小的chunk,chunk是数据平衡的最小单位
Mongod:存储实际数据分片
Mongos:用户访问集群的入口,负责与客户端交互,并在内存中缓存分片数据的存储和路由信息,兼具平衡存储的 balancer组件功能
Config服务器:负责持久化存储各类元数据和配置信息
mongod的默认端口为27017
db.createCollection(“mycol”)
db.myCol.drop()
db.createCollection(“cappedC ol”,{capped:true,size:10000}),定长集合
db.mycol.insert({ item1: ‘first item’, item2: ‘second item’, item3 : 1, item4: [‘apple’,‘banana’,‘cherry’] })
db.mycol.find().pretty()
db.mycol.update( { “item3” : { $gt : 0 } } , { $set : { “item2” : “OK”} } );
删除一条,db.collection.remove({“item3” :{$gt:0}},true)
删除全部,db.col.remove({})
常见的管道操作包括:$group、$project 、$match、$sort、$limit和 $skip等
常见的聚合运算符包括:$sum、$avg、$min/ $max、$first/ $last和 $push等
常见的比较运算符包括:$gt/$lt、$gte/$lte、$ne等
此外还支持与、或($or)、$in/$nin等逻辑或范围运算符
db. mycol.createIndex({“item1”:1}),第一个为字段名;第二个1表示升序,-1表示降序
MongoDB支持的索引类型:完全索引、稀疏索引、唯一索引、全文索引、地理位置索引
文档大小限制为16MB,轻量级的分布式文件系统——GridFS
GridFS实际上仍采用MongoDB的文档和集合方式存储分块后的文件——将 文件分块存储为两个集合(格式和普通集合相同)
- 一个集合称为files,存储文件和分块的元数据信息
- 另一个集合称为trunk,存储数据分块本身
mongofiles -h node1:27017 -d mydb list,-h参数表示连接到相应的节点和端口。-d参数表示连接到哪个数据库
导入数据mongoimport、导出数据:Mongoexport、数据库备份 mongodump、恢复数据 mongorestore