写点什么

Hive 说我变了,Spark 说不你没变

  • 2022 年 7 月 10 日
  • 本文字数:1360 字

    阅读完需:约 4 分钟

大家好,我是怀瑾握瑜,一只大数据萌新,家有两只吞金兽,嘉与嘉,上能 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 字段的值,使之变成正确的内容。


--查询数据库对应的IDSELECT * FROM dbs WHERE name = 'db_name';--查询对应表的IDselect * 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'
复制代码


至此,问题解决,但这个问题是否还会复现,有待观察。



结束语

如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~

可关注公众号【怀瑾握瑜的嘉与嘉】,获取资源下载方式

发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2022.07.01 加入

还未添加个人简介

评论

发布
暂无评论
Hive说我变了,Spark说不你没变_spark_怀瑾握瑜的嘉与嘉_InfoQ写作社区