一、背景

hive导入Hbase的时候,采用新建外部表,生成HFile,然后bulkload 导入hbase的方式
报错出现在hive表数据insert到hive外部表的时候

insert overwrite into 外部表

二、问题分析

在hive日志中查看报错
查看hive_server对应的日志文件目录,我的是 /var/log/hive
然后查看对应节点的log日志
找到报错内容主要为:

Task: attempt_1774000014323_0019_m_000000_0 - exited : java.lang.IllegalArgumentException: Can't read partitions file
	at org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner.setConf(TotalOrderPartitioner.java:117)
	at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:77)
	at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:137)
	at org.apache.hadoop.mapred.MapTask$OldOutputCollector.<init>(MapTask.java:605)
	at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:465)
	at org.apache.hadoop.mapred.MapTask.run(MapTask.java:349)
	at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:174)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1731)
	at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:168)
Caused by: java.io.FileNotFoundException: File does not exist: /user/add/hb_range_keys.seq
	at org.apache.hadoop.hdfs.DistributedFileSystem$29.doCall(DistributedFileSystem.java:1499)
	at org.apache.hadoop.hdfs.DistributedFileSystem$29.doCall(DistributedFileSystem.java:1492)
	at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
	at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1507)
	at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1863)
	at org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner.readPartitions(TotalOrderPartitioner.java:304)
	at org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner.setConf(TotalOrderPartitioner.java:89)
	... 10 more

一句话描述为hive执行的sql中
set mapreduce.totalorderpartitioner.path=/user/add/hb_range_keys.seq;设置后提示File dose not exists /user/add/hb_range_keys.seq

三、解决

(1)对于数据量比较小的场景

设置
SET mapreduce.job.rduces=1;
取消/注释掉
SET mapreduce.totalorderpartitioner.path=/user/app1/hb_range_keys.seq;

(2)大数据量的场景(自动分区,不用手动生成文件)
– 删掉!

SET mapreduce.totalorderpartitioner.path=/user/add/hb_range_keys.seq;
SET mapreduce.job.reduces=1;

改为使用如下参数

-- 并行度根据你的集群设置(4~20 都可以)
SET mapreduce.job.reduces=8;

-- 关键:关闭有序分区,使用 HBase 默认的 Hash 分区(不会报错)
SET hbase.hfile.output.format.class=org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2;
SET hive.hbase.bulk.output.format.class=org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2;

更多推荐