Hadoop 文档

General

Common

HDFS

MapReduce

MapReduce REST APIs

YARN

YARN REST APIs

YARN Service

Submarine

Hadoop Compatible File Systems

Auth

Tools

Reference

Configuration

总览

动机

估计工作资源需求对于企业集群仍然是一个重要且具有挑战性的问题。工作负载的复杂性不断增加,从传统的批处理作业到交互式查询,再到流式传输,再到最近的机器学习作业,这种情况被放大。这导致作业依赖于多个计算框架(例如Tez,MapReduce,Spark等),并且由于共享群集的性质而使问题进一步复杂化。当前的最新解决方案依靠用户的专业知识来估计作业的资源需求(例如:reduceor的数量或容器内存大小等),这既繁琐又效率低下。

根据对集群工作负载的分析,我们观察到很大一部分工作(超过60%)是循环性工作,这使我们有机会根据工作的历史记录自动估算工作资源需求。值得注意的是,作业通常来自不同的计算框架,并且版本可能会在运行之间发生变化。因此,我们想提出一个与框架无关的黑匣子解决方案,以自动进行重复作业的资源需求估算。

目标

  • 对于定期作业,请分析其历史日志并预测其对新运行的资源需求。
  • 支持各种类型的作业日志。
  • 扩展到TB级的作业日志。

建筑

下图说明了资源估计器的实现体系结构。

资源估算器的架构

Hadoop-resourceestimator主要由三个模块组成:转换器,SkylineStore和Estimator。

  1. ResourceSkyline用于表征作业生命周期内的资源利用率。更具体地说,它使用RLESparseResourceAllocationhttps://github.com/apache/hadoop/blob/b6e7d1369690eaf50ce9ea7968f91a72ecb74de0/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/ /java/org/apache/hadoop/yarn/server/resourcemanager/reservation/RLESparseResourceAllocation.java)来记录容器分配信息。RecurrenceId用于标识循环管道的特定运行。管道可以包含多个作业,每个作业都有一个ResourceSkyline来表征其资源利用率。
  2. 转换器分析作业日志,提取其ResourceSkylines,并将其存储到SkylineStore。SingleLineParser解析日志流中的一行并提取ResourceSkylineLogParser使用SingleLineParser递归解析日志流中的每一行。请注意,日志可能具有不同的存储格式,因此LogParser采用字符串流作为输入,而不是File或其他格式。由于作业日志可能具有各种格式,因此需要不同的SingleLineParser实现,因此LogParser会启动SingleLineParser根据用户配置。当前,Hadoop-resourceestimator为SingleLineParser提供两种实现:NativeSingleLineParser支持一种优化的本机格式,由于RM日志广泛可用(在生产部署中),RMSingleLineParser解析Hadoop系统中生成的YARN ResourceManager日志。
  3. SkylineStore充当Hadoop资源估算器的存储层,由两部分组成。HistorySkylineStore存储由Translator提取的ResourceSkylines。它支持四个动作:addHistory,deleteHistory,updateHistory和getHistory。addHistory将新的ResourceSkylines追加到循环管道,而updateHistory删除特定循环管道的所有ResourceSkylines,然后重新插入新的ResourceSkylinesPredictionSkylineStore存储由Estimator生成的预测RLESparseResourceAllocation。它支持两个操作:addEstimation和getEstimation。

    当前,Hadoop资源估计器为SkylineStore提供内存中的实现。

  4. Estimator根据其历史记录运行来预测重复管道的资源需求,将预测存储到SkylineStore并向YARN(YARN-5326)进行重复资源保留。Solver读取特定循环管道的所有历史ResourceSkylines,并预测其在RLESparseResourceAllocation中包装的新资源需求。当前,Hadoop-resourceestimator提供了一个LPSOLVER来进行预测(线性编程模型的详细信息可以在本文中找到)。还有一个BaseSolver可以将预测的资源需求转换为ReservationSubmissionRequest 它由不同的求解器实现用于在YARN上进行重复资源保留。
  5. ResourceEstimationService将Hadoop-resourceestimator包装为微服务,可以轻松地将其部署在集群中。它提供了一组REST API来允许用户指定解析作业日志,查询管道的历史ResourceSkylines,查询管道的预测资源需求和运行SOLVER如果预测不存在,删除ResourceSkylinesSkylineStore

