[HADOOP] hadoop MultipleInputs가 ClassCastException로 실패합니다.
HADOOPhadoop 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.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.이 동일한 문제가 있었지만 실제 문제는 MultipleInputs를 설정 한 후에도 InputFormat을 설정하고 있다는 것이 었습니다.
이 동일한 문제가 있었지만 실제 문제는 MultipleInputs를 설정 한 후에도 InputFormat을 설정하고 있다는 것이 었습니다.
job.setInputFormatClass(SequenceFileInputFormat.class);
이 줄을 제거하고 나면 모든 것이 잘 작동했습니다.
from https://stackoverflow.com/questions/11130145/hadoop-multipleinputs-fails-with-classcastexception by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] OOZIE-4.1.0에서 다중 워크 플로우 실행시 오류 (0) | 2019.06.02 |
---|---|
[HADOOP] mapper가 입력으로 무시되는 파일은 무엇입니까? (0) | 2019.06.02 |
[HADOOP] Hadoop MapReduce 중간 산출물 (0) | 2019.06.02 |
[HADOOP] 스파크 1.6 - hadoop 바이너리 경로에서 winutils 바이너리를 찾지 못했습니다. (0) | 2019.06.02 |
[HADOOP] Hadoop은 YARN 애플리케이션의 로그를 어디에 저장합니까? (0) | 2019.06.02 |