工厂任务错误的处理方法记录
目录
问题一:空值导致的任务失败
错误现象:非语法错误,任务执行失败。
初始解决思路(错误):怀疑是资源不足或MapReduce资源分配不均,尝试增加reduce任务数:
set mapred.reduce.tasks=200;
select 语句最后可附上 distribute by rand()
真正的原因:通过查看第二次、第三次运行的日志(Spark引擎)发现,数据中含有null空值。具体是计算语句中有ipdic(src_ip),而src_ip可能为空。
正确解决方法:在WHERE条件中加上对null的过滤,问题解决。
WHERE src_ip IS NOT NULL
问题二:迁移粘贴的大坑
当从现有任务复制创建新任务并修改参数时,修改后的配置保存成功且check通过,但实际跑起来后发现配置又回到修改前的状态。
原因:复制功能会同步源任务的配置到新配置。如果新配置要做修改,必须选择普通粘贴,然后手动逐一填写所有参数。
问题三:LEFT JOIN中的条件应该放在WHERE而不是ON
在使用LEFT JOIN时,on和where条件的含义和效果完全不同:
- ON条件:在生成临时表时使用,不管条件是否为真,都会返回左边表中的记录。
- WHERE条件:在临时表生成好后,再对临时表进行过滤。此时没有LEFT JOIN的含义(必须返回左表的记录),条件不为真的记录会全部被过滤掉。
所以在过滤左表数据时,条件应该加在WHERE后面而不是LEFT JOIN的ON后面。
问题四:批量重跑任务的页数限制
想要一次批量重跑多个任务,但页面只能每次选20个任务。
解决方法:直接修改浏览器页面内容(开发者工具)来增加单页显示数量。
问题五:历史任务重跑提示”parent job not found”
在一些任务前加了新任务后,想重跑这些任务很久以前的数据,但提示”parent job not found”。
原因:找不到任务在该时间点的父任务,因为在当初那个时间点父任务还没创建。
解决方法:
- 把父任务撤掉,恢复到原结构,跑完再恢复。
- 重跑前面的定时器任务(尚未实践验证)。