首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PIG脚本错误: org.apache.thrift.protocol.TProtocol.getScheme :java.lang.NoSuchMethodError

PIG脚本错误: org.apache.thrift.protocol.TProtocol.getScheme :java.lang.NoSuchMethodError
EN

Stack Overflow用户
提问于 2015-12-23 12:00:49
回答 1查看 2.3K关注 0票数 0

我在mapreduce模式下运行一个PIG脚本。该脚本读取RCFile (包含以GZIP压缩格式存储的Thrift序列化数据),使用UDF对其进行反序列化,从Thrift结构中提取特定字段并存储它们。

某些映射器失败,并显示以下错误:

代码语言:javascript
复制
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)

下面是我的脚本:

代码语言:javascript
复制
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的问题吗?

我试着搜索这个问题,但找不到相关的答案。有没有人能帮我找点线索来解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2015-12-23 15:15:07

找到原因了。类"org.apache.thrift.protocol.TProtocol“定义在两个jars中,即libthrift-0.8.0.jar和hive-0.4.1.jar。hive-0.4.1.jar中的那个没有定义方法getScheme()。当它首先在类路径中拾取hive-0.4.1.jar时,映射器无法找到方法getScheme()。

我不确定为什么所有映射器的行为都不一致。任何解释这一点的评论都会很有帮助。

我用hive-exec-0.13.3.jar替换了hive-0.4.1.jar,这个问题得到了解决。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34428445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档