计算机基础-操作系统-IO-软件层次结构
1. 用户层软件用户层软件实现了与用户交互的接口,用户可直接使用该层提供的、与 I/O 操作相关的库函数对设备进行操作
用户层软件将用户请求翻译成格式化的 I/O 请求,并通过“系统调用”请求操作系统内核的服务
printf(“hello, world!”);会被翻译成等价的 write 系统调用,当然,用户层软件也会在系统调用时填入相应参数。
Windows 操作系统向外提供的一系列系统调用,但是由于系统调用的格式严格,使用麻顺,因此在用户层上封装了一系列更方便的库函数按口供用户使用(Windows Api)
2. 设备独立性软件设备独立性软件,又称设备无关性软件。与设备的硬件特性无关的功能几乎都在这一层实现
向上层提供统一的调用接口(如 read/write 系统调用)
设备的保护
原理类似与文件保护。设备被看做是一种特殊的文件,不同用户对各个文件的访问权限是不一样的,同理,对设备的访问权限也不一样。
差错处理
设备独立性软件需要对一些设备的错误进行处理
设备的分配与回收
数据缓冲区管理
可以通过缓冲技术屏蔽设备之间数据交换单位大小和传输速度的差 ...
Spark-源码系列-SparkCore-Shuffle 设计-内存管理-MemoryConsumer
一、概述在 Spark 中,使用抽象类 MemoryConsumer 来表示需要使用内存的消费者。在这个类中定义了分配,释放以及 Spill 内存数据到磁盘的一些方法或者接口。具体的消费者可以继承 MemoryConsumer 从而实现具体的行为。因此,在 Spark Task 执行过程中,会有各种类型不同,数量不一的具体消费者。如在 Spark Shuffle 中使用的 ExternalAppendOnlyMap, ExternalSorter 等。
Spark-源码系列-SparkCore-Shuffle 设计-内存管理-TaskMemoryManager
一、概述TaskiMemoryManger 负责管理单个任务的堆外执行内存和堆内执行内存,Spark 中 Task 的执行内存是通过 TaskMemoryManger 统一管理的,不论是 ShuffleMapTask 还是 ResultTask, Spark 都会生成一个专用的 TaskMemoryManger 对象,然后通过 TaskContext 将 TaskMeroryManger 对象共享给该 task attempt 的所有 MemoryConsumer。 TaskMemoryManger 自建了一套内存页管理机制,并统一对 ON_HEAP 和 OFF_HEAP 内存进行编址,分配和释放。
https://blog.csdn.net/lidongmeng0213/article/details/108865063
https://www.jianshu.com/p/1176b8c637d5
二、内存页管理模块TaskMemoryManger 实现了一套类似于操作系统内存页管理的机制。
2.1. MemoryLocation为了统一 ON_HEAP 和 OFF_HEAP ...
Spark-源码系列-SparkCore-Shuffle 设计-内存管理
一、概述Map 任务在执行结束后会将数据写入磁盘,等待 reduce 任务获取。但在写入磁盘之前,Spark 可能会对 map 任务的输出在内存中进行一些排序和聚合
二、内存空间管理Spark 内存管理组件包括 JVM 范围内的内存管理 MemoryManager 和单个任务的内存管理 TaskMemoryManager。MemoryManager, TaskMemoryManager 和 MemoryConsumer 之前的对应关系,如下图。总体上一个 MemoryManager 对应着至少一个 TagrMemoryManager (具体由 executor-core 参数指定),而一个 TaskMemoryManager 对应着多个 MemoryConsumer(具体由任务而定)。当有多个 Task 同时在 Executor 上执行时,将会有多个 TaskMemoryManager 共享 MemoryManager 管理的内存。
https://mp.weixin.qq.com/s/QGlZTUWdst5I_aA7NBJjoA
https://baijiahao.baidu.c ...
Spark-源码系列-SparkCore-Shuffle-内存管理-采样和估算
一、概述由于 AppendOnlyMap 存放的是 Key 和 Value 的引⽤,并不是它们的实际对象⼤⼩,⽽且 Value 会不断被更新,实际⼤⼩不断变化。因此,想准确得到AppendOnlyMap 的⼤⼩⽐较困难。⼀种简单的解决⽅法是在每次插⼊ record 或对现有 record 的 Value 进⾏更新后,都扫描⼀下 AppendOnlyMap 中存放的 record,计算每个 record 的实际对象⼤⼩并相加,但这样会⾮常耗时。⽽且⼀般 AppendOnlyMap 会插⼊⼏万甚⾄⼏百万个 record,如果每个 record 进⼊ AppendOnlyMap 都计算⼀遍,开销会很⼤。
Spark 设计了⼀个增量式的⾼效估算算法,在每个 record 插⼊或更新时根据历史统计值和当前变化量直接估算当前 AppendOnlyMap 的⼤⼩,算法复杂度是 O(1),开销很⼩: 在 record 插⼊和聚合过程中会定期对当前 AppendOnlyMap 中的 record 进⾏抽样,然后精确计算这些 record 的总⼤⼩、总个数、更新个数及平均值等,并作为历史统计值,每当有 ...
Flink-源码学习-架构设计
一、概述Flink 是一个批流一体的分布式计算引擎,作为一个分布式计算引擎,必须提供面向开发人员的 API,根据业务逻辑开发 Flink 作业,作业除了包含业务逻辑外,还需要跟外部的数据存储进行交互。作业开发、测试完华后,交给 Flink 集群进行执行,同时还要让运维人员能够管理与监控 Flink。
二、集群组件Flink 采用 Master-Slave 架构,其中 JobManager 作为集群 Master 节点,主要负责任务协调和资源分配,TaskManager 作为 slave 节点,用于执行任务。
2.1. JobManagerJobManager 相当于整个集群的 Master 节点,且整个集群有且只有一个活跃的 JobManager(在高可用场景下,可能会出现多个 JobManager;这时只有一个是正在活跃的领导 Leader 节点,其他都是 Standby 节点)。
负责整个集群的任务调度和资源管理。从客户端中获取提交的 Flink Job,然后根据集群中 TaskManager 上 TaskSlot 的使用情况,为提交的 Job 分配相应的 Tasksl ...
Spark-源码系列-SparkCore-度量系统
一、概述Spark 的度量系统是由 Instance、Source(度量来源)、Metrics、Sink(度量目的地,每个 instance 可以设置一个或多个 Sink) 四个部分组成
二、实现2.1. MetricsSystemMetricsSystem 是 Spark 度量系统的中枢大脑,底层使用的是第三方的库 Metrics,MetricsSystem 里面维护了一个 MetricRegistry 的实例,Source 和 Sink 的都是通过这个 MetricRegistry 注册的。整体上 Spark 中的 MetricsSystem 就是基于 Metrics 做了一层封装~
2.1.1. 初始化MeticsSystem 的初始化是在 SparkEnv 创建的过程中创建的~
12345678val metricsSystem = if (isDriver) { MetricsSystem.createMetricsSystem(MetricsSystemInstances.DRIVER, conf)} else { conf.set ...
Spark-源码系列-SparkCore-UI
一、概述Spark 任务在运行时,可以借助 SparkUI 对应用程序的 Job、Stage 以及 Executor 等的信息,从而了解整体任务的运行状态。
二、实现Spark 提供了 Web 页面来浏览监控数据,而且 Master、Worker、Driver 根据自身功能提供了不同内容的 Web 监控页面。无论是 Master、Worker,还是 Driver,它们都使用了统一的 Web 框架 WebUI。Master、Worker 及 Driver 分别使用 MasterWebUI、WorkerWebUI 及 SparkUI 提供的 Web 界面服务,后三者都继承自 WebUI,并增加了个性化的功能。此外,在 YARN 或 Mesos 模式下还有 WebUI 的另一个扩展实现 HistoryServer。HistoryServer 将会展现已经运行完成的应用程序信息。
2.1. WebUISparkUI 构建在 WebUI 的框架体系之上,凡是需要页面展现的地方都可以继承它来完成。
2.1.1. WebUIPageWeb 界面由多个页面组成,每个页面都将提供不同的内容展示。We ...
Flink-源码学习-FlinkSQL&Table-Table 体系-架构设计
一、概述Table 是 Flink Table API 的核心操作对象,提供了流批统一的数据操作行为定义。对于批处理 Table 是静态表,对于流计算 Table 是动态表。动态表在 Flink 中抽象为 Table 接口。与表示批处理数据的静态表相比,动态表随时间而变化。将 SQL 查询作用于动态表,查询会持续执行而不会终止,叫作连续查询。
以 $Count$ 运算为例,对于静态表而言,$Count$ 是一个确定的值,而连续查询则会随着数据持续进入动态表,持续不断地更新 $Count$ 结果。从这个角度来说,流上的 SQL 实际上给出的总是中间结果。
二、Table SourceTableSource 提供了从外部系统(消息队列,KV 存储,数据库,文件系统等)接入数据,之后洼册到 TableEnvironment 中,然后可以通过 Table API 或者 SQL 进行查询。
引用本站文章
Flink-源码学习-FlinkSQL&Table-Table ...
Spark-源码系列-SparkCore-事件机制
一、概述Spark Core 内部的事件框架实现了基于事件的异步化编程模式。它的最大好处是可以提升应用程序对物理资源的充分利用,能最大限度的压榨物理资源,提升应用程序的处理效率。缺点比较明显,降低了应用程序的可读性。Spark 的基于事件的异步化编程框架由事件框架和异步执行线程池組成,应用程序产生的 Event 发送给 ListenerBus, ListenerBus 再把消息广播给所有的 Listener,每个 Listener 收到 Event 判断是否自己感兴趣的 Event, 若是,会在 Listener 独享的线程池中执行 Event 所对应的逻辑程序。
二、实现Spark 中的事件总线采用监听器模式设计。
2.1. SparkListenerEvent在 Spark 任务运行期间会产生大量包含运行信息的 SparkListenerEvent,例如 ApplicationStart/StageCompleted/MetricsUpdate 等等,都有对应的 SparkListenerEvent 实现。所有的 event 会发送到 ListenerBus 中,被注册在 Li ...