2014-11-02 9 views
5

Sto provando a caricare i dati da HDFS in una tabella Hbase utilizzando Spark Streaming. Sto posizionando i dati in una directory run HDFS e li sto leggendo usando la funzione textFileStream. Poiché la scintilla non ha i jar hbase nel classpath, mi dà un errore anche durante l'importazione dei jar Hbase nella shell spark.Spark Shell non riesce a trovare la classe Hbase

scala> import org.apache.hadoop.hbase.mapred.TableOutputFormat 
<console>:10: error: object hbase is not a member of package org.apache.hadoop 
     import org.apache.hadoop.hbase.mapred.TableOutputFormat 

But if i add the hbase jars in the classpath while starting the spark shell then i am not getting any error. But it is still not able to find certain classes down the path. 

bin/spark-shell --jars /hbase/hbase-0.94.13/hbase-0.94.13-mapr-1401.jar 

scala> import org.apache.hadoop.hbase.{ HBaseConfiguration, HColumnDescriptor, HTableDescriptor } 
import org.apache.hadoop.hbase.{HBaseConfiguration, HColumnDescriptor, HTableDescriptor} 

scala> import org.apache.hadoop.hbase.client.{ HBaseAdmin, Put } 
import org.apache.hadoop.hbase.client.{HBaseAdmin, Put} 

scala> import org.apache.hadoop.hbase.io.ImmutableBytesWritable 
import org.apache.hadoop.hbase.io.ImmutableBytesWritable 

scala> import org.apache.hadoop.hbase.mapred.TableOutputFormat 
import org.apache.hadoop.hbase.mapred.TableOutputFormat 

scala> import org.apache.hadoop.hbase.mapreduce.TableInputFormat 
import org.apache.hadoop.hbase.mapreduce.TableInputFormat 

scala> import org.apache.hadoop.hbase.util.Bytes 
import org.apache.hadoop.hbase.util.Bytes 

scala> import org.apache.hadoop.mapred.JobConf 
import org.apache.hadoop.mapred.JobConf 

scala> import org.apache.spark.SparkContext 
import org.apache.spark.SparkContext 

scala> import org.apache.spark.rdd.{ PairRDDFunctions, RDD } 
import org.apache.spark.rdd.{PairRDDFunctions, RDD} 

scala> import org.apache.spark.streaming._ 
import org.apache.spark.streaming._ 

scala> import org.apache.spark.streaming.StreamingContext._ 
import org.apache.spark.streaming.StreamingContext._ 

scala> import org.apache.hadoop.hbase.client.mapr.{BaseTableMappingRules} 
import org.apache.hadoop.hbase.client.mapr.BaseTableMappingRules 

scala> val conf = HBaseConfiguration.create() 
conf: org.apache.hadoop.conf.Configuration = Configuration: core-default.xml, core-site.xml, mapred-default.xml, mapred-site.xml, hbase-default.xml, hbase-site.xml 

scala> val hbaseTableName = "/app/dev/MarketingIt/hbasetables/spark_test" 
hbaseTableName: String = /app/dev/MarketingIt/hbasetables/spark_test 

scala> val admin = new HBaseAdmin(conf) 
java.lang.RuntimeException: java.io.IOException: java.lang.RuntimeException: Error occurred while instantiating com.mapr.fs.MapRTableMappingRules. 
==> org/apache/hadoop/hbase/client/mapr/BaseTableMappingRules. 
     at org.apache.hadoop.hbase.client.HBaseAdmin.commonInit(HBaseAdmin.java:356) 
     at org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:156) 
     at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:31) 
     at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:36) 
     at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:38) 
     at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:40) 
     at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:42) 
     at $iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:44) 
     at $iwC$$iwC$$iwC$$iwC.<init>(<console>:46) 
     at $iwC$$iwC$$iwC.<init>(<console>:48) 
     at $iwC$$iwC.<init>(<console>:50) 
     at $iwC.<init>(<console>:52) 
     at <init>(<console>:54) 
     at .<init>(<console>:58) 
     at .<clinit>(<console>) 
     at .<init>(<console>:7) 
     at .<clinit>(<console>) 
     at $print(<console>) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:606) 
     at org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:788) 
     at org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1056) 
     at org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:614) 
     at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:645) 
     at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:609) 
     at org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:796) 
     at org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:841) 
     at org.apache.spark.repl.SparkILoop.command(SparkILoop.scala:753) 
     at org.apache.spark.repl.SparkILoop.processLine$1(SparkILoop.scala:601) 
     at org.apache.spark.repl.SparkILoop.innerLoop$1(SparkILoop.scala:608) 
     at org.apache.spark.repl.SparkILoop.loop(SparkILoop.scala:611) 
     at org.apache.spark.repl.SparkILoop$$anonfun$process$1.apply$mcZ$sp(SparkILoop.scala:936) 
     at org.apache.spark.repl.SparkILoop$$anonfun$process$1.apply(SparkILoop.scala:884) 
     at org.apache.spark.repl.SparkILoop$$anonfun$process$1.apply(SparkILoop.scala:884) 
     at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135) 
     at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:884) 
     at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:982) 
     at org.apache.spark.repl.Main$.main(Main.scala:31) 
     at org.apache.spark.repl.Main.main(Main.scala) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:606) 
     at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:303) 
     at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:55) 
     at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 
