01
—
Spark
Spark系统组件:
Spark系统整体是一个集群架构,主要组件包括:
1. Spark Core:Spark最基础的框架,提供任务调度、内存管理、错误恢复、与存储系统对接等功能。
2. Spark SQL:提供结构化数据的处理功能,可以通过SQL或者DataFrame API进行数据查询和分析。
3. Spark Streaming:提供数据流的处理功能,可以从Kafka、Flume等接收数据,进行处理后推送到存储系统或Dashboard。
4. MLlib:提供机器学习算法和统计函数,可以在Spark上进行机器学习与数据挖掘。
5. GraphX:提供图计算和图算法,可以对图形数据进行处理和分析。
关键组件及功能:
- Driver:驱动节点,用于提交应用,将应用切分成多个任务,实现资源的请求和调度。
- Executor:执行器节点,运行任务并返回结果给Driver。
- Master:负责资源的调度和分配,接收Driver提交的作业,然后将作业切分成多个任务分配到Executor上运行。
- Worker:运行Executor,提供计算资源。
- RDD:弹性分布式数据集,表示一个只读的、分区记录的集合。支持两种类型的分区:Hash和Range。
- DAG:有向无环图,用于跟踪RDD之间的依赖关系,以便进行调度。
Spark工作机制:
Spark是计算任务时,以wordcount计算为例,各个组件的执行过程,其中Driver程序提交应用时,将DAG切分成若干Stage,每个Stage包含若干Task。接下来Driver向Master申请资源,Master分配Executor运行Task。Executor根据Task的计算逻辑,从相应的RDD中获取Partition数据进行计算。每个Task计算完自己的Partition数据后,返回结果给Driver。Driver将所有Task的结果进行合并,最终得到完整的结果。如果有依赖关系,那么后续的Stage会等待之前的Stage完成后再开始执行。当所有的Stage执行完毕,应用结束,Driver会清空DAG和释放资源。
画流程图可参考上篇文章使用chatGPT快速画出高质量的流程图。
Mermaid语法:
graph TD;
A[Driver程序] --提交应用--> B[Master]
B --分配资源运行Task--> C[Executor1]
B --分配资源运行Task--> D[Executor2]
B --分配资源运行Task--> E[Executor3]
C --根据Task计算Partition数据--> F[Task1]
C --根据Task计算Partition数据--> G[Task2]
D --根据Task计算Partition数据--> H[Task3]
D --根据Task计算Partition数据--> I[Task4]
E --根据Task计算Partition数据--> J[Task5]
E --根据Task计算Partition数据--> K[Task6]
F -->|计算完Partition数据| L[结果返回给Driver]
G -->|计算完Partition数据| L
H -->|计算完Partition数据| L
I -->|计算完Partition数据| L
J -->|计算完Partition数据| L
K -->|计算完Partition数据| L
L --合并所有Task的结果--> M[完整的结果]
M --判断是否有依赖--> N[有依赖,等待之前的Stage完成]
M --没有依赖,结束应用--> O[清空DAG和释放资源]
workcount计算流程例子:
Spark实现WordCount时的DAG生成过程,其中初始RDD没有依赖,是DAG的起点。接下来对初始RDD进行flatMap操作,形成包含所有单词的RDD,该RDD依赖于初始RDD。然后对单词RDD进行map操作,将每个单词映射为(单词,1)的格式,形成单词与计数的RDD,该RDD依赖于上一步的RDD。最后使用reduceByKey操作,将具有相同键的值相加,得到最终的(单词,计数)的RDD,该RDD依赖于上一步的RDD。
Mermaid语法:
graph TD;
A[文本数据文件] --读取--> B[初始RDD]
B --flatMap--> C[单词RDD]
C --map--> D[单词,1的数据对RDD]
D --reduceByKey--> E[单词,计数的数据对RDD]
02
—
Flink
Flink系统组件
Flink系统整体是一个分布式流处理架构,主要组件包括:
1. JobManager:负责调度和资源分配,接收客户端提交的作业,然后将作业切分成多个任务分配到TaskManager上运行。
2. TaskManager:运行子任务,提供计算资源。一个TaskManager可以运行多个子任务。
3. Client:提交作业和查询作业状态。
4. Dispatcher:接收Client提交的作业,将作业转发给JobManager。
关键组件及功能:
- Stream:表示一个数据流,带有Source、Transformation和Sink。
- Source:定义了一条数据流的源,它会不断地产生数据。
- Transformation:对Stream进行转换操作,会产生一个新的Stream。
- Sink:数据流的终点,定义了结果的持久化位置。
- Operator:Transformation和Sink的基类,实现了数据处理逻辑。一个Operator会被映射成一个或多个并行子任务。
- Parallelism:控制算子的并行子任务的数量。
- State:允许Transformation操作的状态,可以是ListState、BroadcastState等。
Flink支持的Transformation主要有:Map、FlatMap、Filter、KeyBy、Reduce、Aggregate等。
Flink的优点主要在于:
1. Exactly-once的语义:处理效果等同于批处理,实现了端到端的精确一次。
2. 低延迟:使用流式处理,延迟低。
3. 高吞吐:实现了高效的数据流操作和分布式执行。
基础概念:
(1) 流的概念:代表了一个无界的、持续性的数据集合。流会不断产生新数据。
(2) 转换的概念:表示对一个或多个输入流的计算操作,产生新的输出流。转换允许通过各种操作来操控和处理数据流。
(3) 容错:通过分布式快照(Checkpoint)与数据重播(Data replay)来实现End-to-end的Exactly-once语义。
(4) 一致性:通过全局数据流的概念来统一操作不同来源的数据,并通过时间戳和窗口等机制实现一致性。
(5) 高吞吐:通过流水线传输、缓冲区反压和轻量级的容错机制实现高吞吐率。
工作机制:
Flink的工作机制,其中Client将作业(DAG)提交到JobManager,JobManager根据作业逻辑将DAG切分成多个任务。接下来JobManager向ResourceManager申请计算资源,然后将任务分配到TaskManager运行。Task会处理数据流的一个或多个分区(Partition),实现实际的数据处理逻辑。每个Operator(Transformation/Sink)会被映射为一个或多个Task运行。Task之间通过发送数据实现流的传递。一个作业会被映射为多个Operator,Operator通过数据流实现连接,最终构建一个有向无环图(DAG),计算结果。Flink实现了分布式和高度并行的流数据处理,一个作业会被映射为大量的Task运行。
Mermaid语法:
graph TD;
A[Client] --提交作业--> B[JobManager]
B --切分DAG成多个Task--> C[TaskManager1]
B --切分DAG成多个Task--> D[TaskManager2]
B --切分DAG成多个Task--> E[TaskManager3]
C --处理数据流分区--> F[Task1]
C --处理数据流分区--> G[Task2]
D --处理数据流分区--> H[Task3]
D --处理数据流分区--> I[Task4]
E --处理数据流分区--> J[Task5]
E --处理数据流分区--> K[Task6]
F -->|操作输出数据流| L[(Transformation/Sink)]
G -->|操作输出数据流| L
H -->|操作输出数据流| L
I -->|操作输出数据流| L
J -->|操作输出数据流| L
K -->|操作输出数据流| L
L --建立Operator之间的数据流--> M[有向无环图DAG]
M-->N[分布式和高度并行的流数据处理]
N--将作业分配给大量的Task运行-->O[实现分布式和高度并行的数据处理]
wordcount计算流程例子:
Flink执行wordcount任务流程,首先需要创建执行环境和设置并行度,然后从文件中读取文本数据,得到数据流。接着进行分词操作,得到单词流。对单词流进行映射操作,得到(单词,1)的流。对(单词,1)的流进行KeyBy操作,按单词进行分区。对分区后的流进行Reduce操作,将同一分区内的(单词,1)相加,得到(单词,总计数)的流。最后将结果打印于控制台。
Mermaid语法:
graph TD;
A[创建执行环境,设置并行度] --> B[从文件中读取文本数据,得到数据流];
B--文本数据-->C[分词操作];
C--单词流-->D[映射操作:单词,1的流];
D--单词,1的流-->E[KeyBy操作,按单词分区];
E--按单词分区的流-->F[Reduce操作,将同一分区的:单词,1相加得到:单词,总计数];
F--单词,总计数的流-->G[结果打印在控制台];
03
—
Hadoop
hadoop系统组件:
Hadoop系统整体是一个分布式存储和计算框架,主要组件包括:
1. HDFS:Hadoop分布式文件系统,提供高容量、高扩展性的存储。
2. YARN:资源管理框架,负责计算资源的管理和调度。
3. MapReduce:批处理计算框架,基于HDFS和YARN实现大规模数据的并行计算。
4. Hive:数据仓库工具,提供SQL查询功能,方便对HDFS的数据进行查询与分析。
5. HBase:NoSQL数据库,提供实时读写访问HDFS上的数据。
关键组件及功能:
- NameNode:HDFS的元数据管理节点,负责文件目录结构和文件块映射信息的管理。
- DataNode:HDFS的数据存储节点,负责文件数据的存储与读取。
- SecondNameNode:辅助NameNode,负责定期合并FSImage和Edits,避免该文件过大。
- ResourceManager:YARN的管理节点,用于管理集群资源和调度作业。
- NodeManager:YARN的工作节点,用于管理容器和监控容器资源使用情况。
- JobTracker:旧版MapReduce中的作业跟踪器,负责作业的调度与监控。
- TaskTracker:旧版MapReduce中的任务跟踪器,负责执行任务并报告状态。
- 优点:高可靠性、高扩展性、高容错性、低成本。
MapReduce工作流程:
MapReduce在实现数据处理的工作流程。客户端提交作业到JobTracker,指定输入输出路径和Map/Reduce逻辑。JobTracker将作业切分成多个Map和Reduce任务,并向ResourceManager申请运行资源。ResourceManager分配容器,在NodeManager上运行Map任务。Map任务从HDFS读取输入数据,并根据业务逻辑进行处理,产生中间结果。Map任务将中间结果以分区/排序的形式输出到本地磁盘。Map任务向JobTracker报告状态,并在完成后释放资源。根据Map任务的输出分区,JobTracker将Reduce任务分配到具有Map任务输出的节点。Reduce任务从多个Map任务读取中间结果进行计算,最终产生输出结果。Reduce任务将输出结果写出到HDFS,并向JobTracker报告状态。作业完成后,客户端从HDFS读取输出结果。
Mermaid语法:
graph TD;
A[Client] --> B[JobTracker];
B --> C[ResourceManager];
C --> D[NodeManager];
D --> E[Map任务从HDFS读取输入数据,并根据业务逻辑进行处理,产生中间结果];
E --> F[Map任务将中间结果以分区/排序的形式输出到本地磁盘];
F --> G[Map任务向JobTracker报告状态,完成后资源释放];
G --> H[Reduce任务从多个Map任务读取中间结果进行计算,最终产生输出结果];
H --> I[Reduce任务将输出结果写出到HDFS,并向JobTracker报告状态];
I --> J[客户端从HDFS读取输出结果];
B --> K[将作业切分成多个Map任务和Reduce任务];
K --> C;
E --> D;
H --> G;
J --> A;
K -.-> L[向ResourceManager申请运行资源];
L --> C;
G --> K[根据Map任务的输出分区,将Reduce任务分配到具有Map任务输出的节点];
HDFS、MapReduce和YARN的协作机制
在HDFS、MapReduce和YARN的协作下,MapReduce作业的整个工作流程:客户端通过HDFS接口向HDFS提交MapReduce作业,指定输入/输出路径。MapReduce作业被提交到YARN的ResourceManager。ResourceManager将MapReduce作业切分为MapTask和ReduceTask,并向NodeManager申请运行资源。MapTask在NodeManager上运行,并从HDFS读取输入数据,将中间输出临时存储在本地磁盘上。ReduceTask从多个MapTask读取中间数据,并计算最终结果,将输出结果存储到HDFS。客户端从HDFS读取MapReduce的计算结果。YARN根据作业进度监控和管理资源使用情况。
Mermaid语法:
graph LR;
A[客户端] --> B[HDFS];
B --> C["通过HDFS接口提交MapReduce作业, 指定输入/输出路径"];
C --> D[YARN的ResourceManager];
D --> E["将MapReduce作业切分成MapTask和ReduceTask, 并申请运行资源"];
E --> F[NodeManager];
F --> G["MapTask在NodeManager上运行, 并从HDFS读取输入数据"];
G --> H["MapTask将中间输出临时存储在本地磁盘上"];
E --> I["ReduceTask从多个MapTask读取中间数据, 并计算最终结果"];
I --> J["ReduceTask将输出结果存储到HDFS"];
J --> K[HDFS];
D --> L["根据作业进度监控和管理资源使用情况"];
K --> M[客户端从HDFS读取MapReduce的计算结果];
04
—
Kafka
Kafka 具有高吞吐、高可靠、高扩展性等特点,适用于大数据场景下的消息传递和运营数据处理。
Kafka 的整体运作流程是:生产者生产消息发送到 broker,broker 将消息根据 partition 分发并持久化;消费者从 broker 中读取并消费消息,由消费者组中的一个消费者独占一个 partition,其他消费者不会重复消费该 partition 的消息;副本之间通过同步复制消息来保证高可用性。
kafka系统组件:
Kafka 的整体架构包含以下几个关键组件:
1. Broker:Kafka 集群中的服务器,负责消息的接收、存储和转发。一个 Kafka 集群通常包含多个 Broker。
2. Topic:Kafka 中的消息分类,类似消息队列中的 Queue。生产者生产消息并推送到 topic,消费者订阅 topic 获取消息。
3. Partition:Topic 的物理分片,提高并行度。每个 partition 是一个有序的消息队列。
4. Replica:Partition 的副本,通常设置 2-3 个副本,副本中的消息相同,用于冗余备份和故障转移。
5. Producer:生产者,向 Kafka broker 发送消息的客户端。
6. Consumer:消费者,从 Kafka broker 读取消息的客户端。
7. Consumer Group:消费者组,允许多个消费者协作读取同一个 topic,每个 partition 只能被 group 中的一个消费者使用。
8. Offset:消息在 partition 中的序号,由 0 开始,递增。消费者根据 offset 获取消息。
9. ISR: leader 副本和其余 in-sync replica(与 leader 副本同步的副本)的集合。只有在 ISR 中的副本才会为 partition 提供服务。
kafka如何保证数据不丢:
Kafka 通过持久化、副本、ACK、ISR 和重试等机制,保证了消息的高可靠性和不丢数据,具体说明如下:
1. 消息持久化:Kafka 将消息持久化到磁盘,并以文件形式存储在broker上,所以无论broker发生什么问题,消息都不会丢失。
2. 副本 replicas:Kafka 的每个 partition 分区都有多个副本,一旦某个副本失效,仍有其他副本存在,消息不会丢失。
3. ACK 机制:生产者发送消息到 broker 时,需要配置 ACK 级别。如果设置为 ACK=0,生产者在消息发送后不等待 broker 的响应;如果设置为 ACK=1,生产者在消息写入 broker 的 leader 副本后得到确认;如果设置为 ACK=all,生产者在消息被所有副本全部写入后得到确认。高 ACK 级别可以保证更高的可靠性,避免在 follower 副本未同步前就认为消息已发送成功。
4. ISR(In-Sync Replicas)机制:follower 副本与 leader 副本之间的同步指标叫 ISR,只有在 ISR 内的 follower 副本才会为 partition 中的消息提供 read 服务和变更日志的备份。如果某个 follower 副本长时间未与 leader 同步,会被逐出 ISR,不再为 partition 提供服务,直到它再次与 leader 达成一致。这可以避免 follower 过久未同步导致的消息丢失问题。
5. 生产者重试机制:生产者在消息发送失败时(如 broker 失效)会自动重试,一直到消息成功发送或达到重试上限。这可以避免临时性故障导致的消息丢失。
6. 消息过期时间:用户可以为 topic 设置消息过期时间,如果消息在指定时间内未被成功消费,则认为该消息已过期失效,可以被删除。这可以避免消息堆积而不被消费的情况。
Kafka 的读写流程:
Kafka 的读写流程主要涉及生产者、消费者、broker 三个角色。生产者产生消息并写入 broker,消费者从 broker 读取消息并确认消费进度。broker 负责消息的持久化存储和查询。整个流程保证了消息的可靠传输和exactly-once 语义
Kafka 的消息写流程如下:
Kafka 的消息读流程如下:
免责申明:
本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!
《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu
《数栈V6.0产品白皮书》下载地址:https://fs80.cn/cw0iw1
想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=bbs
同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:https://github.com/DTStack