用法

本节将指导您使用资源估计器服务。

这里让$ HADOOP_ROOT代表Hadoop安装目录。如果您自己构建Hadoop,则$ HADOOP_ROOThadoop-dist / target / hadoop- $ VERSION。资源估计器服务$ ResourceEstimatorServiceHome的位置是$ HADOOP_ROOT / share / hadoop / tools / resourceestimator。它包含3个文件夹:binconfdata。请注意,用户可以使用默认配置的资源估算器服务。

  • bin包含资源估计器服务的运行脚本。

  • conf:包含资源估计器服务的配置文件。

  • 数据包含用于运行资源估计器服务示例的示例日志。

步骤1:启动估算器

首先,将配置文件(位于$ ResourceEstimatorServiceHome / conf /中)复制到$ HADOOP_ROOT / etc / hadoop

启动估算器的脚本是start-estimator.sh

$ cd $ ResourceEstimatorServiceHome
$ bin / start-estimator.sh

Web服务器已启动,用户可以通过REST API使用资源估计服务。

步骤2:执行估算器

资源估计器服务的URI为http://0.0.0.0,默认服务端口为9998(在$ ResourceEstimatorServiceHome / conf / resourceestimator-config.xml中配置)。在$ ResourceEstimatorServiceHome / data中,有一个示例日志文件resourceEstimatorService.txt,其中包含两次运行的tpch_q12查询作业的日志。

  • 解析作业日志:POST http:// URI:port / resourceestimator / translator / LOG_FILE_DIRECTORY

发送POST http://0.0.0.0:9998/resourceestimator/translator/data/resourceEstimatorService.txt。基础估算器将从日志文件中提取ResourceSkylines,并将其存储在jobHistory SkylineStore中。

  • 查询作业的历史记录ResourceSkylines:GET http:// URI:port / resourceestimator / skylinestore / history / {pipelineId} / {runId}

发送GET http://0.0.0.0:9998/resourceestimator/skylinestore/history/*/*,基础的估算器将返回历史SkylineStore中的所有记录。您应该能够看到两次运行tpch_q12的ResourceSkylines:tpch_q12_0和tpch_q12_1。请注意,pipelineIdrunId字段均支持通配符操作。

  • 预测工作的资源需求:GET http:// URI:port / resourceestimator / estimator / {pipelineId}

发送http://0.0.0.0:9998/resourceestimator/estimator/tpch_q12,基础估计器将根据其历史资源SkySky预测新运行的作业资源需求,并将预测的资源需求存储到jobEstimation SkylineStore。

  • 查询作业的估计资源状况:GET http:// URI:port / resourceestimator / skylinestore / estimation / {pipelineId}

发送http://0.0.0.0:9998/resourceestimator/skylinestore/estimation/tpch_q12,基础估计器将返回tpch_q12作业的历史资源需求估计。请注意,对于jobEstimation SkylineStore,它不支持通配符操作。

  • 删除作业的历史资源天际线:删除http:// URI:port / resourceestimator / skylinestore / history / {pipelineId} / {runId}

发送http://0.0.0.0:9998/resourceestimator/skylinestore/history/tpch_q12/tpch_q12_0,基础估算器将删除tpch_q12_0的ResourceSkyline记录。重新发送GET http://0.0.0.0:9998/resourceestimator/skylinestore/history/*/*,基础估算器将仅返回tpch_q12_1的ResourceSkyline。

步骤3:运行估算器

停止估算器的脚本是stop-estimator.sh

$ cd $ ResourceEstimatorServiceHome
$ bin / stop-estimator.sh

在这里,我们提供一个使用资源估计器服务的示例。

首先,我们将tpch_q12作业运行9次,并在每次运行中收集作业的资源状况(请注意,在此示例中,我们仅收集“已分配容器的数量”信息)。

然后,我们在Resource Estimator Service中运行日志解析器,以从日志中提取ResourceSkylines,并将其存储在SkylineStore中。下面绘制了作业的ResourceSkylines,以进行演示。

TPCH工作历史记录运行

