2017-01-31 2 views
0

fatjar로 압축 된 Scalding 작업이 있고 EMR Hadoop 클러스터에서 실행 중입니다. 최근 맵 내부에 DynamoDB 연결이 필요한 새로운 기능을 추가했습니다. 내가 지방에 포함 libs가와EMR 작업 내에서 AWS Java SDK 사용

Error in configuring object 
    at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:112) 
    at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:78) 
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:136) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:450) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:344) 
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:172) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:415) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) 
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:166) 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:109) 
    ... 9 more 
Caused by: cascading.flow.FlowException: internal error during mapper configuration 
    at cascading.flow.hadoop.FlowMapper.configure(FlowMapper.java:102) 
    ... 14 more 
Caused by: com.esotericsoftware.kryo.KryoException: Unable to find class: com.amazonaws.http.conn.$Proxy7 
Serialization trace: 
connManager (com.amazonaws.http.impl.client.SdkHttpClient) 
httpClient (com.amazonaws.http.AmazonHttpClient) 
client (awscala.dynamodbv2.DynamoDBClient) 
client (me.chuwy.enrich.hadoop.DuplicateStorage$DynamoDbStorage) 
duplicateStorage (me.chuwy.enrich.hadoop.ShredJob) 
$outer (me.chuwy.enrich.hadoop.ShredJob$$anonfun$11) 
    at com.esotericsoftware.kryo.util.DefaultClassResolver.readName(DefaultClassResolver.java:138) 
    at com.esotericsoftware.kryo.util.DefaultClassResolver.readClass(DefaultClassResolver.java:115) 
    at com.esotericsoftware.kryo.Kryo.readClass(Kryo.java:610) 
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.read(FieldSerializer.java:599) 
    at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:221) 
    at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:648) 
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.read(FieldSerializer.java:605) 
    at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:221) 
    at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:648) 
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.read(FieldSerializer.java:605) 
    at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:221) 
    at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:648) 
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.read(FieldSerializer.java:605) 
    at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:221) 
    at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:729) 
    at com.twitter.chill.SomeSerializer.read(SomeSerializer.scala:25) 
    at com.twitter.chill.SomeSerializer.read(SomeSerializer.scala:19) 
    at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:648) 
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.read(FieldSerializer.java:605) 
    at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:221) 
    at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:648) 
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.read(FieldSerializer.java:605) 
    at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:221) 
    at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:729) 
    at com.twitter.chill.SomeSerializer.read(SomeSerializer.scala:25) 
    at com.twitter.chill.SomeSerializer.read(SomeSerializer.scala:19) 
    at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:729) 
    at com.twitter.chill.SerDeState.readClassAndObject(SerDeState.java:61) 
    at com.twitter.chill.KryoPool.fromBytes(KryoPool.java:94) 
    at com.twitter.chill.Externalizer.fromBytes(Externalizer.scala:145) 
    at com.twitter.chill.Externalizer.maybeReadJavaKryo(Externalizer.scala:158) 
    at com.twitter.chill.Externalizer.readExternal(Externalizer.scala:148) 
    at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1839) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1997) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1921) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1997) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1921) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1997) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1921) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 
    at java.util.HashMap.readObject(HashMap.java:1180) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1058) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1897) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1997) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1921) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1997) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1921) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 
    at cascading.flow.hadoop.util.JavaObjectSerializer.deserialize(JavaObjectSerializer.java:101) 
    at cascading.flow.hadoop.util.HadoopUtil.deserializeBase64(HadoopUtil.java:312) 
    at cascading.flow.hadoop.util.HadoopUtil.deserializeBase64(HadoopUtil.java:293) 
    at cascading.flow.hadoop.FlowMapper.configure(FlowMapper.java:81) 
    ... 14 more 
Caused by: java.lang.ClassNotFoundException: com.amazonaws.http.conn.$Proxy7 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass 

내가 문제가 EMR AMI에있을 수이 /usr/share/aws/aws-java-sdk/에서 자신의 항아리와 출하 생각 하고 충돌 :하지만 곧 매퍼 DynamoDB의 초기화에 도달로 예외 다음 발생 jar, 삭제하려고했지만 다른 EMR 단계가 실패했습니다.

+0

뚱뚱한 병에 포함 된 AWS Java SDK 종속성 (및 버전)은 무엇입니까? 앞에서 언급했듯이 현재 EMR에는/usr/share/aws/aws-java-sdk에 AWS Java SDK 1.10.x가 포함되어 있기 때문에 뚱뚱한 병에 AWS Java SDK의 다른 버전을 포함하면 런타임에 문제가 발생할 수 있습니다. jar 파일에 포함하고있는 버전을 음영/위치 변경 (Maven을 사용하는 경우에는 maven-shade-plugin 참조) 할 수 있지만 다른 문제가 발생할 수 있습니다. –

+0

감사합니다. @JonathanKelly. 전이 의존성으로 1.10.77을 사용하지만 ~ 1.10.56에서 ~ 1.11.30까지 다른 버전을 시도했습니다. 나는 또한 뚱뚱한 항아리에서 그들을 제외하고 지방 항아리에서와 같은 버전으로 EMR 항아리를 무시하려고했습니다. 결과는 여전히 동일합니다. 이제 EMR에서 jar를 실행하는 방법 인 OpenJDK에 문제가 있다고 의심됩니다. – chuwy

+0

아, OK, EMR은 잠시 AWS Java SDK 1.10.75.1을 사용했으며 아직 1.11.x로 업그레이드하지 않았으므로 앱과 1.11.x를 번들링하면 문제가 발생할 수 있습니다. 1.10.75.1을 "제공됨"종속성으로 사용하면 (이 버전에 대해 컴파일되지만 뚱뚱한 병에 포함되지는 않습니다) 도움이 될까요? –

답변

0

문제는 처음에는 의심스러운 바이너리 비 호환성이 아니라 스케일링 직렬화입니다. DynamoDB 클라이언트는 핸들러, 쓰레드 풀 등과 같은 것들을 포함하고 있기 때문에 직렬화 가능 엔티티가 아니다. 그러므로 lazy val으로 선언하면 직선적으로 초기화되어야한다.