尝试将一些在本地和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>
3条答案
按热度按时间hs1rzwqc1#
我也有同样的问题。
我解决这个问题的方法是在pig脚本中注册json-simple-1.1.jar。
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存储中。
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来上传它…
2创建一个简单的复制脚本myscript.pig,并将其放到windowsazure存储blob上。你可以用*.jar通配符语法注册整个文件夹。
然后把Pig也上传到wasb上
三。从客户端将作业提交到群集: