Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
hadoop多输入失败,ClassCastException_Hadoop_Classcastexception - Fatal编程技术网

hadoop多输入失败,ClassCastException

hadoop多输入失败,ClassCastException,hadoop,classcastexception,Hadoop,Classcastexception,我的hadoop版本是1.0.3,当我使用多输入时,我得到了这个错误 java.lang.ClassCastException: org.apache.hadoop.mapreduce.lib.input.TaggedInputSplit cannot be cast to org.apache.hadoop.mapreduce.lib.input.FileSplit at org.myorg.textimage$ImageMapper.setup(textimage.java:80) at o

我的hadoop版本是1.0.3,当我使用多输入时,我得到了这个错误

java.lang.ClassCastException: org.apache.hadoop.mapreduce.lib.input.TaggedInputSplit cannot be cast to org.apache.hadoop.mapreduce.lib.input.FileSplit
at org.myorg.textimage$ImageMapper.setup(textimage.java:80)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:142)
at org.apache.hadoop.mapreduce.lib.input.DelegatingMapper.run(DelegatingMapper.java:55)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:416)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
at org.apache.hadoop.mapred.Child.main(Child.java:249)
我测试了单输入路径,没有问题。只有当我使用

MultipleInputs.addInputPath(job, TextInputpath, TextInputFormat.class,
            TextMapper.class);
    MultipleInputs.addInputPath(job, ImageInputpath,
            WholeFileInputFormat.class, ImageMapper.class); 
我在谷歌上找到了这个链接,上面说0.21有这个bug。但是我使用的是1.0.3,这个错误是否会再次出现。任何人都有相同的问题,或者任何人都可以告诉我如何解决它?谢谢

这是图像映射器的设置代码,第4行是错误发生的位置:

protected void setup(Context context) throws IOException,
            InterruptedException {
        InputSplit split = context.getInputSplit();
        Path path = ((FileSplit) split).getPath();
        try {
            pa = new Text(path.toString());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

继我的评论之后,
TaggedInputSplit
的Javadocs确认您可能错误地将输入拆分转换为FileSplit:

/**
 * An {@link InputSplit} that tags another InputSplit with extra data for use
 * by {@link DelegatingInputFormat}s and {@link DelegatingMapper}s.
 */
我猜您的设置方法如下所示:

@Override
protected void setup(Context context) throws IOException,
        InterruptedException {
    FileSplit split = (FileSplit) context.getInputSplit();
}
不幸的是,
TaggedInputSplit
不是公共可见的,因此您无法轻松地执行
instanceof
样式检查,然后执行强制转换,然后调用
TaggedInputSplit.getInputSplit()
,以获取实际的底层文件分割。因此,要么您需要自己更新源代码并重新编译和部署,发布JIRA通知单,要求在未来版本中对此进行修复(如果在2+中尚未执行此操作),要么执行一些讨厌的反射黑客操作,以访问底层InputSplit

这是完全未经测试的:

@Override
protected void setup(Context context) throws IOException,
        InterruptedException {
    InputSplit split = context.getInputSplit();
    Class<? extends InputSplit> splitClass = split.getClass();

    FileSplit fileSplit = null;
    if (splitClass.equals(FileSplit.class)) {
        fileSplit = (FileSplit) split;
    } else if (splitClass.getName().equals(
            "org.apache.hadoop.mapreduce.lib.input.TaggedInputSplit")) {
        // begin reflection hackery...

        try {
            Method getInputSplitMethod = splitClass
                    .getDeclaredMethod("getInputSplit");
            getInputSplitMethod.setAccessible(true);
            fileSplit = (FileSplit) getInputSplitMethod.invoke(split);
        } catch (Exception e) {
            // wrap and re-throw error
            throw new IOException(e);
        }

        // end reflection hackery
    }
}
@覆盖
受保护的无效设置(上下文上下文)引发IOException,
中断异常{
InputSplit split=context.getInputSplit();

Class我也有同样的问题,但实际的问题是,在设置多个输入之后,我仍然在设置输入格式:

job.setInputFormatClass(SequenceFileInputFormat.class);

一旦我删除了这一行,一切都很好。

你能发布你的
ImageMapper
类的代码吗?看起来你正试图在你的安装方法中将输入拆分转换为FileInputSplit。我有一个类似的问题。有没有解决方案?它与你猜测的完全相同。我尝试了你的代码,但它没有工作w、 你太专业了!我又读了一遍代码,但我仍然不知道它是如何工作的。你能简单解释一下反射黑客吗?谢谢。请看结尾处添加的部分。这个解决方法很好,但是有人知道一种不太黑客的方法,可以通过多个输入将信息从作业传递到映射器吗?FWIW,这里有什么类型的信息您是否希望通过-通过配置进行传递有什么问题?