easy-algorithm-interview-an.../bigdata/hadoop/InstantiationException in h...

3.1 KiB
Raw Blame History

在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解决。

stackoverflow对应地址