복붙노트

[HADOOP] Hadoop SequenceFile에서 쓰기 가능한 완전한 이름 변경 처리

HADOOP

Hadoop SequenceFile에서 쓰기 가능한 완전한 이름 변경 처리

필자가 쓴 Writable 하위 클래스로 작성된 Hadoop SequenceFiles 묶음이 있습니다. FishWritable이라고 부르 자.

이 Writable은 명확성을 위해 패키지 이름을 바꿀 필요가있을 때까지 잠시 동안 효과가있었습니다. 이제 FishWritable의 정규화 된 이름은 com.mammals.fishes.FishWritable 대신 com.vertebrates.fishes.FishWritable입니다. 문제의 패키지의 범위가 어떻게 진화했는지를 감안할 때 합리적인 변화였습니다.

그런 다음 SequenceFileRecordReader를 초기화하려고 할 때 충돌하기 때문에 MapReduce 작업이 실행되지 않습니다.

java.lang.RuntimeException: java.io.IOException: WritableName can't load class: com.mammals.fishes.FishWritable
at org.apache.hadoop.io.SequenceFile$Reader.getKeyClass(SequenceFile.java:1949)
at org.apache.hadoop.io.SequenceFile$Reader.init(SequenceFile.java:1899)
...

이 문제를 처리하기위한 몇 가지 옵션이 즉시 명백합니다. 모든 이전 작업을 다시 실행하여 최신 키 클래스 이름으로 출력을 재생성하고 종속 작업을 순서대로 실행시킬 수 있습니다. 이것은 분명히 시간이 많이 걸릴 수도 있고 때때로 불가능할 수도 있습니다.

또 다른 가능성은 SequenceFile을 텍스트로 읽고 클래스 이름의 모든 인스턴스를 새로운 것으로 대체하는 간단한 작업을 작성하는 것입니다. 이것은 기본적으로 방법 # 1을 덜 복잡하게 만드는 비틀기와 함께합니다. 큰 파일이 많으면 여전히 비실용적입니다.

SequenceFiles에서 사용되는 정규화 된 클래스 이름의 리팩토링을 처리하는 더 좋은 방법이 있습니까? 이상적으로,이 SequenceFile의 날짜가 지정된 유형과 업데이트 된 유형 모두에 대해 실행되도록 허용하기 위해 지정된 대체 이름이없는 경우 새 대체 클래스 이름을 지정하는 방법을 찾고 있습니다.

해결법

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

    1.예외 스택 추적에 언급 된 org.apache.hadoop.io.WritableName 클래스는 몇 가지 유용한 메소드를 가지고있다.

    예외 스택 추적에 언급 된 org.apache.hadoop.io.WritableName 클래스는 몇 가지 유용한 메소드를 가지고있다.

    문서에서 :

    // Add an alternate name for a class.
    public static void addName(Class writableClass, String name)
    

    귀하의 경우 SequenceFiles에서 읽기 전에 이것을 호출 할 수 있습니다 :

    WritableName.addName(com.vertebrates.fishes.FishWritable.class, "com.mammals.fishes.FishWritable");
    

    이렇게하면 이전 SequenceFile에서 com.mammals.fishes.FishWritable을 읽으려고 할 때 새로운 com.vertebrates.fishes.FishWritable 클래스가 사용됩니다.

    추신 : 포유류 패키지의 물고기는 왜 처음에 있었습니까? ;)

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

    2.sequencefile에 대한 스펙을 보면 대체 클래스 이름에 대한 고려가 없다는 것이 분명해 보입니다.

    sequencefile에 대한 스펙을 보면 대체 클래스 이름에 대한 고려가 없다는 것이 분명해 보입니다.

    필자가 데이터를 다시 작성할 수있는 위치에 없다면, com.mammals.fishes.writable을 확장하여 com.vertebrates.fishes.writable을 확장 한 후 비공개로 주석을 달아 아무도 실수로 비어있는 코드를 추가하지 않도록 할 수 있습니다 싸개. 오랜 시간이 지난 후에는 기존 클래스로 작성된 데이터가 폐기되고 포유 동물 클래스를 안전하게 삭제할 수 있습니다.

  3. from https://stackoverflow.com/questions/18884666/handling-writables-fully-qualified-name-changes-in-hadoop-sequencefile by cc-by-sa and MIT license