복붙노트

[HADOOP] 잭슨 문제가있는 Hadoop Java MapReduce 구문 분석 JSON

HADOOP

잭슨 문제가있는 Hadoop Java MapReduce 구문 분석 JSON

저는 Hadoop Java M / R 프로그램 (0.20.205)에서 Jackson JSON 파서 (1.9.5)를 사용하고 있습니다. 아래 JSON 예제를 보자.

{"id":23423423, "name":"abc", "location":{"displayName":"Florida, Rosario","objectType":"place"}, "price":1234.55}

자, 이제 id, location.displayName 및 price를 파싱하여 다음 Java 객체를 만들었으므로 원하지 않는 필드를 생략하고 싶다고 가정 해 보겠습니다.

@JsonIgnoreProperties(ignoreUnknown = true)
public class Transaction {
  private long id;
  private Location location;
  private double price;

  private static final ObjectMapper mapper = new ObjectMapper();

  ..setter/getter method would be here for id, Location, price

  @JsonIgnoreProperties(ignoreUnknown = true)
  public static class Location {
     private String displayName;

     public String getDisplayName { return displayName; }
     public void setDisplayName(String displayName) { this.displayName = displayName; }
  }

  public static final Transaction fromJsonDoc(String jsonDoc) throws IOException {
     JsonNode rootNode = mapper.readTree(jsonDoc);
     return mapper.treeToValue(rootNode, Transaction.class);
  }
}

이 프로그램을 독립 실행 형 모드로 실행할 때 (Hadoop 분산 모드가 아님). 내가 원하는 모든 필드는 올바르게 구문 분석됩니다. 그러나, 하둡지도 작업에서만 데이터를 파싱하자 마자 ID 필드와 location.displayName 및 price (비 직렬화되지 않고 null 임) 만 가져옵니다. MapReduce에서 실행할 때 @JsonIgnoreProperties (ignoreUnknown = true) 주석이 어떻게 든 작동하지 않는 것으로 보이고 원하는 필드가 deserialize되지 않습니다 (ID 이후의 모든 항목이 null 임). 모든 필드와 getter 및 setter를 Transaction 객체에 추가하고 @JsonIgnoreProperties를 제거하면 모든 것이 잘 동작합니다. 누구에게 이런 일이 발생했는지 제안 해 줍니까? 방금 예제를 들었지만 실제 JSON 문서는 매우 복잡하므로 모든 필드를 deserialize하고 싶지 않습니다. 내가 여기서 뭔가 잘못하고있는거야?

이것이 내가 Jackson을 main method와 Java / Map reduce program에서 사용하는 방법이다.

Transaction tran = Transaction.fromJsonDoc(jsonRec);
System.out.println("id: " + tran.getId());  //works in both
System.out.println("location: " + tran.getLocation().getDisplayName());  //works only in standalone execution but not in Map/Reduce

해결법

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

    1.이는 클래스 로딩 문제로 인한 것일 수 있습니다 : 구버전의 jackson core 정도. 클래스 로딩과 주석을 다루는 까다로운 부분은 VM이 인식하지 못하는 주석을 삭제할 수 있다는 것입니다. 이것이 당신의 문제를 일으킬 수 있는지는 모르겠지만 점검할만한 가치가있을 것입니다. Hadoop은 다소 오래된 버전의 Jackson (1.1?)을 번들로 사용했고, 1.4에서 @JsonIgnoreProperties가 추가되었으므로 문제를 설명 할 수 있습니다.

    이는 클래스 로딩 문제로 인한 것일 수 있습니다 : 구버전의 jackson core 정도. 클래스 로딩과 주석을 다루는 까다로운 부분은 VM이 인식하지 못하는 주석을 삭제할 수 있다는 것입니다. 이것이 당신의 문제를 일으킬 수 있는지는 모르겠지만 점검할만한 가치가있을 것입니다. Hadoop은 다소 오래된 버전의 Jackson (1.1?)을 번들로 사용했고, 1.4에서 @JsonIgnoreProperties가 추가되었으므로 문제를 설명 할 수 있습니다.

    어떻게 될 수 있습니까? 최신 버전 (주석을 보려면)을 사용하여 컴파일해야하지만, 런타임 환경은 이전 (1.1) 버전을 사용하고있을 수 있습니다. 코드에서 주석 클래스를 적극적으로 사용하지 않기 때문에 (클래스와 연관된 "유일한") 클래스 로더는이 주석을 jar에서 찾을 수 없으므로이 주석을 삭제합니다.

  2. from https://stackoverflow.com/questions/9724868/hadoop-java-mapreduce-parsing-json-with-jackson-issues by cc-by-sa and MIT license