Spark-理论笔记-Shuffle 概述
一、概述Shuffle 描述着数据从 map task 输出到 reduce task 输入的这段过程。是连接 Map 和 Reduce 之间的桥梁, Map 的输出要用到 Reduce 中必须经过 shuffle 这个环节.
shuffle 的性能高低直接影响了整个程序的性能和吞吐量。因为在分布式情况下,reduce task 需要跨节点去拉取其它节点上的 map task 结果。这一过程将会产生网络资源消耗和内存,磁盘 IO 的消耗。
1.1. 导致 Shuffle 操作算子1.1.1. 重分区类的操作重分区类算子一般会 shuffle,因为需要在整个集群中对之前所有的分区的数据进行随机,均匀的打乱,然后把数据放入下游新的指定数量的分区内。
比如 repartition、repartitionAndSortWithinPartitions 等
1.1.2. byKey 类的操作比如 reduceByKey、groupByKey、sortByKey 等,对一个 key 进行聚合操作时要保证集群中,所有节点上相同的 key 分配到同一个节点上进行处理
1.1.3. Join 类的操 ...
Spark-理论笔记-数据倾斜
Spark 中的数据倾斜问题主要指 shuffle 过程中由于不同的 key 对应的数据量不同导致的不同 task 所处理的数据量不同的问题。
1. 表现
Spark 作业的大部分 task 都执行迅速,只有有限的几个 task 执行的非常慢,此时可能出现了数据倾斜,作业可以运行,但是运行的非常慢。
原本能够正常执行的 Spark 作业,突然出现 OOM [内存溢出] 异常
2. 定位数据倾斜在 Spark 中,同一个 Stage 的不同 Partition 可以并行处理,而具有依赖关系的不同 Stage 之间是串行处理的。一个 Stage 所耗费的时间,主要由最慢的那个 Task 决定。由于同一个 Stage 内的所有 Task 执行相同的计算,在排除不同计算节点计算能力差异的前提下,不同 Task 之间耗时的差异主要由该 Task 所处理的数据量决定。Stage 的数据来源主要分为如下两类
从数据源直接读取。如读取 HDFS,Kafka
读取上一个 Stage 的 Shuffle 数据
常用并且可能会触发 shuffle 操作的算子有:distinct,groupByKe ...
Hadoop-组件-HDFS-源码学习-HDFS 架构设计-DataNode 架构
Datanode 整体从逻辑上可以切分为服务层、逻辑层以及数据层三个模块。
一、数据层Datanode 的所有服务都是建立在数据块存储功能基础上的,将 Datanode 中数据块的部分抽象为数据层。数据层包括两个主要的模块。
2.1. DataStorage 数据存储DataStorage 数据层负责管理数据节点的存储空间,并管理在云仿真平台上更 新名称。在云平台联邦机制中,数据节点可以存储来自多个块池的数据块,并 且文件系统通过 BlockPoolSliceStorage 管理数据节点上单个块池的空间。 DataStorage 包含对所有 BlockPoolSliceStorage 对象的引用,并使用这些引用 来管理数据节点上的所有块池。
引用本站文章
Hadoop-组件-HDFS-源码学习-HDFS 架构设计-DataNode 架构-数据层-DataStorage
Joker
...
Hadoop-组件-HDFS-源码学习-HDFS 架构设计-NameNode 架构-数据块管理
一、概述Namenode 会定期将文件系统目录树以及文件与数据块的对应关系保存至 fsimage 文件中,fsimage 并不记录数据块和数据节点的对应关系。这部分数据是由 Datanode 主动将当前 Datanode 上保存的数据块信息汇报给 Namenode,然后 Namenode 更新内存中的数据,以维护数据块和数据节点的对应关系。
二、架构设计三、实现3.1. 相关类3.1.1. BlockBlock 类用来唯一地标识 Namenode 中的数据块,是 HDFS 数据块最基本的抽象接口。Block 类实现了 Writable 接口,是可以序列化的。Block 类还实现了 Comparable 接口,按照 blockid 大小排序。
Block 类定义了三个字段:① blockId 唯一地标识这个 Block 对象;② numBytes 是这个数据块的大小(单位是字节):③ generationStamp 是这个数据块的时间戳(联想GenerationStamp 这个类)。
3.1.2. BlockInfoContiguous3.1.3. BlockInfoContig ...
Hadoop-组件-HDFS-源码学习-HDFS 架构设计-NameNode 架构-数据节点管理
一、概述Namenode 启动后,会加载 fsimage 和 editlog 文件重建文件系统目录树,但是对于数据块与 Datanode 的映射关系却需要在 Datanode 上报后动态构建。Datanode 在启动时除了会与名字节点握手、注册以及上报数据块信息外,还会定时向 Namenode 发送心跳以及块汇报,并执行 Namenode 传回的指令。所以 Namenode 中会有很大一部分逻辑是与 Datanode 相关的,包括添加和删除 Datanode、与 Datanode 启动过程的交互、处理 Datanode 发送的心跳。
二、架构设计正在持续施工中ing~~~
三、实现3.1. 相关类3.1.1. 数据节点标识
DatanodeId
DatanodeID 用于唯一标识一个 Datanode, Datanode 是通过 <ip,port> 以及 storageId 进行标识
DatanodeInfo
DatanodeInfo 类扩展自 DatanodeId,它携带了一些比较简单的 Datanode 信息
DatanodeDescriptor
数据节点描述 ...
Hadoop-组件-HDFS-源码学习-HDFS 架构设计-NameNode 架构-缓存管理
一、概述Hadoop 2.3.0 版本新增了集中式缓存管理 (Centralized Cache Management)功能,允许用户将一些文件和目录保存到 HDFS 缓存中。HDFS 集中式缓存是由分布在 Datanode 上的堆外内存组成的,并且由 Namenode 统一管理。
二、理论笔记正在持续施工中ing~~~
HDFS 为管理员和用户提供了 hdfs cacheadmin 命令管理集中式缓存,包括缓存指令控制和缓存池控制两个部分。
缓存指令控制
调用 hdfs cacheadmin -addDirective 命令缓存指定路径;
调用 hdfs cacheadmin -removeDirective 命令删除指定 id 对应的缓存
调用 hdfs cacheadmin -removeDirectives 命令删除指定路径的缓存
调用 hdfs cacheadmin -listDirectives 命令显示当前所有的缓存。
缓存池控制
调用 hdfs cacheadmin -addPool 命令创建一个缓存池
调用 hdfs cacheadmin ...
Hadoop-组件-HDFS-源码学习-HDFS 集群管理
一、元数据管理为了保证用户操作元数据高效,延迟低,NameNode 把所有的元数据都存储在内存中。内存中的元数据是最完整的,包括文件自身属性信息、文件块位置映射信息。但是内存的致命问题是,断点数据丢失,数据不会持久化。因此 NameNode 又辅佐了元数据文件(fsimage+edits)来保证元数据的安全完整。
引用本站文章
Hadoop-组件-HDFS-源码学习-HDFS 集群管理-元数据管理
Joker
二、数据块管理HDFS 中的数据块冗余备份在集群中的数据节点上的,Namenode 需要维护数据块与数据节点之间的对应关系。
Namenode 维护着 HDFS 中两个最重要的关系:
HDFS 文件系统的目录树以及文件的数据块索引。
数据块和数据节点的对应关系,即指定数据块的副本保存在哪些数据节点上的信息。
Namenode 定 ...
Hadoop-组件-HDFS-理论笔记-HDFS 架构设计
Hadoop 是一个能够让用户轻松架构和使用的分布式计算平台,用户可以在 Hadoop上管理、开发和运行处理大规模数据的应用,其中,Hadoop分布式文件系统 (Hadoop Distributed File System, HDFS) 以文件系统的形式为应用提供海量数据存储服务。
一、概述HDFS作为一个分布式文件系统,具有高容错的特点,它可以部署在廉价的通用硬件上,提供高吞吐率的数据访问,适合那些需要处理海量数据集的应用程序。
1.1. HDFS 主要特性HDFS作为一个分布式文件系统,具有高容错的特点,它可以部署在廉价的通用硬件上,提供高吞吐率的数据访问,适合那些需要处理海量数据集的应用程序。
支持超大文件
流式的数据访问
HDFS 的设计建立在一次写入、多次读写 任务的基础上。HDFS 应用对文件要求的是 write-one-read-many 访问模型。一个文件经过创建、写,关闭之后就不会改变。这一假设简化了数据一致性问题,使高吞吐量的数据访问成为可能。
只须运行在低廉的商用硬件集群上,而无需在昂贵的高可用性机器上
正是由于以上的设计目标,HDFS并不适合 ...
Hadoop-组件-Yarn-理论笔记-Yarn 概述
Yarn 作为 Hadoop 的资源管理系统,负责 Hadoop 集群上计算资源的管理和作业调度。
Yarn 支持 CPU 和 内存两种资源管理和调度,通过对资源抽象为 Container,封装了某个节点上一定量的 CPU 资源和内存资源。内存资源决定计算任务的存活,如果内存不够,计算任务可能运行失败;相比之下,CPU资源则不同,它只会决定任务的快慢,不会对任务的生死产生影响。
Container 在 Hadoop3.x 版本之前只支持内存和 CPU 资源,Hadoop 3.x 开始支持自定义资源类型,极大的增强了资源管理的能力
一、 Yarn 架构YARN 是经典的 主从 Master/Slave 结构,如下图所示。
Yarn 服务由一个 ResourceManager 和多个 NodeManager 构成,ResourceManager为主节点 (master),NodeManager 为从节点(slave)
1.1. ResourceManagerResourceManager 是一个全局的资源管理器,负责整个系统的资源管理和分配,包括处理客户端请求、启动/监控 Ap ...
Spark-源码学习-SparkCore-存储服务-架构设计-存储内存
Task 在启动之初读取一个分区时,会先判断这个分区是否已经被持久化,如果没有则需要检查 Checkpoint 或按照血统重新计算。所以如果一个 RDD 要执行多次 action 操作, 可以在第一次 action 操作中使用 persist 或 cache 方法,在内存或磁盘中持久化或缓存这个 RDD,从而在后面的行动时提升计算速度。
弹性分布式数据集 RDD 作为 Spark 最根本的数据抽象,是只读的分区记录的集合,基于在稳定物理存储中的数据集上创建,或者在其他已有的 RDD 上执行转换 [Transformation] 操作产生一个新的 RDD。转换后的 RDD 与 原始的 RDD 之间产生的依赖关系构成了血统[Lineag]。凭借血统,Spark 保证了每一个 RDD 都可以被重新恢复。
其中 cache 这个方法是个 Tranformation ,当第一次遇到 action 算子的时才会进行持久化
cache 内部调用了 persist(StorageLevel.MEMORY_ONLY)方法,所以执行 cache 算子其实就是执行了 persist 算子且持久化级别为 ...