小2C


  • 首页

  • 标签

  • 分类

  • 归档

Hadoop Yarn 内存和cpu的资源调度以及资源隔离

发表于 2021-02-25 | 分类于 Hadoop | 阅读次数:
字数统计: 750 | 阅读时长 ≈ 2

资源调度和资源隔离是 Yarn 作为一个资源管理系统,最重要和最基础的两个功能。资源调度由 ResourceManager 完成,资源隔离由各个 NodeManager 实现。

ResourceManager 将某个 NodeManager 上资源分配给任务,这也就是资源分配。资源分配后,NodeManager 需按照要求为任务提供相应的资源,甚至保证这些资源应具有独占性,为任务运行提供基础的保证,这就是资源隔离。

Yarn 的资源管理器实际上是一个事件处理器,它需要处理六种来自外部的 SchedulerEvent 类型的事件,六种事件的含义如下:

  1. NODE_REMOVED

    表示集群中被移除一个计算节点,资源调度器收到该事件时需要从可分配资源总量中移除相应的资源量

  2. NODE_ADDED

    表示集群中增加了一个计算节点,资源调度器收到该事件时需要将新增的资源加到可分配资源中去

  3. APPLICATION_ADDED

    表示 ResourceManager 收到一个新的 Application。通常而言,资源管理器需要为每个 application 维护一个独立的数据结构,以便统一管理和资源分配,资源管理器需要将该 Application 添加到相应的数据结构中去

  4. APPLICATION_REMOVED

    表示一个 application 运行结束(成功或失败),资源管理器需将该 application 从相应的数据结构中清除

  5. CONTAINER_EXPIRED

    当 RM 将一个 container 分配给某个 AM 后,如果该 AM 在一定时间间隔内没有使用该 container,则 RM 会对该 container 进行再分配

  6. NODE_UPDATE

    NM 通过心跳机制向 RM 汇报各个 container 的运行情况,会触发一个 NODE_UPDATE 事件,由于此时可能有新的 container 得到释放,因此该事件会触发资源分配

Yarn 对内存和 CPU 采用了不同的资源隔离方案。对于内存资源,为了更灵活的控制内存,Yarn 采用了进程监控的方案控制内存的使用,即每个 NodeManager 会启动一个额外的监控线程控制每个 container 内存资源的使用量,一旦发现它超过规定的资源量,则会将其杀死。采用这种方案的另一个原因是 Java 中创建子进程采用了 fork()+exec() 的方案,子进程启动的瞬间,它使用的内存量与父进程一致,从外面看来,一个进程使用的内存量可能瞬间翻倍,然后又降下来,采用线程监控 的方法可以防止这种情况下导致的 swap 操作

对于 CPU 资源,则采用了 Cgroups 进行资源隔离。

CPU 被划分成虚拟 CPU,这里的虚拟 CPU 是 Yarn 自己引入的概念,初衷是考虑到不同节点的 CPU 性能不同,这时候可以通过为一个性能更好的 CPU 多配置几个虚拟 CPU 的方法来弥补这种差距

mapreduce1 和 mapreduce2 的工作机制

发表于 2021-01-17 | 分类于 Hadoop | 阅读次数:
字数统计: 427 | 阅读时长 ≈ 1

mapreduce1 的工作机制中主要角色分别是客户端、jobtracker、tasktracker。

Jobtracker 协调作业的运行

tasktracker 负责运行作业划分后的任务

流程如下:

  1. 客户端向 jobtracker 请求一个新的作业,检查作业的输出路径是否存在,若存在则抛出异常。然后 jobtracker 向客户端返回 job 相关资源的提交路径以及 jobid
  2. 客户端将 job 所需的资源(jar 文件、配置文件)提交到共享文件系统(hdfs)
  3. 告知 jobtracker 已将 job 复制到共享文件系统,准备执行
  4. jobtracker 将提交的 job 放入内部的任务队列,由作业调度器进行调度,并进行初始化(包括创建一个表示正在运行作业的对象,用于封装任务和记录信息)
  5. jobtracker 的作业调度从共享文件系统获取客户端计算好的输入分片,以创建任务运行列表
  6. tasktracker 通过心跳与 jobtracker 保持通信,报告自己的状态,以及是否准备好运行一个 task,若是则 jobtracker 通过一定的调度算法从任务队列中取出一个 task 分配给 tasktracker
  7. tasktracker 在共享文件系统中获得任务相关资源,实现 jar 本地化,并创建一个本地工作目录以及一个 taskrunner 运行该任务
  8. taskrunner 启动一个新的 jvm
  9. 在新启动的 jvm 中运行任务
  10. 进度与状态的更新:有一个独立的线程向 tasktracker 报告当前任务的状态。同时 tasktracker 每隔 5 秒通过心跳向 jobtracker 发送状态。jobtracker 将这些更新合并,发送给客户端。

https://blog.csdn.net/guoyuguang0/article/details/46731291

HDFS 如何添加和撤销数据节点

发表于 2021-01-16 | 分类于 Hadoop | 阅读次数:
字数统计: 265 | 阅读时长 ≈ 1

在 HDFS 中提供了 dfs.hosts 文件(又称为 include文件)和 dfs.exclude 文件,对连接到 namenode 的数据节点进行管理。include 和 exclude 保存在 FSNameSystem 中的 hostReader 中

Include 文件: 对连接到 NN 的数据节点进行管理,指定了可以连接到 NN 的数据节点列表

