hive亿级用户表整挂到复活的经历

Posted 数据挖掘工作室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive亿级用户表整挂到复活的经历相关的知识,希望对你有一定的参考价值。

当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放

数据组有一个需求,创建一张hive用户表,包含用户的基本信息,后续可能会添加字段,作为用户的标签,还有一些字段需要更新,也就是说这张用户表需要每天:insert、update、delete、添加字段。

在这方面并没有经验,经过查询各种资料,新建了分桶表:


hive支持insert、update、delete操作需要hive-site.xml添加这些配置:

 1<property>
2    <name>hive.support.concurrency</name>
3    <value>true</value>
4</property>
5<property>
6    <name>hive.exec.dynamic.partition.mode</name>
7    <value>nonstrict</value>
8</property>
9<property>
10    <name>hive.txn.manager</name>
11    <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
12</property>
13<property>
14    <name>hive.compactor.initiator.on</name>
15    <value>true</value>
16</property>
17<property>
18    <name>hive.compactor.worker.threads</name>
19    <value>1</value>
20</property>
21<property>
22   <name>hive.enforce.bucketing</name>
23   <value>true</value>
24</property>



说明:建表语句必须带有into buckets子句和stored as orc TBLPROPERTIES ('transactional'='true')子句,并且不能带有sorted by子句。


例如:

1create external table if not exists hm2.history_helper
2(
3guid string,
4starttime string,
5endtime string,
6num int
7)
8clustered by(guid) into 50 buckets
9stored as orc TBLPROPERTIES ('transactional'='true');


这样,这个表就可以就行insert,update,delete操作了。


本来一切都很正常,每天定时任务很稳定,知道需要对表添加字段,于是,我执行了如下语句:

1alter table hm2.history_helper add columns(country string, province string, city string);


这时候,表中数据还是可以查询的,只是添加的三列因为历史没有数据,显示为NULL

执行一个update语句后,显示更新成功,然后表就挂了。

执行select * from table limit 1;都不能执行了,直接报错:

 1Error: java.io.IOException: java.lang.ArrayIndexOutOfBoundsException: 11
2    at org.apache.hadoop.hive.io.HiveIOExceptionHandlerChain.handleRecordReaderCreationException(HiveIOExceptionHandlerChain.java:97)
3    at org.apache.hadoop.hive.io.HiveIOExceptionHandlerUtil.handleRecordReaderCreationException(HiveIOExceptionHandlerUtil.java:57)
4    at org.apache.hadoop.hive.ql.io.HiveInputFormat.getRecordReader(HiveInputFormat.java:252)
5    at org.apache.hadoop.hive.ql.io.CombineHiveInputFormat.getRecordReader(CombineHiveInputFormat.java:701)
6    at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.<init>(MapTask.java:169)
7    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:429)
8    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
9    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163)
10    at java.security.AccessController.doPrivileged(Native Method)
11    at javax.security.auth.Subject.doAs(Subject.java:422)
12    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1692)
13    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)

这也是无奈了,google一下,一哥们儿说可以将添加的列删除,恢复表:

1ALTER TABLE history_helper replace COLUMNS (
2guid string,
3starttime string,
4endtime string,
5num int
6);

其实,又会报错这样:

1Execution Errorreturn code 1 from org.apache.hadoop.hive.ql.exec.DDLTaskReplace columns is not supported for table default.fac_scanSerDe may be incompatible

然后他给的建议是:这个时候的操作只能是删除原表,再根据新结构重建新表。这意思表不就废了。

https://blog.csdn.net/youzhouliu/article/details/52998328

我从hdfs目录看到今天的修改时间:

1drwxr-xr-x   - hadoop supergroup          0 2018-09-27 12:57 /hive/warehouse/hm2.db/history_helper/.hive-staging_hive_2018-10-12_12-54-16_647_2029592254486085251-1
2drwxr-xr-x   - hadoop supergroup          0 2018-9-28 13:15 /hive/warehouse/hm2.db/history_helper/.hive-staging_hive_2018-10-12_13-12-21_614_5380977921537493007-1
3drwxr-xr-x   - hadoop supergroup          0 2018-09-30 13:35 /hive/warehouse/hm2.db/history_helper/.hive-staging_hive_2018-10-12_13-32-49_772_5132148987957791034-1
4drwxr-xr-x   - hadoop supergroup          0 2018-07-1 12:44 /hive/warehouse/hm2.db/history_helper/delta_0000864_0000864
5drwxr-xr-x   - hadoop supergroup          0 2018-07-02 12:57 /hive/warehouse/hm2.db/history_helper/delta_0000866_0000866
6...
7
8drwxr-xr-x   - hadoop supergroup          0 2018-10-12 13:42 /hive/warehouse/hm2.db/history_helper/delta_0000873_0000873

将今天的文件删除,没想到就好了,可以执行:

1select * from hm2.history_helper limit 10;

开心!

赶紧备份一份数据到新表!

后来尝试了,创建hbase表,通过hive外部表关联后执行添加字段、更新操作,但是失败了。这是个坎儿呀!



点击【阅读原文】访问我的个人博客!

以上是关于hive亿级用户表整挂到复活的经历的主要内容,如果未能解决你的问题,请参考以下文章

应该这么设计亿级用户秒杀系统!

糟糕,老板让我一个亿级用户秒杀系统!

Mysql 上亿级数据导入Hive思路分享

Hive数据倾斜优化:两个亿级表join

微信“赞赏码”为打赏小费而复活,这似乎并不是真的

一次深夜优化MySQL亿级数据分页的奇妙经历