java.lang.RuntimeException: elephantbird.class.for.MultiInputFormat is not set at com.twitter.elephantbird.mapreduce.input.MultiInputFormat.setTypeRef(MultiInputFormat.java:132) at com.twitter.elephantbird.mapreduce.input.MultiInputFormat.createRecordReader(MultiInputFormat.java:84) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:644) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:330) at org.apache.hadoop.mapred.Child$4.run(Child.java:268) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:396) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1438) at org.apache.hadoop.mapred.Child.main(Child.java:262)
今天发现这个错误,之前也老出现,总是忘了为什么,年纪大了?
LzoThriftBlockInputFormat.setClassConf(MbaSessionLog.class, conf);
job.setInputFormatClass(LzoThriftBlockInputFormat.class);
看一眼LzoThriftBlockInputFormat.setClassConf()的源码,调用HadoopUtils.setClassConf(conf, CLASS_CONF_KEY, clazz);而这个CLASS_CONF_KEY="elephantbird.class.for.MultiInputFormat";看起来没啥问题。于是想到应该是conf有问题,想起从前set configuration中参数时因调用set太晚没成功设置。
于是改成:
LzoThriftBlockInputFormat.setClassConf(MbaSessionLog.class, job.getConfiguration());
job.setInputFormatClass(LzoThriftBlockInputFormat.class);
果然可以。
且记录下这个低级错误,以免再浪费时间。