3.1 KiB
3.1 KiB
在MR代码中有多路输入。代码提交到集群以后,log爆出如下异常:
Exception in thread "main" java.lang.RuntimeException: java.lang.InstantiationException
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:131)
at org.apache.hadoop.mapreduce.lib.input.MultipleInputs.getInputFormatMap(MultipleInputs.java:109)
at org.apache.hadoop.mapreduce.lib.input.DelegatingInputFormat.getSplits(DelegatingInputFormat.java:58)
at org.apache.hadoop.mapreduce.JobSubmitter.writeNewSplits(JobSubmitter.java:599)
at org.apache.hadoop.mapreduce.JobSubmitter.writeSplits(JobSubmitter.java:616)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:493)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1296)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1293)
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:1854)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1293)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1314)
at com.xiaomi.xmpush.mr_job_and_tools.task.ScoreUpdateUserMessage.run(ScoreUpdateUserMessage.java:274)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
at com.xiaomi.xmpush.mr_job_and_tools.task.ScoreUpdateUserMessage.main(ScoreUpdateUserMessage.java:278)
Caused by: java.lang.InstantiationException
at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:129)
... 16 more
异常还是比较明显的,就是实例化失败了。因为代码里有很多相关的hbase操作,最开始以为是跟hbase的操作有关。尝试了许多次hbase的修改,没有解决问题。后来将问题定位到了这行代码:
MultipleInputs.addInputPath(job,new Path(inputPath), FileInputFormat.class,ScoreUpdateUserMessageMapper.class);
因为FileInputFormat是个abstract类。显然abstract类是没法被实例化的。因此,我们选择一种FileInputFormat的实现类就好了。因为我们的输入就是普通文本,所以,将FileInputFormat改为TextInputFormat就好了:
MultipleInputs.addInputPath(job,new Path(inputPath), TextInputFormat.class,ScoreUpdateUserMessageMapper.class);
将代码重新打包,提交,run起来没有问题。
后记:
一般我们遇到的问题,99%别人都已经遇到过。只要善于google,用好stackoverflow,能解决大部分的问题。所以同志们,VPN的钱是不能省的。这个问题,就是靠stackoverflow解决。