本人在同步两个集群的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,这应该是编码的问题,还未细究.
第一次写博客想想还有点小激动啊!通过把自己遇到的一些问题记录在此,算是对自己的一种备忘,有什么错误或者不当的地方,还望各路大神批评,指正.欢迎从事大数据工作或者对大数据技术感兴趣的小伙伴们共同交流,一起进步.