Spark-源码学习-SparkSQL-一条聚合 SQL 语句的执行过程~
一、概述在典型的 Spark SQL 应用场景中,数据的读取、数据表的创建和分析都是必不可少的过程。通常来讲,SparkSQL 查询所面对的数据模型以关系表为主。
如图所示的案例显示了使用 SparkSQL 进行数据分析的一般步骤。
二、聚合体系先了解下 Spark SQL 的聚合体系设计~
引用本站文章
Spark-源码学习-SparkSQL-聚合体系-架构设计
Joker
三、流程可以先看看这个~
引用本站文章
Spark-源码学习-SparkSQL-一条 SQL 语句的执行过程概述~
Joker
...
Flink-源码学习-存储服务-架构设计-磁盘管理
正在总结中,等我😭~~~
Flink-源码学习-存储服务-架构设计
一、概述Flink 提供的存储服务包括内存管理服务和文件管理服务,TaskManager 启动时也会初始化 I/O 管理组件 IOManager,负责将数据输出到磁盘并将其读取回来以及内存管理组件 MemoryManager 负责协调内存使用。
二、内存管理Flink 为了让用户更好的调整内存分配,达到资源的合理分配,在 Flink1.10 引入了 TaskManager 的内存管理,后续在 Flink1.11 版本引入了 JobManager 的内存管理,用户可以通过配置的方式合理的分配资源。不管是 TaskManager 还是 JobManager 都是单独的 JVM 进程,共用一套内存模型抽象(TaskManager 的内存模型更加复杂), Flink 从一开始就选择了使用自主的内存管理,避开了 JVM 内存管理在大数据场景下的问题,提升了计算效率。
2.1. 架构设计Flink 的 JVM 的进程总内存(Total Process Memory) 包含了 Flink 总内存(Total Flink Memory) 和运行 Flink 的 JVM 特定内存(JVM Spec ...
Flink-源码学习-架构设计-部署模式-Application
一、概述无论是 Session 模式 还是 Per_Job 模式,其 main 方法都是在容户端执行来获取 Flink 运行时所需的依赖项,并生成JobGraph,提交到集群的操作都会在实时平台所在的机器上执行,会给服务器造成很大的压力。尤其在大量用户共享客户端时,问题更加突出。其次,两种模式提交任务的时候会把本地 Flink 的所有 jar 包先上传到 hdfs 上相应的临时目录,这个会带来大量的网络的开销,如果任务特别多的情況下,平台的吞吐量将会直线下降。Flink-1.11 中引入了一种新的部署模式,即 Application 模式。Application 模式下,用户程序的 main 方法将在集群中而不是客户端运行。用户将程序選辑和依赖打包进一个可执行的 jar 包里,集群的入口程序 (ApplicationClusterEntryPoint) 负责调用其中的 main 方法生成 JobGraph
Applicaton 模式为每个提交的应用程序创建一个集群,该集群可以看作是在特定应用程序的作业之间共享的会话集群,并在应用程序完成时终止。
二、架构设计目前,Flink- ...
Flink-源码学习-架构设计-部署模式-Per_job
一、概述Per-Job 模式每次提交都会创建一个新的 Flink 集群,任务之间相互独立,当其中一个任务发生错误时只会使自己集群的 TaskManager 挂掉,不影响其他任务执行,且每个运行任务的 Flink 集群可以独立进行配置。任务执行结束后创建的 Flink 集群也会消失,其他中间产生或缓存的文件将会被清理。考虑到集群的资源隔离情况,一般生产上的任务都会选择 Per-Job 模式。
在 Flink 1.10 版本中,只有 Yarn 上实现了 Per-Job 模式。Per-Job 模式下,因为不需要共享集群,所以在 PipelineExecutor 中执行作业提交的时候,可以创建集群并将 JobGraph 以及所需要的文件等一同交给 Yarn 集群,Yarn 集群在容器中启动 JobManager 进程,进行一系列的初始化动作,初始化完华之后,从文件系统中获取 JobGraph,交给 Dispatcher。之后的执行流程与 Session 模式下的执行流程相同。对应源码,在 Flink 集群运行时启动过程中,会通过 ClusterEntrypoint 集群入口类启动管理 ...
Flink-源码学习-架构设计-部署模式-Session
一、概述Session 模式会初始化一个 Flink 集群,此后提交的任务共享这个 Flink 集群资源,这个 Flink 集群会常驻,除非手动停止。在 Session 模式下,WebMonitorEndpoint、 Dispatcher、 ResourceManager 在 JobManager 启动时会一起启动,JobMaster 在有任务提交时才会启动。
二、架构设计在 Flink 1.10 版本中提供了三种会话模式:Standalone、Yarn 会话模式、K8s 会话模式。对应源码,在 Flink 集群运行时启动过程中,会通过 ClusterEntrypoint 集群入口类启动管理节点中的核心组件与服务。集群运行时会根据资源管理器的不同,选择不同的 ClusterEntrypoint 实现类启动集群组件。在 Session 集群部署模式下 SessionClusterEntrypoint 的实现类主要有 StandaloneSessionClusterEntrypoint、 KubernetesSessionClusterEntrypoint、YarnSessionC ...
Hadoop-组件-HDFS-源码学习-RPC 通信服务-NameNodeRpcServer 初始化
一、概述二、实现Namenode 定义了 NameNodeRpcServer 类响应来自 HDFS 集群中其他节点的 RPC 请求,NameNodeRpeServer 实现了包括 ClientProtocol、 NamenodeProtocol、DatanodeProtocol 以及 HAServiceProtocol 在内的所有需要与 Namenode 交互的 RPC 协议接口。
Namenode 会在它的初始化方法 initialize() 中调用 createRpcServer() 创建 NameNodeRpcServer 对象的实例,createRpcServer() 方法会直接调用 NameNodeRpcServer 的构造方法~
2.1. 初始化NameNodeRpcServer 的构造方法首先设置了 RPC 类的序列化引擎为 protobuf,然后构造了两个 RPC.Server 对象:
clientRpcServer 用于响应来自 HDFS 客户端的RPC 请求;
serviceRpcServer 则用于响应来自 Datanode 的 RPC 请求。
Na ...
Hadoop-组件-HDFS-源码学习-RPC 通信服务-代理层设计
一、概述客户端的 Stub 可以看作是一个代理对象,它会将请求程序的 RPC 调用序列化,并调用 Client.call() 方法将这个请求发送给远程服务器,这些实现对于客户端请求程序是完全透明的。
二、初始化ClientProtocol 对象定义了客户端与名字节点之间的所有接口,Hadoop 2.x 引入了 Namenode 的 HA 机制,也就是说,HDFS 集群中会存在两个 Namenode 实例,同一时间 DFSClient 只会将 ClientProtocol RPC 请求发送给集群中的 Active Namenode。而当集群发生错误切换时,DFSClient 又会将请求发送给新的 Active Namenode, 这些实现对于 DFSClient 来说是透明的,DFSClient 只需在 ClientProtocol 对象上发起 RPC 调用即可。
1234567891011if (proxyInfo != null) { this.dtService = proxyInfo.getDelegationTokenService(); this.n ...
Hadoop-组件-HDFS-源码学习-RPC 通信服务-传输层-客户端设计
在 Hadoop RPC 的使用小节中我们介绍了 DFSClient 会获取一个 ClientProtocol PB 协议的代理对象,并在这个代理对象上调用 RPC 方法,代理对象会调用 RPC.Client.call()方法将序列化之后的 RPC 请求发送到服务器。
一、概述二、架构
2.1. CallRPC.Client 中发送请求和接收响应是由两个独立的线程进行的,发送请求线程就是调用 Clientl.call() 方法的线程,而接收响应线程则是 call()启动的 Connection 线程。
那么这两个线程是如何同步 Server 发回的响应信息的呢?
线程 1 调用Client.call() 发送 RPC 请求到 Server,然后在这个请求对应的 Call 对象上调用 Call.wait() 方法等待 Server 发回响应信息。
当线程 2 从 Server 接收了响应信息后,会设置 Call.rpcResponse字段保存响应信息,然后调用 Cal.notify()方法唤醒线程 1。线程 1 被唤醒后,会取出 Call.rpcResponse 字段中记录的 S ...
Hadoop 源码学习-Hadoop RPC-传输层-服务端设计
服务器端代码获取了 Server 对象后,会启动这个 Server 对象监听网络上的 RPC 请求并触发响应操作。为了提高性能,Server 类采用了 Java NIO 提供的基于 Reactor 设计模式的事件驱动 I/O 模型,当 Server 完整地从网络接收一个 RPC 请求后,会调用 call()方法响应这个请求
一、概述为了提高性能,Server 类采用了很多技术来提高并发能力,包括线程池、JavaNIO 提供的 Reactor 模式等,其中 Reactor 模式贯穿了整个 Server 的设计。
1.1. 模式 Reactor二、架构
Server 类是服务器端从网络接收 RPC 请求的类,成功地接收一个 RPC 请求后,Server 会调用 call() 方法响应这个请求。
服务端 NameNodeRpcServer 会启动一个 RPC.Server 监听来自客户端的所有 RPC 请求,当 RPC Server 在网络上监听到一个 RPC 请求时,解析这个请求,然后构造 ProtoBufRpcInvoker 对象来处理这个请求。
2.1. 组件2.1.1. Lis ...