从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之前,先要在本地安装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。
运行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中。
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数据平台组高级开发工程师。