写在前面:2021年5月在林子雨老师的MOOC上简单地学习了一点HADOOP和SPARK的内容,整理一下当时记录的笔记。 所有图片来自于教案截图!
HADOOP架构
spark基于内存,速度比Hadoop快(os:但是内存不会炸吗,要硬件条件很好才行啊)
基本概念和架构设计
-
RDD:Resillient Distributed Dataset,分布式内存的一个抽象概念,提供了高度受限的共享内存模型
-
DAG:Directed Acyclic Graph,反应RDD之间的依赖关系
-
Executor:运行在workNode的一个进程,负责运行task
-
application:用户编写的应用程序
-
task:运行在executor上的工作单元
-
Job:一个app包含多个job,一个job包含多个RDD
-
stage:一个job被分为多组task,被称为一个stage,不同stage间没有shuffle依赖关系
运行基本流程
1.构建运行环境,driver构建sparkContext,进行资源的申请、任务的分配和监控
与资源管理器交互
2.资源管理器为executor分配资源,启动进程
3.sparkcontext根据RDD依赖关系构建DAG图,被提交给DAGScheduler解析为Stage,把stage(中包含多个task)交给TaskScheduler管理.
Executor申请Task,TaskSchedule发放给Executor运行
4.Executor反馈运行结果给TaskScheduler,再返给DAGSchduler,结束后写入数据、释放资源
- executor以多线程方式运行task
- 运行过程与资源管理器无关,只要能与executor保持通信即可
RDD
设计背景:
迭代式计算不同计算阶段之间会重用中间结果(MapReduce要写磁盘,磁盘IO、系列化开销大)
RDD提供了抽象数据架构,具体应用逻辑要转换(transformation)
不同RDD之间转换操作形成依赖关系(形成DAG),可实现管道化、避免中间数据存储
- 管道化:一个RDD处理完,马上给下一个RDD作为输入
概念:
只读。一个RDD可能很大,分为多个分区,不同分区可能被保存在不同节点上,可以并行计算。
只有在创建的时候可以改,放进去后不能改;
转换操作可以改(map,join,group by ),此后形成新的RDD。
结点间变换就要通过RDD变换
- Action
- Transformation:粗粒度操作,map,filter,groupBy,join;
中间过程只能使用转换
p.s.spark用scala实现了许多RDD的API
典型执行过程:
- 外部读入数据创建RDD
- Transformation转换操作,产生不同RDD供给下一个转换操作使用
- 最后一个RDD通过“动作”进行转换,输出到外部数据源(生成结果)
不同RDD间的关系成为Lineage(血缘关系)
RDD的特性
- 天生具有容错性
- 中间结果持久化到内存,避免不必要的读写磁盘开销
- 存放数据可以是JAVA对象,避免不必要的对象序列化和反序列化开销
RDD依赖关系:
- 窄依赖;一个父亲分区对应一个孩子分区,或多个父亲分区对应一个孩子分区
- 宽依赖:一个父亲分区对应孩子的多个分区
依赖关系涉及到stage的划分
窄依赖放入一个stage,宽依赖要断开,有算法
stage
可以分为shuffleMapStage和ResultStage
- ShuffleMapStage不是最终的,遇到shuffle就断开,输出边界一定时shuffle;输入可能是shuffle,可能是数据源。本stage可能不存在
- ResultStage,没有输出,直接产生结果、存储。输入可能是shuffle,可能是数据源。
一个job中至少有一个resultStage
流计算
数据的处理模型
数据分为:
-
静态数据,如数据仓库中的数据,只读
-
流数据stream:数据以大量、快速、时变的流形式持续到达;如PM2.5,点击流数据
流计算概念:
实时获取不同数据源的海量数据,进行实时分析,获得价值
基本理念:数据价值随时间的流逝而降低(如点击流)
【大数据:1s定律】
典型框架:IBM StreamBase(针对金融机构),Twitter Storm,Yahoo!S4,Spark Streaming
流计算处理流程
- 数据采集:从多个数据源采集,实时性、低延迟、稳定可靠(如日志采集工具)
分布式日志采集系统:scribe,kafka,linkedin,flume,chukwa - 数据采集基本架构:agent分布在不同数据源上,collector接受多个agent数据,有序可靠高性能转发,store存储(流计算一般不用存储,而是直接处理)
2. 实时计算
3. 实时查询:用户实时收到查询展示
Spark Streaming
可以支持多种输入源、输出源
基本执行流程
以时间片为单位进行拆分,由spark引擎以类似批处理的方式处理每个时间片数据
DStream(Discretized Stream)
对DStream的操作被映射为RDD操作
-
无法实现毫秒级流计算
-
更容易做容错处理
-
兼容批量和实时数据处理的逻辑和算法,对于需要历史数据和实时数据共同分析的场景非常适合
学了好久没复习,现在一整理发现自己都看不懂写的是什么orz希望以后能养成整理笔记的好习惯!