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 Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Replace columns is not supported for table default.fac_scan. SerDe 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外部表关联后执行添加字段、更新操作,但是失败了。这是个坎儿呀!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值