2016-01-20 37 views
11

Sto utilizzando questo esempio di codice http://www.vidyasource.com/blog/Programming/Scala/Java/Data/Hadoop/Analytics/2014/01/25/lighting-a-spark-with-hbase per leggere una tabella hbase utilizzando Spark con l'unica modifica di aggiungere hbase.zookeeper.quorum tramite codice poiché non lo preleva da hbase-site.xml .Accesso alle tabelle HBase tramite Spark

Spark 1.5.3 HBase 0.98.0

sto affrontando questo errore -

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

Sembra che tu stia picchiando [HBASE-10304] (https://issues.apache.org/jira/browse/HBASE-10304). È stato risolto nella versione 0.99.0. Vedi anche [HBASE-11118] (https://issues.apache.org/jira/browse/HBASE-11118) – Sumit

+0

Sì, sembra così. Non ho trovato una soluzione alternativa per SPARK. Molti di questi sono per lavori al lavoro. @Sumit Sapete se esiste una soluzione alternativa con hbase 0.98.0? (l'aggiornamento non è un'opzione per me al momento) – ajkl

risposta

2

Questo è un problema HBase rintracciato e fissati in HBASE-10304. Il problema è che la classe HBaseZeroCopyByteString è dichiarata nella libreria Protobuf, ma è in un file jar diverso. Alla fine un altro classloader lo carica e non riesce a trovare la dichiarazione della superclasse. È stato risolto in HBase 0,99.

Penso che una soluzione alternativa potrebbe essere quella di includere i vasi che invii a Spark i vasi che contengono com.google.protobuf.LiteralByteString e com.google.protobuf.HBaseZeroCopyByteString.

Alla fine si dovrebbe davvero aggiornare. Riesci a immaginare la lista di bug che sono stati corretti dal 0.98? Hai intenzione di colpirli tutti e aggirarli uno ad uno?

+0

Grazie Daniel, sono consapevole che è a causa del bug HBASE-10304. Ho provato ad aggiungere hbase-protocol.jar al classpath driver ma questo funziona solo in modalità filato-client quando raccolgo tutte le chiavi (io uso per interrogare hbase) sul driver e poi interrogare hbase. (e niente di tutto questo funziona in modalità cluster-cluster anche se raccolgo le chiavi sul driver prima di eseguire una query) – ajkl

+0

Ciò suggerisce che i jar giusti sono presenti sulla macchina locale ma non vengono distribuiti agli executors. Stai usando 'spark-submit' e specificando i vasi con' --jars'? Mi chiedo che cosa potrebbe andare storto ... Potresti forse provare a eseguire "hadoop classpath" e aggiungere tutto ciò a "--jars". Ciò assicurerebbe che gli stessi jar vengano usati sugli executors come sulla macchina locale. –

+0

"Stai usando spark-submit e specificando i vasi con --jars?" - Sì e I provato ad aggiungere tutti i jar da hadoop classpath, ma ancora lo stesso errore. Ho anche il protocollo hbase su classpath executor e driver usando - '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