北京物流信息联盟

Dr.elephant系统的配置与分析

大数据与数据科学家 2020-11-20 16:12:48

本文作者:巢泽敏、李天禹、黎婧璇


简介


Dr.Elephant是Hadoop和Spark性能监控和调优工具。它会自动收集所有的指标,针对指标执行分析任务,并用简易的方式将其展示出来。它的目标是提高开发人员的工作效率,简化任务调优工作以更好的提高集群性能。它使用一组可插拔、可配置、基于规则的启发式(heuristics)来分析Hadoop和Spark任务并给出关于任务性能的详细报告信息,然后,基于该结果给出如何让任务执行得更为有效建议。



1. Dr.elephant系统介绍


1.1 背景介绍


Hadoop是一个大型分布式集群存储及计算的框架,同时其生态圈中引入了大量彼此相互作用的部件。由于其庞大而复杂的框架,确保每一个部件都高效执行是非常重要的。虽然开发者总能优化底层的硬件资源、网络基础设施、操作系统,以及整个系统的其它部分,但只有用户才能优化集群上执行的任务。


1.2系统提出的动机


为了帮助用户了解和优化他们自己的流程,虽然可以定期进行培训来告诉他们如何优化自己的任务,但这并没有真正解决问题。在LinkedIn ,有不同Hadoop使用经验的员工使用不同的技术在集群中运行他们的任务。此外, Hadoop的用户数量不断增加。这意味着,针对不同的用户、不同的技术进行常规的培训变的越来越难,而且这样的工作根本不具备良好的扩展性。


直到几年前,LinkedIn的Hadoop团队开始代替员工进行工作流分析,并给出任务的优化建议。作为优化工作的第一步,基于一些简单规则,给予用户一些建议,并取得了明显的优化效果。但是,随着用户的增加,由于用户参与总会有些延迟,使得越来越难提供足够的支持资源。没有办法验证是否达到了任务性能的优化目标或者保证性能优化方向的全覆盖。因此,需要一个标准化和自动化的过程。


Hadoop的专家们审查流程时发现几个常见的经常性的优化模式,并在此基础上,决定开始一个新的实验项目,同时为Hadoop平台开发者和Hadoop框架使用者提供优化。这就是Dr.Elephant的诞生过程并在2016年4月18 日,LinkedIn开源Dr. Elephant。


1.3系统的结构


我们深入源码分析系统的结构。


Figure1 Drelephant源码结构


Dr.elephant采用MVC架构模式,其核心功能基本都在app目录下,包括程序启动入口,配置文件加载,监控数据的抓取,利用启发式算法对数据的分析,等级评定等。


Table1 Dr.elephant app源码结构


1.4系统的工作流程

首先,我们利用一个场景来简单说明Dr.Elephant系统是如何来帮助分析和优化。

Dr.Elephant以固定的间隔,从Yarn的Resource Manager获取所有最近成功和失败的应用程序列表。从JobHistory获取每个应用的元数据 - 即,counter,配置和任务数据。一旦它拥有所有的元数据,Dr.Elephant便运行一组启发式(heuristics),并产生对单个启发式和任务整体性能的诊断报告。然后,报告中用五个严重性级别来标记不同的结果,以表明潜在的性能问题。


Figure1 Dr.elephant工作流程


具体来说,当程序启动后,Dr.elephant首先加载hdfs的配置信息;接着初始化ElephantContext实例,解析配置文件,获得各个Aggregator的完全限定名,应用类型和自定义参数,通过反射机制构造Aggregator实例,并注入参数;然后初始化Metrics开源性能监控工具监测Drelephant本身;接下来利用ResourceManager的API获取AnalyticJobs,封装后放入线程池中,对应用进行分析;最后根据监控的程序类型确定fetcher,抓取数据,并根据程序类型确定启发式规则列表,对获取到的数据进行分析,并将分析结果保存到MySQL数据库中。


Figure2 Dr.elephant工作流程


目前,Dr.elephant也支持对Spark程序的简单监控和评估分析。针对Spark类型的application,Dr.elephant采集一些基本的配置参数,并根据内存的利用度和负载均衡进行评估分析,并通过计算单阶段任务失败率严重度(single_stage_tasks_failure_rate_severity)问题的严重程度,给出一些基本的建议。


Table 2 Spark app 基本配置参数采集


Table 3优化建议是内存的利用度的,如果分配的内存比计算时实际使用的内存峰值或者均值大很多,则说明存在内存浪费现象。


