Hive 说我变了,Spark 说不你没变
大家好,我是怀瑾握瑜,一只大数据萌新,家有两只吞金兽,嘉与嘉,上能 code 下能 teach 的全能奶爸
如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~
题外话
我说:我要买鼠标,领导的声音飘来:你姑娘要交伙食费了
我说:我要买键盘,领导的声音飘来:你姑娘要学舞蹈了
我说:我要买手机,领导的声音飘来:你姑娘要学钢琴了
我说:好的祖宗们,谁让卡在你们手里,你们说的算。。
1.起因
今天写了一个 spark 程序,其实很简单,就是查询一张表一天的数据,遍历一下,计算个结果,然而放到大环境里运行缺报错了。
报错的现象很是诡异,明明看到 SQL 只查询一天,但缺直接扫描整个表的全部数据,然后还返回 driver 里,最后直接内存溢出,看 DAG 也是在查询阶段就执行了 collection。
通过查资料,修改 SQL,一溜十三张试了一上午,还是没有效果,以为还是程序或者 sql 的问题,但一直没有查询到原因。
2.还有意外收获
下午还在调查问题的我,突然收到了运维的通知,Flume 落盘的数据太多有积压,已经报警了,调查下发现是数据落 hive 的程序报错了。
详细查看日志,发现和上午的程序的日志一样,都是查询表的全部数据,再看下报错的时间,开始回想有过什么操作。
上午因为需求给 hive 表增加了一个字段,这在以前也进行过,但是没有问题啊,而且插入字段后,我还通过
Presto 的小工具查询过数据,新增的字段已经有数据了。
进入 hive 命令行,查看表的创建信息
发现在字段列表中,新增的字段已经存在,再往下看,发现 spark.sql.sources.schema.part.0 对应的字符串中居然没有这个字段。
我也查了一下以前 add column 的几张表,对应的字符串里都有新增的字段,这个表却没有。
3.解决问题
现在的现象就好比:
hive 说:我已经变了,你看人家 presto 就懂我,可以直接读我的信息
spark 说:你不说,我怎么知道啊,我只读我的缓存里的,既然没有,就只能从头开始调查了
好吧,这个问题让我想起了很多经历。
试过了几种方式,比如:
修改字段名称,然后再改回来
刷新数据,msck repair table table_name
用 spark.catalog().refreshTable("table_name")
均无效果,最后想到两个绝杀方案。
3.1 重新建表
重新建表肯定是可以的,毕竟表都重建了,那原数据肯定重新刷新了。
当前所有表都是外部表,其实重建完全没有影响,但这样毕竟不优雅,而且万一表不是外部表,就肯定无法使用这个方案。
本着工匠精神,再寻找下一个方案。
3.2 修改 hive 元数据
通过修改 hive 的原数据,更新 schema 字段的值,使之变成正确的内容。
至此,问题解决,但这个问题是否还会复现,有待观察。
结束语
如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~
可关注公众号【怀瑾握瑜的嘉与嘉】,获取资源下载方式
版权声明: 本文为 InfoQ 作者【怀瑾握瑜的嘉与嘉】的原创文章。
原文链接:【http://xie.infoq.cn/article/b7698eb22672eb365d7fb9dd4】。文章转载请联系作者。
评论