2016-01-20 75 views
11

我使用此代碼示例http://www.vidyasource.com/blog/Programming/Scala/Java/Data/Hadoop/Analytics/2014/01/25/lighting-a-spark-with-hbase使用Spark讀取hbase表,只通過代碼添加hbase.zookeeper.quorum,因爲它不是從hbase-site.xml中選擇它。通過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的解決方法。他們中的大多數人都是爲了hadoop工作。 @Sumit你知道是否有與hbase 0.98.0這個解決方法嗎? (升級不是我現在的選擇) – ajkl

回答

2

這是跟蹤並固定在HBASE-10304的HBase的問題。問題是HBaseZeroCopyByteString類聲明在Protobuf庫中,但它在不同的jar文件中。最後,一個不同的類加載器加載它並找不到超類聲明。它在HBase 0.99中是固定的。

我認爲一個解決方法可能是確保包含您向Spark提交的罐子包含com.google.protobuf.LiteralByteStringcom.google.protobuf.HBaseZeroCopyByteString的罐子。

最後你應該升級。你能想象從0.98開始已經修復的錯誤列表嗎?你打算全部擊中他們並逐一解決他們嗎?

+0

感謝丹尼爾,我知道這是因爲HBASE-10304的錯誤。我嘗試將hbase-protocol.jar添加到驅動程序類路徑中,但只有在收集驅動程序中的所有密鑰(我用來查詢hbase)然後查詢hbase時才能在yarn-client模式下工作。 (即使我在查詢之前收集驅動程序上的密鑰,這些操作也不能在紗線羣集模式下運行) – ajkl

+0

這表明正確的罐子存在於本地計算機上,但未分配給執行程序。你用'spark-submit'並用'--jars'指定罐子?我不知道會發生什麼問題......你也許可以嘗試運行'hadoop classpath'並將所有這些添加到'--jars'中。這將確保在執行者上使用與本地機器上相同的罐子。 –

+0

「您是否使用spark-submit並指定帶有--jars的罐子?」 - 是的,我 嘗試添加hadoop classpath中的所有jar,但仍然是相同的錯誤。我還在執行程序和驅動程序類路徑上使用hbase-protocol,使用 - 「spark.executor.extraClassPath \t /apache/hbase/lib/hbase-protocol-0.98.0-EBAY-21.jar spark.driver.extraClassPath \t/apache/hbase/lib/hbase-protocol-0.98.0-EBAY-21.jar' – ajkl