Exclude 文件: 指明不能连接到 NN 的 数据节点列表

  1. 添加节点

    需要在 include 文件中添加相应的记录,并通过 dfsadmin 工具的 refreshnodes 命令,属性刷新 NN 节点信息,然后启动 DN,启动时会执行握手,注册,上报等行为

  2. 删除节点

    在 exclude 文件中添加将要撤销的节点,然后执行 refreshnodes 命令,NN 就会开始撤销 DN,被撤销节点的数据块将会被复制到集群的其他节点,这个过程中数据节点处于正在撤销状态,数据复制完成后才会才会转移到已撤消状态,并在 include 中删除相应的记录,就可以关闭先用的 DN

HDFS 什么时候会出现副本数量多于设定值的情况

发表于 2021-01-16 | 分类于 Hadoop | 阅读次数:
字数统计: 401 | 阅读时长 ≈ 1

以下情况会导致 HDFS 副本数高于设定值:

  1. 节点重新上线。这类操作是运维操作引起的,节点下线操作会导致大量此节点的 block 块在集群中拷贝(因为节点下线造成的副本数不足),一旦此节点取消下线,之前拷贝的大量块必然会成为多余的副本块
  2. 网络波动。namenode 启动时,会进入安全模式,数据节点上报数据块信息,若此时上报的数据块小于设置的阈值,namenode 会复制出足够的数据块。有可能原本的数据块充足,只是网络波动或其他情况造成集群中数据块过多
  3. 人为重新设置副本数。以 A 副本举例,A 副本当前满足标准副本数 3 个,此时用户使用 hadoop fs -setrep 1 PATH 将 A 的副本数设为 1,此时就会造成 A 的副本多余两个的情况,即便 HDFS 中的标准副本数还是 3

多余数据块之后需要被删除,此处选出多于数据块有两个原则:

  1. 数据块副本放置原则

    以 3 副本为例,第一个副本会放置在提交数据的 datanode 上,为的是节省带宽;第二个副本会放置在和第一个副本不同机架的 DN 上,第三个副本会放置在和第二个副本相同机架的不同节点上,后续如果还有则随机放置

  2. 尽量删除剩余空间小节点上的数据块

简述联邦 HDFS

发表于 2021-01-16 | 分类于 Hadoop | 阅读次数:
字数统计: 567 | 阅读时长 ≈ 2

联邦 HDFS 是 namenode 的水平扩展方案。该方案允许 HDFS 创建多个 namespace 以提高集群的扩展性和隔离性。联邦 HDFS 允许每个 namenode 管理文件系统命名空间的一部分。每个 namenode 维护一个命名空间,不同 namenode 之间的命名空间相互独立。数据块池不再切分,因此每个 datanode 需要注册到每个 namenode

HDFS 的底层存储是可以水平扩展的(底层存储指的是 datanode,当集群存储空间不够时,可简单的添加机器来进行水平扩展),但 namenode 不能进行水平扩展。当前的 namespace 只能存放在单个 namenode 上,而 namenode 在内存中存储了整个分布式系统的元数据信息,这限制了集群中数据块、文件和目录的数目

联邦 HDFS 有以下特性

  1. 多个 NN 共用一个集群里 DN 上的存储资源,每个 NN 都可以单独对外提供服务,但仍存在单点故障,只是说影响的范围变小了,每个 NN 都需要 secondary namenode

  2. 每个 NN 都会定义一个存储池,有单独的 id,每个 DN 都为所有的存储池提供存储

  3. DN 会按照存储池 id 向其对应的 NN 汇报块信息,同时 DN 会向所有 NN 汇报本地存储可用资源情况

  4. 如果需要在客户端方便的访问若干个 NN 上的资源,可以使用客户端挂载表,把不同的目录映射到不同的 NN,但 NN 上必须存在相应的目录

    img

一个 block pool 由属于同一个 namespace 的数据块组成,每个 datanode 可能会存储集群中所有 block pool 的数据块

每个 block pool 内部自治,也就是各自管理各自的 block,不会与其他 block pool 交流。一个 namenode 挂掉了,不会影响其他 namenode

每个 namenode 上的 namespace 和他对应的 block pool 一起被称为 namespace volume。他是管理的基本单元,当一个 namenode 被删除后,其所有 datanode 上对应的 block pool 也会对应删除。当集群升级时,每个 namespace volume 作为一个基本单元进行升级

https://blog.csdn.net/fengxuezhiye/article/details/80513313

HDFS namenode 的 HA 实现

发表于 2021-01-12 | 分类于 Hadoop | 阅读次数:
字数统计: 700 | 阅读时长 ≈ 2

namenode 的 HA 主要分为共享 editlog 机制和 ZKFC 对 namenode 状态的控制。

阅读全文 »

HDFS数据节点目录结构

发表于 2021-01-12 | 分类于 Hadoop | 阅读次数:
字数统计: 298 | 阅读时长 ≈ 1

HDFS数据节点目录结构

数据节点可以管理多个目录结构,可以通过 dfs.data.dir 配置指定

dfs.data.dir 包含四个目录和两个文件

阅读全文 »

HDFS 写入时可能出现的问题及处理机制

发表于 2021-01-12 | 分类于 Hadoop | 阅读次数:
字数统计: 1.2k | 阅读时长 ≈ 3

HDFS 写入时可能出现的问题

  1. client 崩溃
  2. DataNode 故障
  3. nameNode 故障

前两种故障的解决方法如下:

阅读全文 »

Oracle 学习

发表于 2019-10-28 | 分类于 Oracle | 阅读次数:
字数统计: 3.8k | 阅读时长 ≈ 15

记录 Oracle 学习的方方面面

阅读全文 »

HDFS 的读写操作

发表于 2019-09-23 | 分类于 Hadoop | 阅读次数:
字数统计: 598 | 阅读时长 ≈ 2

本文主要记录 hdfs 中文件的读写过程

阅读全文 »
12…8
or

or

未来的全栈工程师

79 日志
9 分类
6 标签
© 2021 or
历史访客数: 总访问量:
0%