2016-01-20 13 views
11

このコード例http://www.vidyasource.com/blog/Programming/Scala/Java/Data/Hadoop/Analytics/2014/01/25/lighting-a-spark-with-hbaseを使用して、hbase-site.xmlからhbase.zookeeper.quorumを追加する唯一の変更でSparkを使用してhbaseテーブルを読み取っています。SparkによるHBaseテーブルへのアクセス

スパーク1.5.3 のHBase 0.98.0

私は、このエラーに直面しています -

java.lang.IllegalAccessError: com/google/protobuf/HBaseZeroCopyByteString 
at org.apache.hadoop.hbase.protobuf.RequestConverter.buildRegionSpecifier(RequestConverter.java:921) 
at org.apache.hadoop.hbase.protobuf.RequestConverter.buildGetRowOrBeforeRequest(RequestConverter.java:132) 
at org.apache.hadoop.hbase.protobuf.ProtobufUtil.getRowOrBefore(ProtobufUtil.java:1520) 
at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.locateRegionInMeta(ConnectionManager.java:1294) 
at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.locateRegion(ConnectionManager.java:1128) 
at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.locateRegion(ConnectionManager.java:1111) 
at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.locateRegion(ConnectionManager.java:1070) 
at org.apache.hadoop.hbase.client.HTable.finishSetup(HTable.java:347) 
at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:201) 
at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:159) 
at test.MyHBase.getTable(MyHBase.scala:33) 
at test.MyHBase.<init>(MyHBase.scala:11) 
at $line43.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.fetch(<console>:30) 
at $line44.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$anonfun$1.apply(<console>:49) 
at $line44.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$anonfun$1.apply(<console>:49) 
at scala.collection.Iterator$$anon$11.next(Iterator.scala:370) 
at scala.collection.Iterator$class.foreach(Iterator.scala:742) 
at scala.collection.AbstractIterator.foreach(Iterator.scala:1194) 
at scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:59) 
at scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:104) 
at scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:48) 
at scala.collection.TraversableOnce$class.to(TraversableOnce.scala:308) 
at scala.collection.AbstractIterator.to(Iterator.scala:1194) 
at scala.collection.TraversableOnce$class.toBuffer(TraversableOnce.scala:300) 
at scala.collection.AbstractIterator.toBuffer(Iterator.scala:1194) 
at scala.collection.TraversableOnce$class.toArray(TraversableOnce.scala:287) 
at scala.collection.AbstractIterator.toArray(Iterator.scala:1194) 
at org.apache.spark.rdd.RDD$$anonfun$collect$1$$anonfun$12.apply(RDD.scala:905) 
at org.apache.spark.rdd.RDD$$anonfun$collect$1$$anonfun$12.apply(RDD.scala:905) 
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1848) 
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1848) 
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66) 
at org.apache.spark.scheduler.Task.run(Task.scala:88) 
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:745) 
+0

[HBASE-10304](https://issues.apache.org/jira/browse/HBASE-10304)のように見えます。 0.99.0リリースで修正されています。 [HBASE-11118](https://issues.apache.org/jira/browse/HBASE-11118)も参照してください – Sumit

+0

はい、そうです。私はSPARKの回避策を見つけられませんでした。それらのほとんどはハープ・ジョブのためのものです。 @Sumit hbase 0.98.0でこれを回避する方法があるかどうか知っていますか? (アップグレードは今私にとっては選択肢ではありません) – ajkl

答えて

2

これはHBASE-10304で追跡し、固定HBaseの問題です。問題は、HBaseZeroCopyByteStringクラスがProtobufライブラリにあると宣言されているが、別のjarファイルにあるということです。最終的に、別のクラスローダーがそれをロードし、スーパークラス宣言を見つけることができません。これはHBase 0.99で修正されています。

私は、com.google.protobuf.LiteralByteStringcom.google.protobuf.HBaseZeroCopyByteStringを含むジャーをSparkに提出するジャーに含めるようにすることをお勧めします。

あなたは本当にアップグレードする必要があります。 0.98以降に修正されたバグのリストを想像できますか?あなたはそれらを全部打つことを計画していて、それを1つずつ取り組んでいますか?

+0

Danielに感謝します。私はそれがHBASE-10304の​​バグのためだと認識しています。ドライバクラスパスにhbase-protocol.jarを追加しようとしましたが、ドライバ上ですべてのキー(hbaseのクエリに使用します)を収集してhbaseをクエリすると、糸 - クライアントモードでのみ動作します。 (これは、質問の前にドライバーのキーを収集しても糸クラスターモードでは機能しません) – ajkl

+0

これは、正しいJARがローカルマシンに存在しているが、エグゼキューターには配布されていないことを示しています。 'spark-submit'を使い、' --jars'でjarファイルを指定していますか?何がうまくいかないのだろうか...おそらく、 'hadoop classpath'を実行して、それを' --jars'に追加してみてください。これにより、ローカルマシンと同じようにエンクリプタ上で同じジャーが使用されます。 –

+0

"spark-submitを使用していて、 - jarsでjarを指定していますか?" - はいと私は hadoopクラスパスからすべてのjarを追加しようとしましたが、同じエラーが残りました。私はまた、 'spark.executor.extraClassPath \t /apache/hbase/lib/hbase-protocol-0.98.0-EBAY-21.jar spark.driver.extraClassPath \t /を使ってエグゼキュータとドライバクラスパスの両方にhbase-protocolを持っています。 apache/hbase/lib/hbase-protocol-0.98.0-EBAY-21.jar' – ajkl

関連する問題