Hive说我变了,Spark说不你没变 原创
春节不停更,此文正在参加「星光计划-春节更帖活动」
大家好,我是怀瑾握瑜,一只大数据萌新,家有两只吞金兽,嘉与嘉,上能code下能teach的全能奶爸
如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~
题外话
我说:我要买鼠标,领导的声音飘来:你姑娘要交伙食费了
我说:我要买键盘,领导的声音飘来:你姑娘要学舞蹈了
我说:我要买手机,领导的声音飘来:你姑娘要学钢琴了
我说:好的祖宗们,谁让卡在你们手里,你们说的算。。
1.起因
今天写了一个spark程序,其实很简单,就是查询一张表一天的数据,遍历一下,计算个结果,然而放到大环境里运行缺报错了。
报错的现象很是诡异,明明看到SQL只查询一天,但缺直接扫描整个表的全部数据,然后还返回driver里,最后直接内存溢出,看DAG也是在查询阶段就执行了collection。
通过查资料,修改SQL,一溜十三张试了一上午,还是没有效果,以为还是程序或者sql的问题,但一直没有查询到原因。
2.还有意外收获
下午还在调查问题的我,突然收到了运维的通知,Flume落盘的数据太多有积压,已经报警了,调查下发现是数据落hive的程序报错了。
详细查看日志,发现和上午的程序的日志一样,都是查询表的全部数据,再看下报错的时间,开始回想有过什么操作。
上午因为需求给hive表增加了一个字段,这在以前也进行过,但是没有问题啊,而且插入字段后,我还通过
Presto的小工具查询过数据,新增的字段已经有数据了。
进入hive命令行,查看表的创建信息
show create table table_name
发现在字段列表中,新增的字段已经存在,再往下看,发现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字段的值,使之变成正确的内容。
--查询数据库对应的ID
SELECT * FROM dbs WHERE name = 'db_name';
--查询对应表的ID
select * from tbls where TBL_NAME='table_name' and db_id = 'db_id';
--通过 table_id 查找 对应的schema 信息
select * from table_params where TBL_ID=table_id and PARAM_KEY='spark.sql.sources.schema.part.0';
//通过 修改schema ,把缺少的字段按照格式添加进去即可。
UPDATE table_params SET PARAM_VALUE='............' where TBL_ID=table_id and PARAM_KEY='spark.sql.sources.schema.part.0'
至此,问题解决,但这个问题是否还会复现,有待观察。
结束语
如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~
可关注公众号【怀瑾握瑜的嘉与嘉】,获取资源下载方式