Dr.Elephant开发者指南 - 【Dr.Elephant系列文章-3】

创建Dr.Elephant项目

获取源代码

从Github仓库中获取代码,dr-elephant

编译代码

Dr.Elephant项目基于Play框架开发,所以开发Dr.Elephant项目的第一步就是安装Play框架。可以在下面这个链接下载到最新版本的Play框架:https://www.playframework.com/download。安装Play框架之后,一定要将play命令添加到环境变量$PATH中。

执行编译脚本,就可以对Dr.Elephant项目进行编译。编译过以后,会在zip文件夹中生成一个zip包。在执行编译命令时,可以选择带一个参数选项来指明编译的配置文件。在这个配置文件中,可以指定Hadoop或者Spark的版本信息。在不指定的情况下,默认的配置是Hadoop2.3.0以及Spark1.4.0 。在配置文件中除了可以指定以上两个版本信息外,还可以通过play_opts参数来指定play/sbt的选项。

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

$> cat compile.conf

输出是:

hadoop_version = 2.3.0                                      // The Hadoop version to compile with

spark_version = 1.4.0                                       // The Spark version to compile with

play_opts="-Dsbt.repository.config=app-conf/resolver.conf"  // Other play/sbt options

以上的三个参数如果没有通过配置文件指定,默认就会使用上面列举出的默认值。如果想指定一个固定的仓库,可以通过设置sbt.repository.config 为resolver文件的位置来实现,如上面所示即可。

测试Dr.Elephant

启动单元测试

调用编译脚本,就会运行所有的单元测试程序。

本地部署测试Dr.Elephant

准备工作

Yarn和Hadoop/Spark

在本地部署Dr.Elephant之前,先要在本地安装Hadoop和Spark(Yarn模式),而且要确保资源管理器(Resource Manager)和历史任务服务(Job History Service)程序的正确运行。关于Yarn上MapReduce任务的伪分布式模式可以参考伪分布式部署

指定环境变量HADOOP_HOME:

$>export HADOOP_HOME=/path/to/hadoop/home

$>export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

将Hadoop的Home目录添加到系统环境变量,Dr.Elephant会使用到Hadoop的Classpath中的某些Class文件。

$>export PATH=$HADOOP_HOME/bin:$PATH

数据库

Dr.Elephant需要将任务信息和任务的诊断信息存储在本地数据库MySQL中。

在本地安装启动MySQL。可以在这个链接下载到最新版本的MySQL:https://www.mysql.com/downloads/ 。Dr.Elephant目前只支持MySQL5.5以上的版本。在MySQL中创建一个数据库,名称为drelephant

$> mysql -u root -p

mysql> create database drelephant

在Dr.Elephant的配置文件app-conf/elephant.conf中可以配置数据库的url、数据库名称、用户名称和密码。

使用其他数据库

目前,Dr.Elephant默认是用MySQL数据库。我们可以在演化文件(evolution files)中看到MySQL的DDL声明。如果我们希望能够使用其他的数据库,可以参考这里进行配置。

本地安装Dr.Elephant

完成上面的安装前准备之后,可以开始在本地安装Dr.Elephant。

运行Hadoop,并运行Hadoop历史任务服务。

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

编译Dr.Elephant项目,生成分布式部署的包。进入项目中的dist文件夹,这个文件夹包含了需要进行分布式部署的zip包。使用unzip命令将zip包解包,然后修改dr-elephant的发布目录。以后的描述中,我们都用DR_RELEASE来表示dr-elephant的发布目录。

$>cd dist; unzip dr-elephant*.zip;cd dr-elephant*

创建完数据库之后,首次运行Dr.Elephant时,需要启动演化功能(evolution)。启动演化功能时,可以在elephant.conf配置文件中参数jvm_props添加(或者将对jvm_props的注释符去掉)-Devolutionplugin=enable -DapplyEvolutions.default=true。

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

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

启动Dr.Elephant时,运行start.sh脚本,并在参数中带上应用程序的配置文件目录。

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

