无法通过在Azure HDInsight中运行的piggybank.jar使用PIG读取Avro文件

时间:2013-11-21 16:58:58

标签: azure apache-pig avro hdinsight

尝试将一些在本地和Hortonworks上完美运行的现有PIG脚本移植到HDInsights,当我尝试通过Pig的piggybank读取Avro文件时,我发现了一个未找到类的错误(piggybank包含在HDInsight发行版中)。

不知道是否有其他人让Avro在HDInsight工作或有工作(.eg。复制哪个jar在哪里?)

更详细......跟踪此问题我直接通过Azure HDInsight实例上的远程终端运行PIG。

我看到的错误是:java.lang.ClassNotFoundException:org.json.simple.parser.ParseException

我认为这是https://code.google.com/p/json-simple/

处的json简单库

我尝试将其添加到HDInsight VM中的几个位置(并在PIG中显式注册库)并仍然出错。

错误很容易通过RDP重现到HDinsight Azure实例桌面上的Hadoop命令行提示符中:

启动PIG详细信息......

c:\apps\dist\pig-0.11.0.1.3.1.0-06\bin>pig -verbose -warning

使用AvroStorage输入任意行。例如。

grunt> LocationRecordAvro = LOAD 'wasb:///testinput/20130901.avro' USING org.apache.pig.
piggybank.storage.avro.AvroStorage();

获得例外......

2013-11-21 16:27:53,732 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: Pig script failed to parse:
<line 1, column 21> pig script failed to validate: java.lang.RuntimeException: could not instantiate 'org.apache.pig.piggybank.storage.avro.AvroStorage' with arguments 'null'
2013-11-21 16:27:53,732 [main] ERROR org.apache.pig.tools.grunt.Grunt - Failed to parse: Pig script failed to parse:
<line 1, column 21> pig script failed to validate: java.lang.RuntimeException: could not instantiate 'org.apache.pig.piggybank.storage.avro.AvroStorage' with arguments 'null'
        at org.apache.pig.parser.QueryParserDriver.parse(QueryParserDriver.java:
191)
        at org.apache.pig.PigServer$Graph.validateQuery(PigServer.java:1571)
        at org.apache.pig.PigServer$Graph.registerQuery(PigServer.java:1544)
        at org.apache.pig.PigServer.registerQuery(PigServer.java:516)
        at org.apache.pig.tools.grunt.GruntParser.processPig(GruntParser.java:99
1)
        at org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScript
Parser.java:412)
        at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.j
ava:194)
        at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.j
ava:170)
        at org.apache.pig.tools.grunt.Grunt.run(Grunt.java:69)
        at org.apache.pig.Main.run(Main.java:538)
        at org.apache.pig.Main.main(Main.java:157)
Caused by:
<line 1, column 21> pig script failed to validate: java.lang.RuntimeException: could not instantiate 'org.apache.pig.piggybank.storage.avro.AvroStorage' with arguments 'null'
        at org.apache.pig.parser.LogicalPlanBuilder.buildLoadOp(LogicalPlanBuild
er.java:835)
        at org.apache.pig.parser.LogicalPlanGenerator.load_clause(LogicalPlanGen
erator.java:3236)
        at org.apache.pig.parser.LogicalPlanGenerator.op_clause(LogicalPlanGener
ator.java:1315)
        at org.apache.pig.parser.LogicalPlanGenerator.general_statement(LogicalP
lanGenerator.java:799)
        at org.apache.pig.parser.LogicalPlanGenerator.statement(LogicalPlanGener
ator.java:517)
        at org.apache.pig.parser.LogicalPlanGenerator.query(LogicalPlanGenerator
.java:392)
        at org.apache.pig.parser.QueryParserDriver.parse(QueryParserDriver.java:
184)
        ... 10 more
Caused by: java.lang.RuntimeException: could not instantiate 'org.apache.pig.piggybank.storage.avro.AvroStorage' with arguments 'null'
        at org.apache.pig.impl.PigContext.instantiateFuncFromSpec(PigContext.jav
a:618)
        at org.apache.pig.parser.LogicalPlanBuilder.buildLoadOp(LogicalPlanBuild
er.java:823)
        ... 16 more