Table 4 Executor 的优化建议主要是负载均均衡方面的,通过计算不同excutor上的负载分布偏差来衡量问题的严重程度(通过方差),是否需要进行优化。

Table 5通过计算job的平均失败率来衡量任务执行的状况


1.5 系统的应用


大多数Hadoop的优化工具,无论是开源还是专有的,旨在收集系统资源指标和监控集群资源。他们专注于简化Hadoop集群的部署和管理。很少有工具专注于帮助Hadoop用户优化他们的任务。可用的那几个要么不活跃,要么不能扩展并支持不断增长的Hadoop框架。Dr.Elephant支持Hadoop,并且可以很容易地扩展到新的框架。它也支持Spark。可以加入、配置任意多的自定义启发式(heuristics)。它的目的是帮助Hadoop和Spark的用户了解他们的任务内部执行情况,并帮助他们很容易的优化自己的任务。


2.系统安装与配置


2.1 编译环境要求


Dr. Elephant项目地址: https://github.com/linkedin/dr-elephant


Dr. Elephant没有可以直接运行的二进制版本,需要自行下载源代码进行编译,其整个过程相对繁琐。


编译环境:

Vmware workStation 虚拟机

OS:ubuntu 16.04

Java : openjdk version "9-internal" (build 9-internal+0-2016-04-14-195246.buildd.src)

Npm 版本:4.0.5


2.2 安装mysql和play框架


安装Dr. Elephant之前还需要安装play framework(一个使用无状态MVC模型的全栈Java Web应用框架):

从http://www.playframework.org/下载play framework ,解压之后将根目录下的 play加入系统环境变量运行 play测试之 


因为ubuntu 使用APT-get 命令安装的native软件包版本比较落后,Ubuntu16.04默认的mysql版本不能支持Dr. Elephant,安装之前要从MySQL官网上下载APT包,确保安装的版本是最新的。


从https://dev.mysql.com/downloads/repo/apt/ 下载APT包 mysql-apt-config_0.8.1-1_all.deb


安装APT包:

sudo dpkg -i mysql-apt-config_0.8.1-1_all.deb

sudo apt-get update

sudo apt-get install mysql-server


Dr. Elephant 目前支持 mysql 5.5+ 以上的版本,安装之前应该检查版本


$ mysql -V

说明mysql安装成功


2.3 Dr. Elephant编译

a) 确保 npm 版本号不低于 4.0, java  版本号不低于 1.8  ,play命令,mvn 命令已经加入环境变量。

b) 从git上下载源代码到本地或者直接下载源码ZIP包:

git clone https://github.com/<username>/dr-elephant

c) 下载源码之后进入文件夹根目录


找到编译配置文件./compile.conf,并且修改相应的Hadoop 和Spark版本号,使其和实际需要的运行环境相一致,在这里Spark 环境采用Spark 2.0.2 Hadoop 环境使用2.6.0


Hadoop_version=2.6.0

Spark_version=2.0。2

play_opts="-Dsbt.repository.config=app-conf/resolver.conf"


d) 在编译环境配置完成之后,运行编译脚本

$> ./compile.sh [./compile.conf]



编译过程相对时间比较长,需要保持联网下载依赖包,最好能够开启VPN 否则编译可能会失败,或者在maven配置中更改仓库镜像也可以改善这一问题。


因为Dr. Elephant 目前还不是很成熟,开发人员也比较少,Dr. Elephant目前还不是很成熟,开发人员也比较少,和其他系统相比稳定性和可靠性都不高,兼容性也较差。Dr. Elephant的编译和部署并对所有Spark 和Hadoop版本都能成功,而开发人员也没有给出具体支持的版本列表。所以并不是所有版本的Spark和 Hadoop 都受到支持。由Spark, Hadoop的API变化,所以在源代码进行联合编译的过程中可能会出现API无法对接的情况。开源项目组比较任性的表示最近Spark fetcher正在经历一个比较大的重构过程,所以只保证对Hadoop 2.3.0的兼容性,但是由于Hadoop2.3.0在Hadoop的官网已经下架,所以这次使用重构之前的项目代码,我们这次编译的代码是大约5个月之前发布的源代码。


但即使是以前的代码,可能对版本号大于2.x.x的Spark版本进行编译的过程或中会遇到一些额外的问题:比如Spark 2..0.2。


e) 在编译的过程中可能会遇到如下问题,



联合编译项目代码过程中sbt显示无法解析代码中使用的依赖com.fasterxml.jackson.core. jackson-databind 2.5.4,所以需要手动调整项目的编译依赖文件,该文件在根文件夹下 /project/下的Dependencies.scala、

