概述
当下主流的流计算使用Flink
Hadoop
Hadoop的核心组件:HDFS(分布式文件系统)、Yarn(资源调度)、MapReduce(批量计算引擎)
HDFS
HDFS -- Hadoop Distributed File System
HDFS核心进程(组件):NameNode,DataNode
NameNode:名称节点 主要存放元数据 eg文件的名称 路径 大小 副本数量 权限 所属用户等
DataNode:数据节点 存放数据本身 打开文件看到的内容
随着操作次数的增加,Editlog占用的存储空间会越来越大,为了保证元数据不丢失,Editlog和FsImage会定期合并
元数据既保存在内存中也在磁盘中 HDFS服务启动后会把磁盘中的元数据加载到内存中
200MB的文件,在HDFS中通过两个block块[抽象的块]保存。每个block都是128MB
第一个块:128MB
第二个块:也是128MB 虽然block显示128MB,其实只会占用真实大小,也就是72MB
硬盘容量1T,但是实际能用的没有这么多,block id、datanode都会占用存储空间
单节点容易出现单点故障,企业一般用HA(会用到zookeeper)
元数据持久化:为了保证内存的元数据不丢失,会定时将内存的元数据保存到磁盘对应路径
HDFS联邦(Federation):为了解决nn横向扩展能力 因为nn保存了很多元数据,但是nn的内存是有限的,为了能够存放更多的元数据,因此使用联邦机制
服务器数量更多,应用于超大规模的数据场景 各nn负责自己所属目录(与Linux挂载磁盘到目录类似),各nn间元数据不共享,每个nn都有对应的standby
对客户端来说无感知
HA和联邦的关系
数据副本机制:为了保证数据不丢失
数据很重要就多备份,但都备份到一个地方和没做一样(上图3个机架15台服务器)
上图反映的HDFS副本基本策略是:
第一个副本存放在与客户端最近的节点(服务器)
第二个副本存放在与客户端相邻机架的任意一个节点
第三个副本存放在与客户端相同机架的任意一个节点
其他的副本根据节点的容量任意存放
数据存储分为:集中式存储,分布式存储
集中式存储主要通过raid技术,保证数据安全性
分布式存储主要通过block块存储的方式保证数据安全性
一个文件200MB,由两个块组成,一个block128MB,另一个72MB(逻辑大小128),那么每一个块都会有4个副本
当设定文件的副本数量是4个时,假如有一个或多个副本出现损坏,HDFS能够定时监控到,并将缺失的副本数根据副本存放策略进行补充
HDFS通过distance来判断副本距离客户端的远近,为了能更快的访问到需要的数据,所以会判断距离,优先将距离近的数据提供给客户端
安全模式:两种情况会出现安全模式
第一种在HDFS启动时,元数据还没有加载到内存中,直到元数据大约有99.98%都成功加载到内存时,才会退出安全模式
第二种当datanode节点损坏数量变多
在linux操作系统上对HDFS的操作
HDFS dfs ..
Zookeeper
分布式协调服务
HA中组件多了两个进程:
JN:实时同步两个namenode元数据信息,保证元数据的一致性
ZKFC:实时监控active namenode状态,当发现active nn出现异常情况,就会将standby nn马上切换为active状态,对外提供服务
启动时选举出leader
容灾哪里:不挂一半就没什么问题(建议奇数台 奇偶数容灾能力一样)
HBase
列式数据库 实时响应速度毫秒级
HBase的元数据存储在HBase表中的元数据表(metadata meta表)
实时检索项目一般使用hbase 通过hbase和elasticsearch结合起来实现
行列 列族 行键
key是字典序 查找看key 可以存稀疏数据
插入的数据需要指定rowkey info(列族) name(列限定符)
HReginServer中的核心组件: HLog:预写日志WAL,所有写入hbase的数据都会写入hlog中
memStore:写入内存,hbase在写入数据时,会直接写入到内存,当数据写入到内存成功就会给客户端返回写入成功的信息
HRegin:用来保存hbase的数据
store:和列族有对应关系
storeFile(HFile):写入磁盘,将hbase数据写入磁盘,是为了数据持久化,当内存数据占比80%时,会自动启动flush操作,将内存的数据刷入磁盘,刷入成功后,会将hlog这部分的数据删除
zookeeper帮助选举出一个hmaster(管理用户对表的操作、实现不同hregionserver间的负载均衡、在region分裂或合并后负责重新调整region分布、对发生故障失效的hrs上的r进行迁移)作为集群的总管,并保证在任何时刻总有唯一一个hmaster在运行,这就避免了hmaster的‘单点失效’问题
hregionserver是hbase最核心的模块,负责存储、维护hregion,处理来自client的读写请求
按行键索引,搜索很快
拆分策略默认c.. 单region上限10G
热点region(行键的设置策略):
Hive
数据分析(数仓)
HDFS分布式文件系统 用于海量数据的存放
HBase列式数据库(no sql)解决了HDFS读写数据较慢的缺点,支持毫秒级别的读写
而Hive作为数据仓库,仍然依赖于Hadoop组件,主要作用是数据分析
HDFS中的数据,程序员通过Java编程,编写MapReduce程序进行数据分析,但会编程的工程师占比不高,会sql的相对较高
hive与hadoop之间的关系
hive的元数据与数据是解耦合的,元数据和数据不在一个地方存放
hive的元数据默认保存在derby数据库,derby是一个轻量型的数据库,小到同时只允许一个客服端登录,不适合生产环境,所以使用其他关系型数据库代替derby保存元数据
通常使用MySQL作为hive存放元数据的数据库,hive的元数据有表名,表中数据存放的路径等
Hive内部表与外部表的区别:
内部表:在创建时 是create table
在删除表时,表结构和表中数据都会被清除
外部表:在创建时 时create external table
在删除表时,只会删除表结构,表中数据仍然存在
在加载原始数据时,都会使用外部表 在加载原始数据时使用外部表可以保护数据的完整性和安全性,并提高数据处理的效率
在进行数据分析时,一般使用内部表 在进行数据分析时使用内部表则可以提供更便捷的数据操作、更强的事务支持和更高的数据完整性保障
数仓分层:ODS(original)原始数据层(读取ODS层数据用的都是外部表),DWD(wish)数据清洗层,DWS(server)轻度汇总层,ADS(analysis server)高度汇总层(需求分析 年度 季度汇总 用内部表)
SQL语句分类:
DDL语句 对表,数据库本身的CRUD
DML语句 数据导入导出,将数据导入表中,或将表中的数据导出到HDFS或local
DQL语句 数据查询,select、where、join、group by having、order by、row number()、union等
DCL语句 与授权、安全相关语句,grant、revoke等
Spark
(在华为上只支持spark on Yarn)
现在的项目比较少用MapReduce了,多用Spark处理离线,用Flink处理实时(Flink流批一体)
spark(原生语言scale 执行效率最快)是一种基于内存的快速、通用、可扩展的大数据计算引擎(MapReduce基于磁盘)
目前用的比较多的是批处理(RDD弹性分布式数据集 并行只读),交互式查询(SQL、DataFrames、Datasets)
spark打造了一站式解决平台,包含了 批处理、实时处理、图处理、机器学习
批处理 spark core,它的核心概念就是RDD,RDD是不可变的,能够平行计算,因此比常量的效率高。要进行数据分析时,都需要先将数据转换成RDD,spark实现了一些方式 将数据转换为rdd,eg通过txtfile可以将hadoop读取的数据转换为rdd,可以将数组array、列表list、元组tuple、集合collection转换为rdd进行计算
实时处理,以前是spark streaming,现在是被structured streaming替代,因为spark streaming的实时设计理念是批处理,效率不高,已经停止运维
图计算,spark用于图和图并行计算的一个新组件 在高层次上,GraphX通过引入一个新的图抽象扩展spark rdd(一个有向多图 有向多图是指一个图中可以包含多个方向相同的边,即从同一个起点到同一个终点可以有多条边。这种图在描述某些复杂关系时非常有用,比如社交网络中的朋友关系、交通网络中的路线等),其属性附加到每个顶点和边上
交互式查询spark sql,通过sql形式进行计算和分析,类似于Hive;能够连接Hive或者HBase,直接读取它们的数据,进行计算 核心是DataFrames
MLlib是spark的机器学习库,目标是使机器学习具有可扩展性和简单性,在高层次上提供了算法库、特征化、pipeline、持久性和实用程序等工具
daytona gray 软件排序基准规则
spark比mr快的原因:
spark基于内存存放数据,比磁盘快
spark的数据都在rdd,rdd是只读、并行的 数据不可变 效率会提升
血统机制 rdd之间有依赖机制 当某个rd出现故障,并不需要从头对这个rdd进行计算,只需要从上一个rdd开始计算即可
spark任务在执行前,会划分stage,相当于提前做规划,知道哪些部分可以同时执行,哪些部分需要串行执行 并行的部分会提高效率(涉及宽窄依赖)
stage的划分:
窄依赖:一对一
宽依赖:一对多