问题描述如下:
基于HBase-0.98.7、Hadoop-2.5.2,使用HBase importtsv工具将大概10GB csv文件导入HBase。但是运行过程中抛出以下异常:
Exception in thread "main" java.lang.IllegalArgumentException: No enum constant org.apache.hadoop.mapreduce.JobCounter.MB_MILLIS_MAPS at java.lang.Enum.valueOf(Enum.java:236) at org.apache.hadoop.mapreduce.counters.FrameworkCounterGroup.valueOf(FrameworkCounterGroup.java:148) at org.apache.hadoop.mapreduce.counters.FrameworkCounterGroup.findCounter(FrameworkCounterGroup.java:182) at org.apache.hadoop.mapreduce.counters.AbstractCounters.findCounter(AbstractCounters.java:154) at org.apache.hadoop.mapreduce.TypeConverter.fromYarn(TypeConverter.java:240) at org.apache.hadoop.mapred.ClientServiceDelegate.getJobCounters(ClientServiceDelegate.java:370) at org.apache.hadoop.mapred.YARNRunner.getJobCounters(YARNRunner.java:511) at org.apache.hadoop.mapreduce.Job$7.run(Job.java:756) at org.apache.hadoop.mapreduce.Job$7.run(Job.java:753) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491) at org.apache.hadoop.mapreduce.Job.getCounters(Job.java:753) at org.apache.hadoop.mapreduce.Job.monitorAndPrintJob(Job.java:1361) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1289) at org.apache.hadoop.hbase.mapreduce.ImportTsv.run(ImportTsv.java:677) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84) at org.apache.hadoop.hbase.mapreduce.ImportTsv.main(ImportTsv.java:681)
原因分析:
由于HBase impottsv导入数据的时候,需要启动底层MapReduce Job,Job运行在YARN集群上。但是HBase-0.98.7中使用的YARN、MR的版本都是2.2.0。在MR 2.3+后LIB库有一些变动,例如 JobCounter.MB_MILLIS_REDUCES就是在2.3版本加入的。而HBase-0.98.7使用的YARN/MR版本没有这个变量,所以会抛出“No enum constant”异常。
解决方法:
(1)升级HBase版本到1.0+,这样跟Hadoop中的版本可以兼容
(2)使用HBase Java Client API进行数据灌入,不是绝对的用importtsv工具
参考阅读:
https://issues.apache.org/jira/browse/MAPREDUCE-5831