在首次启动Dr.Elephant时,因为配置不当或者环境因素可能会导致启动失败。当启动失败后,我们可以从Dr.Elephant的日志文件(默认的启动日志是dr.log)中查看启动过程日志,找到Error和Exception,定位问题所在。
下面,是我总结的自己以及大家在启动过程中遇到的一些问题,如果大家也遇到了这些问题,希望可以帮助到你们。
问题一
问题描述
日志中记录ERROR:“Specified key was too long; max key length is 767 bytes [ERROR:1071, SQLSTATE:42000]”, “Database ‘default‘ is in an inconsistent state!”
解决办法
以上两个提示如果都出现,那么原因是:在Dr.Elephant往MySQL的表中创索引时,索引过长导致的,关于这个问题的详细描述,可以查看我的另一篇文章“MySQL索引长度受限怎么办?”。这个问题在Dr.Elephant刚开源时出现的,以后的版本中可能会修复这个问题。问题的原因是:Dr.Elephant的建表语句有一些问题,例如在Dr.Elephant源码文件1.sql中有如下的创建索引语句:
create index yarn_app_result_i4 on yarn_app_result (flow_exec_id);
create index yarn_app_result_i5 on yarn_app_result (job_def_id);
create index yarn_app_result_i6 on yarn_app_result (flow_def_id);
列flow_exec_id、job_def_id和flow_def_id的类型是VARCHAR(800),在这三个列上各自建索引是,索引长度都是3*800=2400,远超过了MySQL对单列索引长度的限制767,所以抛出异常导致启动失败。大家可以查看https://github.com/linkedin/dr-elephant/issues/31 中我和LinkedIn大神akshayrai关于这个问题的沟通,可以了解的更详细一些以及解决办法。具体解决办法是将上面的三个SQL语句修改为:
create index yarn_app_result_i4 on yarn_app_result (flow_exec_id(100));
create index yarn_app_result_i5 on yarn_app_result (job_def_id(100));
create index yarn_app_result_i6 on yarn_app_result (flow_def_id(100));
限制每个索引的长度。就不会再抛出异常了。
还有一点需要注意,如果没有提示“Specified key was too long; max key length is 767 bytes [ERROR:1071, SQLSTATE:42000]”, 而只有“Database ‘default‘ is in an inconsistent state!”。这个时候,很可能是DB的状态确实有问题。比如,可能忘记了创建使用到的数据库,可能数据库连接突然中断等等。需要我们详细的验证数据库的问题。
作者简介:屈世超,对高并发系统设计开发感兴趣,现专注于大数据开发工作。曾任职小米科技公司服务端后台开发工程师,现担任EverString数据平台组高级开发工程师。