Caused by: java.lang.NoClassDefFoundError: org/json/simple/parser/ParseException

        at java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.lang.Class.privateGetDeclaredConstructors(Class.java:2404)
        at java.lang.Class.getConstructor0(Class.java:2714)
        at java.lang.Class.newInstance0(Class.java:343)
        at java.lang.Class.newInstance(Class.java:325)
        at org.apache.pig.impl.PigContext.instantiateFuncFromSpec(PigContext.jav
a:588)
        ... 17 more
Caused by: java.lang.ClassNotFoundException: org.json.simple.parser.ParseExcepti
on
        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(ClassLoader.java:423)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        ... 23 more

grunt>

3 个答案:

答案 0 :(得分:0)

目前不建议在HDInsight中设置PIG_CLASSPATH等环境变量,因为您没有头节点的管理员权限来执行此操作。

相反,我们可以在HDInsight中使用Pig + Avro的两个维度

一个。将Avro和JSON jar放入 Windows Azure存储Blob ,然后从那里注册它们。

B中。此外,对于Avro,使用与Avro 不同的名称创建虚拟空类,并将其放入Piggybank。

类加载器没有找到必要的依赖项,因为Avro已经在Piggybank中,它没有在JSON依赖项的正确位置搜索。

这个障碍的细节......我认为它与Java如何使用自定义类加载器加载类有关。 Pig实现此REGISTER关键字的方式是它使用自定义类加载器添加搜索位置以包含这些自定义jar,但在这种情况下,包含AvroStorage类的piggybank jar已经在类路径中,因此它不使用自定义类加载器。问题是,当Pig试图实例化它并且它需要更多的自定义jar时,它不会使用自定义类加载器,因此无法找到所需的类。

解决方法:为了解决这个问题,我创建了一个空类MyAvroStroage,它只是从AvroStorage继承而来,并将它放入自己的小jar(它只有650个字节)。然后我将它的所有依赖项放在WASB上,注册它们并使用MyAvroStorage而不是AvroStorage然后一切正常。

可能的解决方法:

<强> 1。复制到WASB 例如,对于A部分,将罐子复制到WASB作为“PigExtras”文件夹。另一方面是这些命令(您的源位置会有所不同,您的目标位置将是您的容器和帐户)。对于B部分,指向上传它的虚拟代码MyAvroStorage.jar的jar ...

hadoop fs -copyFromLocal C:\files\MyAvroStorage.jar wasb://container@account.blob.core.windows.net/PigExtras/MyAvroStorage.jar
hadoop fs -copyFromLocal c:\apps\dist\pig-0.11.0.1.3.1.0-06\piggybank.jar wasb://container@account.blob.core.windows.net/PigExtras/piggybank.jar
hadoop fs -copyFromLocal c:\apps\dist\oozie-3.3.2.1.3.1.0-06\oozie-win-distro\share\lib\pig\avro-1.5.3.jar wasb://container@account.blob.core.windows.net/PigExtras/avro-1.5.3.jar
hadoop fs -copyFromLocal C:\apps\dist\oozie-3.3.2.1.3.1.0-06\oozie-win-distro\share\lib\oozie\json-simple-1.1.jar wasb://container@account.blob.core.windows.net/PigExtras/json-simple-1.1.jar

<强> 2。创建一个简单的repro脚本 myscript.pig,并将其放在Windows Azure Storage Blob上。您可以使用* .jar通配符语法注册我相信的整个文件夹。

REGISTER wasb:///PigExtras/*.jar;
myset = load 'wasb:///example/data/test.avro' using MyAvroStorage();
dump myset

然后将.pig上传到WASB

hadoop fs -copyFromLocal C:\files\myscript.pig wasb://container@account.blob.core.windows.net/PigExtras/myscript.pig

第3。从客户端将作业提交到群集:

$job = New-AzureHDInsightPigJobDefinition -File    wasb://container@account.blob.core.windows.net/PigExtras/myscript.pig
Start-AzureHDInsightJob -Cluster $clust.Name -Subscription $sub.SubscriptionId -JobDefinition $job -Certificate $sub.Certificate

答案 1 :(得分:0)

当Jason建议并将罐子(piggybank,avro和json)复制到blob存储器并将其注册到您的猪脚本中时。但是,您不需要创建扩展AvroStorage的虚拟类。只需远程桌面到头节点并重命名/删除C:\ apps \ dist \ pig-0.11.0.1.3.2.0-05 \ piggybank.jar以确保pigcript在blob存储上加载piggybank文件。

答案 2 :(得分:0)

我有同样的问题。

我解决它的方法是在猪脚本中注册json-simple-1.1.jar。