无法通过在azure hdinsight中运行的piggybank.jar使用pig读取avro文件

ua4mk5z4  于 2021-06-25  发布在  Pig
关注(0)|答案(3)|浏览(296)

尝试将一些在本地和hortonworks上完美运行的现有pig脚本移植到hdinsights,在尝试通过pig的piggybank(piggybank包含在hdinsight发行版中)读取avro文件时,我遇到了一个class not found错误。
想知道是否有其他人让avro在hdinsight中工作,或者有一个解决方案。复制哪个jar在哪里?)
更详细地说。。。我通过azurehdinsight示例上的远程终端直接运行pig。
我看到的错误是:java.lang.classnotfoundexception:org.json.simple.parser.parseexception
这就是我认为的json简单库https://code.google.com/p/json-simple/
我尝试过将这个添加到hdinsight vm中的一些地方(并在pig中显式注册库),但仍然得到了错误。
rdp很容易将错误复制到hdinsight azure示例桌面上的hadoop命令行提示符中:
从细节开始。。。

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>
hs1rzwqc

hs1rzwqc1#

我也有同样的问题。
我解决这个问题的方法是在pig脚本中注册json-simple-1.1.jar。

o3imoua4

o3imoua42#

按照jason的建议做,将jar(piggybank、avro和json)复制到blob存储中,并在pig脚本中注册它们。但是,不需要创建扩展avrostorage的伪类。只需远程桌面到head节点并重命名/删除c:\apps\dist\pig-0.11.0.1.3.2.0-05\piggybank.jar,以确保pigscript将piggybank文件加载到blob存储中。

vql8enpb

vql8enpb3#

在hdinsight中,现在不建议设置诸如pig\u classpath之类的环境变量,因为您没有对head节点的管理员访问权限。
相反,我们可以在hdinsight中使用pig+avro两个维度的解决方案
答。将avro和json jar放在windowsazure存储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例如,将jars作为“pigextras”文件夹复制到wasb。另一种情况是这些命令(源位置会有所不同,目标位置是容器和帐户)。对于第二部分,指向伪代码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创建一个简单的复制脚本myscript.pig,并将其放到windowsazure存储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

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

$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

相关问题