2015-12-23 10 views
0

Я запускаю скрипт PIG в режиме mapreduce. Сценарий читает RCFile (содержащий сериализованные данные Thrift, хранящиеся в сжатом формате GZIP), десериализует его с помощью UDF, извлекает определенные поля из структуры Thrift и сохраняет их.Ошибка скрипта PIG: java.lang.NoSuchMethodError: org.apache.thrift.protocol.TProtocol.getScheme

Некоторые из картографов завершаться следующее сообщение об ошибке:

2015-12-23 03:07:45,638 FATAL [Thread-5] org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.NoSuchMethodError: org.apache.thrift.protocol.TProtocol.getScheme()Ljava/lang/Class; 
at com.xxx.yyy.thrift.dto.LatLong.read(LatLong.java:553) 
at com.twitter.elephantbird.util.ThriftUtils.readSingleFieldNoTag(ThriftUtils.java:318) 
at com.twitter.elephantbird.util.ThriftUtils.readFieldNoTag(ThriftUtils.java:352) 
at com.twitter.elephantbird.mapreduce.input.RCFileThriftTupleInputFormat$TupleReader.getCurrentTupleValue(RCFileThriftTupleInputFormat.java:74) 
at com.twitter.elephantbird.pig.load.RCFileThriftPigLoader.getNext(RCFileThriftPigLoader.java:46) 
at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigRecordReader.nextKeyValue(PigRecordReader.java:204) 
at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:553) 
at org.apache.hadoop.mapreduce.task.MapContextImpl.nextKeyValue(MapContextImpl.java:80) 
at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.nextKeyValue(WrappedMapper.java:91) 
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) 
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:784) 
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) 
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163) 
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:1628) 
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 

Вот мой сценарий:

REGISTER '/user/ameya/libs/geo-analysis-1.0.0-SNAPSHOT.jar'; 
REGISTER '/user/ameya/libs/libthrift-0.8.0.jar'; 
REGISTER '/user/ameya/libs/thrift-0.8-types-1.1.29-SNAPSHOT.jar'; 
REGISTER '/user/ameya/libs/libs/elephant-bird-pig-4.7.jar'; 
REGISTER '/user/ameya/libs/libs/elephant-bird-rcfile-4.7.jar'; 
REGISTER '/user/ameya/libs/libs/elephant-bird-core-4.7.jar'; 
REGISTER '/user/ameya/libs/libs/elephant-bird-hadoop-compat-4.7.jar'; 
REGISTER '/user/ameya/libs/libs/hive-0.4.1.jar'; 
REGISTER '/user/ameya/libs/libs/libs/hive-serde-0.13.3.jar'; 

SET output.compression.enabled true; 
SET output.compression.codec org.apache.hadoop.io.compress.GzipCodec; 

thrift = LOAD '$input' USING com.twitter.elephantbird.pig.load.RCFileThriftPigLoader('com.xxx.yyy.thrift.dto.LatLong'); 

final = FOREACH thrift GENERATE (requestLatLong is not null ? requestLatLong.latitude : null) AS req_ll_lat, 
      (requestLatLong is not null ? requestLatLong.longitude : null) AS req_ll_lng; 

STORE final INTO '$output'; 

Я использую libthrift-0.8.0.jar, где класс TProtocol.java действительно определен getScheme() (с открытым доступом). Интересно, что не все картографы терпят неудачу, только некоторые из них; но это заставляет мою работу терпеть неудачу. Может ли это быть проблемой CLASSPATH?

Я попытался найти эту проблему, но не смог найти ответы на них. Может кто-то, пожалуйста, помогите мне получить некоторые советы, чтобы исправить это?

ответ

2

Обнаружено причину. Класс «org.apache.thrift.protocol.TProtocol» был определен в двух баночках, то есть libthrift-0.8.0.jar и hive-0.4.1.jar. У одного в hive-0.4.1.jar не был установлен метод getScheme(). Когда он сначала захватил hive-0.4.1.jar в пути к классам, mappers не смогли найти метод getScheme().

Я не уверен, почему поведение не было согласованным во всех картографах. Любые комментарии, объясняющие это, были бы полезными.

Я заменил hive-0.4.1.jar на hive-exec-0.13.3.jar, и проблема была решена.