0

ローカルおよび Hortonworks で完全に実行されるいくつかの既存の PIG スクリプトを HDInsights に移植しようとしていますが、Pig の piggybank (piggybank は HDInsight ディストリビューションに含まれています) を介して Avro ファイルを読み取ろうとすると、class not found エラーが発生します。

他の誰かが Avro を HDInsight で動作させたり、回避策を持っているかどうか疑問に思います (たとえば、どの jar をどこにコピーしますか?)

詳しくは... これをたどると、Azure HDInsight インスタンスのリモート ターミナル経由で PIG を直接実行しました。

私が見るエラーは次のとおりです: java.lang.ClassNotFoundException: org.json.simple.parser.ParseException

これは、 https: //code.google.com/p/json-simple/ の json-simple ライブラリだと思います

これを 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>
4

3 に答える 3

0

HDInsight で PIG_CLASSPATH などの環境変数を設定することは、ヘッド ノードへの管理者アクセス権がないため、現時点ではお勧めしません。

代わりに、HDInsight の Pig+Avro で使用できる2 つの次元の回避策があります。

A. Avro および JSON jar をWindows Azure Storage Blobに配置し、そこから登録します。

B. さらに、Avro 用に、Avroとは異なる名前のダミーの空のクラスを作成し、Piggybank に入れます。

Avro はすでに Piggybank にあったため、クラス ローダーは必要な依存関係を見つけられませんでした。JSON 依存関係の適切な場所を検索しません。

この障害の詳細... Java がカスタム クラス ローダーを使用してクラスをロードする方法に関連していると思います。Pig がこの REGISTER キーワードを実装する方法は、検索場所を追加してこれらのカスタム jar を含めるカスタム クラス ローダーを使用することですが、この場合、AvroStorage クラスを含む piggybank jar が既にクラスパスにあるため、カスタムを使用しませんでした。クラスローダー。問題は、Pig がそれをインスタンス化しようとして、さらにカスタム jar が必要になったときに、カスタム クラス ローダーを使用しないため、必要なクラスが見つからないことです。

回避策:この問題を回避するために、空のクラス MyAvroStroage を作成しました。このクラスは AvroStorage から空しく継承し、それを独自の小さな jar (わずか 650 バイト) に入れました。次に、これをすべての依存関係とともに WASB に配置し、それらを登録して、AvroStorage の代わりに MyAvroStorage を使用すると、すべて正常に動作します。

考えられる回避策:

1. WASB にコピーする パート A では、jar を WASB に「PigExtras」フォルダーなどとしてコピーします。別の例では、これらのコマンドでした (ソースの場所はさまざまであり、宛先の場所はコンテナーとアカウントになります)。パート B では、ダミー コード MyAvroStorage.jar の jar を指定して、同様にアップロードします。</p>

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 を作成し、それを 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
于 2013-12-05T01:02:19.337 に答える
0

私も同じ問題を抱えてる。

私が解決した方法は、豚のスクリプトに json-simple-1.1.jar を登録することです。

于 2016-09-21T18:20:47.540 に答える