找到

"com.fasterxml.jackson.core" % "jackson-databind" % "jacksonVersion"(这个变量的值是2.5.3)

改为

"com.fasterxml.jackson.core" % "jackson-databind" % "2.5.4",


保存后重新开始编译,如果编译成功,文件夹中./dist目录下会出现一个压缩包文件dr-elephant*.zip。


2.4 Dr. Elephant安装与部署


首先,将dr-elephant*.zip放入一个合适的位置并解压,并且注意用户应该拥有该文件夹的全部权限。


之后需要在mysql上创建和登录数据库管理员帐号,在这里我们创建了一个管理员账号root,其密码为”sql”,在本地登录。


$ mysql -u root –psql

创建用户数据库,命名为Dr. Elephant

mysql> create database drelephant;


通过外部软件可以看到创建了一个新的数据库



确认数据库创建成功后为

Dr. Elephant项目文件夹/app-conf中的配置文件  elephant.conf,找到并修改以下几项

db_url=localhost

db_name= drelephant

db_user=root

db_password="sql"


四项分别为mysql数据库服务器地址,数据库名称,该数据库所有者的用户名和密码。


前面所述的dittribution压缩文件夹拷到想要安装的目录下

确认一下以下环境变量已经被正确配置在系统环境变量(/etc/profile)中:

export HADOOP_HOME=/path/to/Hadoop/home

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/Hadoop

export PATH=$HADOOP_HOME/bin:$PATH


注意:如果在创建数据库后第一次执行, Dr. Elephant,需要在elephant.conf file 后面追加

jvm_props=" -Devolutionplugin=enabled -DapplyEvolutions.default=true"

在第一次启动drelephant之后再将这一条删除


启动Hadoop 

$HADOOP_HOME/sbin/start-dfs.sh

$HADOOP_HOME/sbin/start-yarn.sh


启动Hadoop 历史服务器

$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver


确认Hadoop启动正常

$jps


第一次启动需要允许在数据库中新建表单。

$> vim ./app-conf/elephant.conf

jvm_props=" -Devolutionplugin=enabled -DapplyEvolutions.default=true"


设置环境变量:

ELEPHANT_CONF_DIR="/usr/local/dr-elephant/app-conf"

DR_RELEASE="/usr/local/dr-elephant"


要启动Dr. Elephant ,需要启动及脚本,

$DR_RELEASE/bin/start.sh $DR_RELEASE/app-conf

 


至此,Dr. Elephant 启动成功


这是Dr. Elephant 的主界面,可以看到显示出了今天运行的两个应用



和Hadoop history server 上的内容相比较,说明drelephant 启动成功



终止Dr. Elephant 进程则需运行:

$> $DR_RELEASE/bin/stop.sh


注意:Dr. Elephant异常处理方面做的不太好,如果在关机之前没有将Dr. Elephant进行关闭,或者没有调用/bin/stop.sh终止Dr. Elephant的话,会因为出现无法启动的问题,需要删除项目根目录下的RUNNING_PID文件,之后才能够重启Dr. Elephant。


3.应用的设计与实现


3.1应用简介


该应用实现了对Hadoop程序的监控,评估分析,以及分类查询提取信息,自定义安全等级和启发式算法等功能。应用基于Drelephant对Hadoop app的监控评估模块,并在此基础上,对Drelephant从ResourceManager以及JobhistorySever上抓取到的程序信息进行处理,按照用户的查询条件,展示相应程序的有关信息;按照用户自定义标准,对程序类别和安全等级进行重定义或增加删除修改;用户可以自定义启发式规则,实现个性化程序监控和评估。


3.2设计思想


分类聚合查询功能利用Drelephant的REST API实现对程序信息列表的抓取,然后对重要信息进行特征提取,并对程序分类并按照类别存储,用户查询时可以按照自定义条件对相应类别下的信息进行综合展示。


自定义启发式规则功能是在Drelephant上层编写插件,使得用户能够通过插件对文件进行增加删除修改等操作,对程序相关信息自定义编写启发式算法。


自定义等级功能和自定义启发式规则功能相似,在Drelephant上层编写插件,使得用户能够修改HeuristicConf文件下各个等级的阈值,从而达到根据用户需求自定义程序安全等级的目的。


3.3具体实现


3.3.1 自定义查询


