복붙노트

[HADOOP] hadoop MultipleInputs가 ClassCastException로 실패합니다.

HADOOP

hadoop MultipleInputs가 ClassCastException로 실패합니다.

내 hadoop 버전 1.0.3, multipleinputs 사용할 때이 오류가 있어요.

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); 

내가 봤 거든이 링크를 발견 https://issues.apache.org/jira/browse/MAPREDUCE-1178 0.21이 버그가 있다고했다. 하지만 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();
        }
    }

해결법

  1. ==============================

    1.TaggedInputSplit에 대한 Javadocs는 내 의견에 이어 다음과 같이 입력 분할을 FileSplit으로 잘못 캐스팅하고 있음을 확인합니다.

    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 ()을 호출하여 실제 기본 FileSplit을 가져올 수 있습니다. 따라서 소스를 직접 업데이트하고 다시 컴파일하고 배포해야하며, JIRA 티켓을 게시하여 향후 버전에서 수정하도록 요청하거나 (이미 2 이상으로 실행되지 않은 경우) JIRA 티켓을 게시하거나 기본 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
        }
    }
    

    반사 Hackery는 설명했다 :

    TaggedInputSplit이 보호 된 범위로 선언되면 org.apache.hadoop.mapreduce.lib.input 패키지 외부의 클래스에서는 보이지 않으므로 설정 메소드에서 해당 클래스를 참조 할 수 없습니다. 이 문제를 해결하기 위해 여러 가지 리플렉션 기반 작업을 수행합니다.

  2. ==============================

    2.이 동일한 문제가 있었지만 실제 문제는 MultipleInputs를 설정 한 후에도 InputFormat을 설정하고 있다는 것이 었습니다.

    이 동일한 문제가 있었지만 실제 문제는 MultipleInputs를 설정 한 후에도 InputFormat을 설정하고 있다는 것이 었습니다.

    job.setInputFormatClass(SequenceFileInputFormat.class);
    

    이 줄을 제거하고 나면 모든 것이 잘 작동했습니다.

  3. from https://stackoverflow.com/questions/11130145/hadoop-multipleinputs-fails-with-classcastexception by cc-by-sa and MIT license