问题
在一个CDH集群上出现了一个Hue错误,具体现象是执行了Oozie workflow后,无法显示workflow的DAG信息,显示500内部错误:
排查
首先查看Hue的日志,发现报错信息:AttributeError: 'NoneType' object has no attribute 'name'
查看出问题的代码:
这段代码是从数据库中查询desktop_document表和desktop_document2表的信息,猜测应该是查询返回的数据异常。
到Hue shell中调试这段代码:
注:需要到hue server角色所在节点上进行操作
export HUE_CONF_DIR="/var/run/cloudera-scm-agent/process/$(sudo ls -lrt /var/run/cloudera-scm-agent/process | grep HUE | tail -1 | awk '{print $9}')"
/opt/cloudera/parcels/CDH/lib/hue/build/env/bin/hue shell --cm-managed
>>> from django.contrib.auth.models import User
>>> from desktop.models import Document, Document2
>>> user = User.objects.get(username='hue')
>>> for d in Document.objects.get_docs(user, Document2, extra='workflow2'):
if d.content_object is None:
print(d, type(d))
print(d.content_object, type(d.content_object))
发现是表记录存在问题,在desktop_document表有记录,但是在desktop_document2表没有记录,导致Documemt2类返回None。
到Hue的源数据库,查看desktop_document、desktop_document2表
select * from desktop_document2 where id = (select object_id from desktop_document where name = 'hello' and extra = 'workflow2');
desktop_document2表没有记录返回,所以导致报错。
解决方案
此问题主要是desktop_document表有记录,但是对应的desktop_document2表记录丢失了,所以解决方案是:
1. 删除desktop_document表的记录
2. 修改desktop_document表的记录的object_id字段,指向到desktop_document2表对应记录的id(只要运行workflow,desktop_document2表就有一条最新的记录)
建议使用方案2,方案1会把workflow文档记录删除了,在hue上需要重新编写workflow。
# object_id值是desktop_document2表存在的id
# id值是desktop_document表出问题的记录的id
update desktop_document set object_id = xxx where id = xxx
执行后问题解决,可以显示workflow的DAG: