1.目标
Dr.Elephant这个项目希望构建一个可以自动优化hadoop mapreduce相关函数的调优框架。在这种情况下,是为了函数消耗最少的资源来完成作业。我们还希望在未来的版本将作业时间也作为函数资源消耗的参考指标。我们使用迭代算法和粒子群优化算法进行自动调优。这些迭代通过分析作业的多次运行结果来完成,我们已经在15-20次的作业中优化了20-30%的资源。
自动优化从作业的默认参数开始,并且在每次运行之后计算判断当前参数是否适合,并且根据算法建议新的参数。为了与Dr.Elephant交互,开发了getCurrentRunParameters新API,它返回给定作业当前运行的参数。
自动调优模块中有以下4个守护进程:
Daemon通过Dr.Elephant的历史数据平均值来计算新作业应当消耗的资源和时间Daemon将继续轮询作业直到完成。对于Azkaban调度器则使用Azkaban rest APIFitness Computation Daemon):一旦作业完成(成功/失败),该Daemon将根据作业消耗的资源和数据大小来评判参数集是否合适Param Generator):一旦设置好当前的参数集,该Daemon就会生成新的参数建议。目前我们使用PSO算法进行新的参数建议。有个getCurrentRunParameters的新API,它从数据库获取建议的参数并将其返回。目前,这是外部系统和Dr Elephant之间唯一的自动调优交互。
自动调优的测试版本将支持以下特性:
Pig Script优化Azkaban调度器我们计划将在未来的版本支持以下特性:
Hive和SparkTable 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记录一次作业的建议参数值。
周末休息了俩天,整理了一下,
dr.elephant基本概念文档还剩一篇就完结啦,后续会写一些实战问题。