自定义查询部分分为三个模块:信息抓取,特征提取,信息处理。信息抓取模块,通过调用Drelephant REST API实现hdfs上的数据获取,将返回的json格式数据存储到本地,利用python强大的json库来提取程序的关键信息,如程序的配置信息,运行时间等性能信息,安全等级等评估分析信息等,然后按照安全等级分别存储。用户查询时根据所输入的安全等级进行分类展示,如各安全等级下程序数量比例等。


3.3.2 自定义安全等级


自定义安全等级部分:通过python程序修改heuristicconf.xml文件中有关等级阈值的部分,根据用户定义条件,修改等级划分点性能指标值和各个等级下性能指标区间,根据安全等级不同在页面上显示不同颜色。


3.3.3 自定义启发式算法


自定义启发式算法部分:自定义启发式算法的增加删除和修改分为两个方面,一是在原有启发式规则的类别下增删改细节条目,二是在原来没有的启发式规则的类别下增删改细节条目。对于前一种类型的修改,可以直接在原有类别启发式规则的文件下增加自定义函数,收集需要的配置信息并做自定义处理;对于后一种类型的修改,需要新建启发式规则文件,再自定义规则函数。


对于原Dr.elephant未使用的性能参数,可以根据参数的存储位置,从Hadoop的jobhistory sever,ResourceManager和REST api中抓取。


3.3.4 代码实现


(1) 自定义查询功能


data = urllib.urlopen(url).read()

jsonfile = writetofile(data)

 

value = json.loads(data)

for app in value:

performance = computeinf(app_information)

writetofile(performance, performance_file)

 

for app in performance_file:

view(search_condition)


(2)自定义安全等级修改功能


<heuristic>

    <applicationtype>apptype</applicationtype>

    <heuristicname>heuristicname</heuristicname>

    <classname>com.linkedin.drelephant.mapreduce.heuristics. Heuristic</classname>

    <viewname>views.html.help.mapreduce.helpheuristicname</viewname>

    <params>

      <num_tasks_severity>10, 50, 100, 200</num_tasks_severity>

      <deviation_severity>2, 4, 8, 16</deviation_severity>

      <files_severity>1/8, 1/4, 1/2, 1</files_severity>

    </params>

  </heuristic>


(3)自定义启发式算法修改功能


if parameters not in ConfigurationData:

public abstract class MapReduceFetcher implements ElephantFetcher<ApplicationData> {

public Fetcher(FetcherConfigurationData Applicationid) {

return ApplicationData data;

}

}

if Heuristic_type in Heuristics:

protected heuristic_func[] getTasks(ApplicationData data){

    return data.getData();

    }

  else:

  public class Heuristic_type extends Heuristic {

 

  public Heuristic_type(HeuristicConfigurationData heuristicConfData) {

    super(heuristicConfData);

  }

  @Override

  protected heuristic_func[] getTasks(ApplicationData data){

    return data.getData();

    }

  }


 

4.实验设计


运行程序:Hadoop自带例程grep和wordcount

输入数据:Hadoop源码中/etc/Hadoop 中的所有xml文件作为输入数据


5.实验结果与分析


5.1 在原Drelephant系统下对运行程序的评估结果如下:

Figure 1原Drelephant历史任务评价列表



Figure 2原Drelephant历史任务评价分析指标



Figure 3修改后Drelephant历史任务评价指标和等级显示



5.2 自定义修改安全等级阈值后程序评估分析结果如下:


当修改MapperGC时间比等级阈值为0.1, 0.4,0.6, 0.8后,评估等级达到严重危险级别,变色显示。


Figure 4减低安全等级阈值后程序评估分析结果


Figure 5默认安全等级阈值下程序评估分析结果


5.3 自定义添加启发式规则后程序评估分析结果如下:


在shuffle&sort类别下添加启发式规则,计算shuffle时间比;

添加map&reduce综合评定类别启发式规则,计算map和reduce时间比。

Figure 6自定义添加启发式规则后程序评估分析结果


5.4 聚合查询程序结果:


计算各个安全等级下程序数量比。

Figure 7显示每个安全等级下程序数量比


5.5 系统合适性


Drelephant对hdfs上历史程序的各种信息能够比较全面的抓取,并且实现了基本的分析,其可扩展性和界面友好性也都很强,因此适合该应用。



“大数据与数据科学家”公众号

主编:王宏志

特邀副主编: 朱劼

副主编: 丁小欧

责任编辑: 齐志鑫,宋扬

编辑: 陶颖安

-精彩内容,记得分享到朋友圈-

长按下图并点击 “识别图中二维码”,即可关注大数据与数据科学家微信公共号