如果需要停止Dr.Elephant,运行:

$> $DR_RELEASE/bin/stop.sh

当Dr.Elephant运行成功之后,可以通过”ip:port”(localhost:8080)在浏览器中打开UI。

Dr.Elephant的日志默认输出到dr-elephant发布目录的同级目录dist中。

$> less $DR_RELEASE/../logs/elephant/dr_elephant.log

项目结构

app                             → Contains all the source files

 └ com.linkedin.drelepahnt      → Application Daemons

 └ org.apache.spark             → Spark Support

 └ controllers                  → Controller logic

 └ models                       → Includes models that Map to DB

 └ views                        → Page templates

app-conf                        → Application Configurations

 └ elephant.conf                → Port, DB, Keytab and other JVM Configurations (Overrides application.conf)

 └ FetcherConf.xml              → Fetcher Configurations

 └ HeuristicConf.xml            → Heuristic Configurations

 └ JobTypeConf.xml              → JobType Configurations

conf                            → Configurations files

 └ evolutions                   → DB Schema

 └ application.conf             → Main configuration file

 └ log4j.properties             → log configuration file

 └ routes                       → Routes definition

images

 └ wiki                         → Contains the images used in the wiki documentation

public                          → Public assets

 └ assets                       → Library files

 └ css                          → CSS files

 └ images                       → Image files

 └ js                           → Javascript files

scripts

 └ start.sh                     → Starts Dr. Elephant

 └ stop.sh                      → Stops Dr. Elephant

test                            → Source folder for unit tests

compile.sh                      → Compiles the application

启发式算法

针对MapReduce和Spark,Dr.Elephant已经实现了一系列的启发式算法。如果想对启发式算法进行更深入的了解,请阅读“启发式算法指南”部分。所有的启发式算法都是插件式的,可以简单的配置使用。

添加新的启发式算法

我们可以按照下面的步骤去添加自定义的启发式算法,并把它添加到Dr.Elephant中。

  1. 创建新的启发式算法,并完成测试。
  2. 为该启发式算法创建一个新的view页,例如helpMapperSpill.scala.html。
  3. 在HeuristicConf.xml文件中添加该启发式算法的详情。
  4. HeuristicConf.xml文件中启发式算法的详情包含以下内容:

            i. 应用程序类型:是mapreduce程序还是spark程序。

            ii. 启发式算法名称。

           iii. 类名称:类名的全称。

           iv. view页的名称

            v. 该启发式算法适用的Hadoop版本号

     5. 启动Dr.Elephant,就包含了新的启发式算法

HeuristicConf.xm文件示例:

<heuristic>

<applicationtype>mapreduce</applicationtype>

<heuristicname>Mapper GC</heuristicname>

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

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

</heuristic>

配置启发式算法

每个启发式算法都有一些阈值,用来计算不同的待优化等级。我们可以在HeuristicConf.xml文件中指定这些阈值。

下面给出一个例子,介绍如何指定启发式算法的阈值:

<heuristic>

<applicationtype>mapreduce</applicationtype>

<heuristicname>Mapper Data Skew</heuristicname>

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

<viewname>views.html.help.mapreduce.helpMapperDataSkew</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>

分数计算

在Dr.Elephant中,使用启发式算法来分析运行完成的任务,会得到一个分数。这个分数的计算方法比较简单,可以通过将待优化等级的值乘以作业(task)数量。

int score =0;

if (severity != Severity.NONE&& severity!= Severity.LOW) {

    score = severity.getValue()* tasks;

}

return score;

Dr.Elephant可以计算不同任务类型的得分:

作业分数:所有作业的待优化等级数值之和

任务分数:该任务中所有的作业分数之和

任务流分数:该任务流中所有的任务分数之和


作者简介:屈世超,对高并发系统设计开发感兴趣,现专注于大数据开发工作。曾任职小米科技公司服务端后台开发工程师,现担任EverString数据平台组高级开发工程师。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值