Hive 不同存储格式表数据同步问题

时间:2021-07-13 00:16:15

本人在同步两个集群的hive数据时遇到了一个坑爹的问题,A集群X表为RCFILE格式,B集群Y表为ORCFILE格式,现需要将X表的历史数据同步到Y表中。当初天真的以为直接导出导入就能解决问题了,完全忽略了存储格式不同的问题,结果同步完后,查询时直接一个错误砸我脸上。部分错误如下:

Caused by:java.lang.reflect.InvocationTargetException

      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

      at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

      at java.lang.reflect.Constructor.newInstance(Constructor.java:526)

      at org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.initNextRecordReader(HadoopShimsSecure.java:251)

         ... 11 more

Caused by:java.io.IOException: Malformed ORC filehdfs://tongjihadoop151:8020/user/hive/warehouse/client_uv_daily_test/dt=2015-07-23/client_uv_2015-07-23.Invalid postscript.

       at org.apache.hadoop.hive.ql.io.orc.ReaderImpl.ensureOrcFooter(ReaderImpl.java:245)

       at org.apache.hadoop.hive.ql.io.orc.ReaderImpl.extractMetaInfoFromFooter(ReaderImpl.java:370)

       at org.apache.hadoop.hive.ql.io.orc.ReaderImpl.<init>(ReaderImpl.java:311)

       at org.apache.hadoop.hive.ql.io.orc.OrcFile.createReader(OrcFile.java:228)

       at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat.getRecordReader(OrcInputFormat.java:1025)

       at org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.<init>(CombineHiveRecordReader.java:66)

       ... 16 more

解决方案是利用TEXTFILE格式的表中转.

#数据导出 RCFILE

hive -e "select * from X" >> /data2/hive_tmp/X_data.log;

 

#数据导入 TEXTFILE

LOAD DATA LOCAL INPATH '/data2/hive_tmp/X_data.log'

OVERWRITE INTO TABLE X_tmp;

 

#数据转入 ORCFILE

set hive.exec.dynamic.partition=true;(可通过这个语句查看:set hive.exec.dynamic.partition;) 

set hive.exec.dynamic.partition.mode=nonstrict; 

SET hive.exec.max.dynamic.partitions=100000;(如果自动分区数大于这个参数,将会报错)

SET hive.exec.max.dynamic.partitions.pernode=100000;(每个任务节点可以产生的最大的分区数)

 

insert overwrite TABLE Y PARTITION(dt)

select userkey, dt from X_tmp;

 

PS:需要注意的是TEXTFILE中转后,部分特殊符号会出现问题,比如#,变成了%2323,最后变成了#23,这应该是编码的问题,还未细究.

第一次写博客想想还有点小激动啊!通过把自己遇到的一些问题记录在此,算是对自己的一种备忘,有什么错误或者不当的地方,还望各路大神批评,指正.欢迎从事大数据工作或者对大数据技术感兴趣的小伙伴们共同交流,一起进步.