Dr.Elephant
这个项目是希望构建一个可以自动优化hadoop mapreduce
相关函数的调优框架。在这种情况下,是为了函数消耗最少的资源来完成作业。我们还希望在未来的版本将作业时间也作为函数资源消耗的参考指标。我们使用迭代算法和粒子群优化算法进行自动调优。这些迭代通过分析作业的多次运行结果来完成,我们已经在15-20次的作业中优化了20-30%的资源。
自动优化从作业的默认参数开始,并且在每次运行之后计算判断当前参数是否适合,并且根据算法建议新的参数。为了与Dr.Elephant
交互,开发了getCurrentRunParameters
新API
,它返回给定作业当前运行的参数。
自动调优模块中有以下4个守护进程:
Daemon
通过Dr.Elephant
的历史数据平均值来计算新作业应当消耗的资源和时间Daemon
将继续轮询作业直到完成。对于Azkaban
调度器则使用Azkaban rest API
Fitness Computation Daemon
):一旦作业完成(成功/失败),该Daemon
将根据作业消耗的资源和数据大小来评判参数集是否合适Param Generator
):一旦设置好当前的参数集,该Daemon
就会生成新的参数建议。目前我们使用PSO
算法进行新的参数建议。有个getCurrentRunParameters
的新API
,它从数据库获取建议的参数并将其返回。目前,这是外部系统和Dr Elephant
之间唯一的自动调优交互。
自动调优的测试版本将支持以下特性:
Pig Script
优化Azkaban
调度器我们计划将在未来的版本支持以下特性:
Hive
和Spark
Table 1: tuning_algorithm
这张表用于记录优化度量信息(资源,时间)和作业类型(Pig,Hive)的算法。通常情况下,一种作业类型应该有一种算法,但框架也支持一行有多种算法。
Table 2: tuning_parameter
此表记录tuning_algorithm
中的每个算法优化的Hadoop参数。
例如mapreduce.map.memory.mb
,mapreduce.task.io.sort.mb
等。
Table 3: flow_definition
此表记录作业流,可以来自任何调度程序,如Azkaban
,Oozie
,Appworx
等。
Table 4: job_definition
此表记录需要优化的作业。还包含除了自动优化信息之外的一般信息。作业信息放在2张表里,因为并不是所有作业都需要开启自动调优。
Table 5: tuning_job_definition
此表记录需要优化的作业和仅需要自动调整的信息。
Table 6: flow_execution
此表记录作业流的执行步骤。
Table 7: job_execution
此表记录作业流中的一次作业。包含自动优化之外的作业执行信息。作业信息放在2张表里,因为并不是所有作业都需要开启自动调优。
Table 8: tuning_job_execution
此表记录一次作业流的作业,并包含自动调优相关信息。这次执行对应一组参数。
Table 9: job_saved_state
由于优化算法的内部表。存储需要优化的作业的当前状态。
Table 10: job_suggested_param_value
记录一次作业的建议参数值。