Caused by: java.io.IOException: java.lang.RuntimeException: Error occurred while instantiating com.mapr.fs.MapRTableMappingRules. 
==> org/apache/hadoop/hbase/client/mapr/BaseTableMappingRules. 
     at org.apache.hadoop.hbase.client.mapr.TableMappingRulesFactory.create(TableMappingRulesFactory.java:65) 
     at org.apache.hadoop.hbase.client.HBaseAdmin.commonInit(HBaseAdmin.java:348) 
     ... 47 more 
Caused by: java.lang.RuntimeException: Error occurred while instantiating com.mapr.fs.MapRTableMappingRules. 
==> org/apache/hadoop/hbase/client/mapr/BaseTableMappingRules. 
     at org.apache.hadoop.hbase.client.mapr.GenericHFactory.getImplementorInstance(GenericHFactory.java:40) 
     at org.apache.hadoop.hbase.client.mapr.TableMappingRulesFactory.create(TableMappingRulesFactory.java:47) 
     ... 48 more 
Caused by: java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/client/mapr/BaseTableMappingRules 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
     at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
     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:425) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:412) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:190) 
     at org.apache.hadoop.hbase.client.mapr.GenericHFactory.getImplementorInstance(GenericHFactory.java:30) 
     ... 49 more 
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.client.mapr.BaseTableMappingRules 
     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:425) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
     ... 65 more 

Here as you can see i have added all the hbase jars and spark is able to find some of the hbase classes and cant find some 
All the classes are in the same jar i added. Since it is saying Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.client.mapr.BaseTableMappingRules. I have imported that class specifically. But i still get the same error. 

risposta

2

Se si utilizza Spark 1. +, provare a impostare più proprietà classe Path in configurazione Spark

Aggiungere questa linea a suscitare-defaults.conf -

spark.executor. extraClassPath /opt/cloudera/parcels/CDH/lib/hive/lib/hive-hbase-handler.jar:/opt/cloudera/parcels/CDH/lib/hbase/hbase-server.jar:/opt/cloudera/parcels /CDH/lib/hbase/hbase-protocol.jar:/opt/cloudera/parcels/CDH/lib/hbase/hbase-hadoop2-compat.jar:/opt/cloudera/parcels/CDH/lib/hbase/hbase-client .jar:/opt/cloude ra/pacchi/CDH/lib/HBase/HBase-common.jar: /opt/cloudera/parcels/CDH/lib/hbase/lib/htrace-core.jar

Se si utilizza un'altra distribuzione, ricerca percorso appropriato per i file jar.

Oltre alla modifica della configurazione, aggiungere il percorso classe del driver di scintilla scocca o mentre presentando il lavoro scintilla come -

--driver-class-path
/opt/Cloudera/pacchetti/CDH /lib/hbase/hbase-server.jar:/opt/cloudera/parcels/CDH/lib/hbase/hbase-protocol.jar:/opt/cloudera/parcels/CDH/lib/hbase/hbase-hadoop2-compat.jar : /opt/cloudera/parcels/CDH/lib/hbase/hbase-client.jar: /opt/cloudera/parcels/CDH/lib/hbase/hbase-common.jar:/opt/Cloudera/pacchetti/CDH/lib/hbase/lib/htrace-core.jar

È possibile aggiungere i file jar al percorso della classe spark in spark-env.sh per evitare di specificare il percorso completo ogni volta che si desidera avviare spark-shell o inviare un lavoro spark, ma si verificano altri problemi durante l'utilizzo di questo approccio. Ho trovato le opzioni sopra per funzionare meglio per me.

export SPARK_CLASSPATH =/opt/Cloudera/pacchetti/CDH/lib/HBase/HBase-server.jar: /opt/cloudera/parcels/CDH/lib/hbase/hbase-protocol.jar:/opt /cloudera/parcels/CDH/lib/hbase/hbase-hadoop2-compat.jar:/opt/cloudera/parcels/CDH/lib/hbase/hbase-client.jar:/opt/cloudera/parcels/CDH/lib/hbase /hbase-common.jar:/opt/cloudera/parcels/CDH/lib/hbase/lib/htrace-core.jar

Niente di più è necessario per la Spark 1. +

Se si utilizza Spark 0.9, per favore vedi questo link - sì, i link possono rompersi ma non ho provato su Spark 0.9 e questo blog ha informazioni utili http://www.abcn.net/2014/07/lighting-spark-with-hbase-full-edition.html

2

Add linea in conf/spark-env.sh

Sostituire $ {} HBASE_HOME con percorso completo

export SPARK_CLASSPATH = $ {HBASE_HOME }/lib/*