最后,我们在Resource Estimator Service中运行估算器以预测新运行的资源需求,该需求封装在RLESparseResourceAllocation(https://github.com/apache/hadoop/blob/b6e7d1369690eaf50ce9ea7968f91a72ecb74de0/hadoop-yarn-project/hadoop- yarn / hadoop-yarn-server / hadoop-yarn-server-resourcemanager / src / main / java / org / apache / hadoop / yarn / server / resourcemanager / reservation / RLESparseResourceAllocation.java)。预测的资源需求在下面绘制以进行演示。

TPCH工作经历预测

进阶设定

本节将指导您完成资源估计器服务的配置。配置文件位于$ ResourceEstimatorServiceHome / conf / resourceestimator-config.xml

  • resourceestimator.solver.lp.alpha

资源估算器具有集成的线性规划求解器以进行预测(有关更多详细信息,请参阅https://www.microsoft.com/zh-cn/research/wp-content/uploads/2016/10/osdi16-final107.pdf),并且此参数调整了线性规划模型中资源过度分配和分配不足之间的权衡。此参数从0到1变化,并且较大的alpha值意味着模型可以更好地最小化过度分配。默认值为0.1。

  • resourceestimator.solver.lp.beta

此参数控制线性规划模型的一般化。此参数的范围是0到1。默认值为0.1。

  • resourceestimator.solver.lp.minJobRuns

进行预测所需的最少作业数量。预设值为2。

  • resourceestimator.timeInterval

用于将作业执行离散化为间隔的时间长度。注意,估计器针对每个间隔进行资源分配预测。较小的时间间隔可提供更细粒度的预测,但也需要更长的时间和更多的预测空间。默认值为5(秒)。

  • resourceestimator.skylinestore.provider

天际线存储提供程序的类名称。默认值为org.apache.hadoop.resourceestimator.skylinestore.impl.InMemoryStore,它是skylinestore的内存实现。如果用户要使用自己的skylinestore实现,则需要相应地更改此值。

  • resourceestimator.translator.provider

翻译提供者的类名。默认值为org.apache.hadoop.resourceestimator.translator.impl.BaseLogParser,它从日志流中提取资源行。如果用户要使用自己的转换器实现,则需要相应地更改此值。

  • resourceestimator.translator.line-parser

转换器单行解析器的类名称,它解析日志中的单行。默认值为org.apache.hadoop.resourceestimator.translator.impl.NativeSingleLineParser,它可以解析示例日志中的一行。请注意,如果用户想解析Hadoop资源管理器(https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html)日志,则需要将值设置为org .apache.hadoop.resourceestimator.translator.impl.RmSingleLineParser。如果他们想实现单行解析器来解析其自定义日志文件,则需要相应地更改此值。

  • resourceestimator.solver.provider

求解程序提供程序的类名。默认值为org.apache.hadoop.resourceestimator.solver.impl.LpSolver,该模型结合了线性编程模型来进行预测。如果用户要实现自己的模型,则需要相应地更改此值。

  • resourceestimator.service-port

ResourceEstimatorService侦听的端口。默认值为9998。

未来的工作

  1. 对于SkylineStore,我们计划提供一个持久存储实现。我们正在考虑使用HBase来证明我们的规模需求。

  2. 对于Translator模块,我们希望将Timeline Service v2作为主要来源,因为我们希望依赖稳定的API,并且日志充其量是不稳定的。

  3. 由于偏斜,争用,输入数据或代码更改等,作业资源需求在各个运行中可能会有所不同。我们要设计一个Reprovisioner模块,该模块可在运行时动态监视作业进度,并在进度慢于预期时识别性能瓶颈,以及使用ReservationUpdateRequest相应地动态调整作业的资源分配。

  4. 当Estimator预测工作的资源需求时,我们要根据估计误差(过度分配和分配不足的组合)等提供与预测相关的置信度。

  5. 对于Estimator模块,我们可以集成机器学习工具(例如强化学习)以做出更好的预测。我们还可以与特定领域的求解器(例如PerfOrator)集成,以提高预测质量。

  6. 对于Estimator模块,我们要设计增量求解器,它只能基于新日志来增量更新作业的资源需求。