作者:Syn良子 出處:http://www.cnblogs.com/cssdongl/p/7347167.html 轉載請注明出處
記錄自己最近抽空折騰虛擬機環境時用spark2.0的pyspark訪問Hbase1.2時遇到的問題及解決過程.
連接准備
快速用pyspark訪問Hbase中的表進行測試,代碼如下(注意,其中的host和inputtable是已經定義好的主機和表名變量)
spark = SparkSession.builder.master("yarn-client").appName("statistics").getOrCreate()
hbaseconf = {"hbase.zookeeper.quorum":host,"hbase.mapreduce.inputtable":inputtable}
keyConv = "org.apache.spark.examples.pythonconverters.ImmutableBytesWritableToStringConverter"
valueConv = "org.apache.spark.examples.pythonconverters.HBaseResultToStringConverter"
hbase_rdd = spark.sparkContext.newAPIHadoopRDD(\
"org.apache.hadoop.hbase.mapreduce.TableInputFormat",\
"org.apache.hadoop.hbase.io.ImmutableBytesWritable",\
"org.apache.hadoop.hbase.client.Result",\
keyConverter=keyConv, valueConverter=valueConv, conf=hbaseconf)
hbase_rdd.count()
發現問題
執行上面的pyspark代碼測試,結果報錯如下圖所示
額,看着這個熟悉的異常讓我莫名尷尬,ClassNotFoundException...那就是說此時spark訪問hbase時依賴的一些hbase jar包沒有在classpath中找到.那么將其加入classpath即可.
解決問題
找到hbase1.2根目錄下lib文件夾下的所有jar包,將其拷貝到spark所在節點的自己專門存放jar包的目錄下,我這里路徑假設是/home/hadoop/scripts/sparkStatistics/workJars/hbaseJars,然后有二種方法將其加入spark的classpath,如下
- 修改spark-env.sh中的SPARK_CLASSPATH,比如
export SPARK_CLASSPATH=/home/hadoop/scripts/sparkStatistics/workJars/hbaseJars/*
或者
- 修改spark-defaults.conf,如下
spark.executor.extraClassPath=/home/hadoop/scripts/sparkStatistics/workJars/hbaseJars/*
spark.driver.extraClassPath=/home/hadoop/scripts/sparkStatistics/workJars/hbaseJars/*
二種方式都可以,但是第一種修改spark-env.sh的方式在spark1.0之前比較推薦,之后的版本建議用第二種方式.
我用的第二種方式,修改完成后重啟spark集群.測試pyspark代碼,訪問hbase表成功無異常.