我试图在amazon emr上的pig中运行一个简单的python udf,它抛出了一个java序列化错误:
java.io.IOException: Deserialization error: could not instantiate 'org.apache.pig.scripting.jython.JythonFunction' with arguments '[/tmp/pig4877832484731242596tmp/simple.py, aprs]'
我在这里和其他地方搜索过,看到了一些相关的问题和解决方案,但是没有一个解决方案是适用的,包括一年前的一篇文章,似乎表明pig0.9.1在amazon emr上运行正常。
$ pig --version
Apache Pig version 0.9.2-amzn (rexported)
compiled Aug 06 2012, 20:34:29
$ hadoop version
Hadoop 1.0.3
下面是我的python自定义项:
# /usr/bin/python
@outputSchema("data:chararray")
def aprs(l):
return l
下面是pig脚本调用,它显示udf已加载,@outputschema做了正确的事情:
grunt> Register 's3n://n2ygk/simple.py' using jython as myudf;
grunt> raw = LOAD 's3n://aprs-is/small-sample.log' USING TextLoader as (line:chararray);
grunt> cooked = LIMIT raw 1000;
grunt> aprs = FOREACH cooked GENERATE FLATTEN(myudf.aprs(line));
grunt> DESCRIBE aprs;
aprs: {data: chararray}
grunt> dump aprs;
有什么建议吗?
1条答案
按热度按时间j2datikz1#
简单的回答是下载、构建和使用pig0.11.1,如aws论坛上的这篇文章所述。一旦我这么做了,python udf代码“刚刚工作”。
我首先天真地使用上面引用的脚本来下载并构建pig0.11.1。我认为这对于从头开始构建pig来说可能是过度的,因为我已经阅读了更多关于pig版本的内容,并且相信0.11.1已经可以通过pig版本获得了(虽然文档没有列出0.11.1,但是pig安装程序脚本确实包含了它。)我使用了以下命令来测试pig-0.11.1的emr发行版:
不幸的是,这会引发以下错误,可能与java版本1.6和1.7有关:
当我重新测试上面没有说明
--pig-versions 0.11.1
结果发现,只有0.9.2安装了响应的默认值--pig-versions latest
.我从(s3://us-west-2.elasticmapreduce/libs/pig/pig-script)中看到,pig0.11.1和hadoop1.0.3需要java7,而0.9.2需要hadoop1.03和java6。我猜java7没有被安装。
如果有人能纠正我的错误,我会非常感激的。否则,我将接受下载和构建它的解决方案,因为它会浪费一点时间,但确实有效。