java连接hbase_HBase实战 | 05405.15.0Spark2使用HBaseSpark访问HBase
轉(zhuǎn)載自微信公眾號Hadoop實操
溫馨提示:如果使用電腦查看圖片不清晰,可以使用手機打開文章單擊文中的圖片放大查看高清原圖。
Fayson的github:
https://github.com/fayson/cdhproject
提示:代碼塊部分可以左右滑動查看噢
1
文章編寫目的
越來越多的用戶使用Spark對接HBase,對接HBase的方式有多種,通過HBase-client API實現(xiàn),也有直接Spark On HBase的方式實現(xiàn),比較常見的有華為的Spark-SQL-on-HBase,Hortonworks的Apache HBase Connector和Cloudera提供的SparkOnHBase,目前Cloudera的SparkOnHBase已提交的HBase的主干版本。本篇文章Fayson主要在Spark2環(huán)境下使用Cloudera的SparkOnHBase訪問HBase。
內(nèi)容概述
1.環(huán)境準(zhǔn)備
2.SparkOnHBase示例代碼
3.示例運行及驗證
4.總結(jié)
測試環(huán)境
1.CM和CDH版本為5.15.0
2.Spark2.2.0.cloudera2
2
環(huán)境準(zhǔn)備
在CDH5.15.0環(huán)境下安裝了Spark2后默認(rèn)是沒有與HBase集成的,所以這里我們需要配置Spark2與HBase集成,在Spark環(huán)境變量中增加HBase的配置信息。
1.登錄CM進(jìn)入Spark2的配置界面搜索“spark-env.sh”,增加如下配置:
#配置Spark2的Java環(huán)境,Spark2要求JDK8或以上版本export?JAVA_HOME=/usr/java/jdk1.8.0_131
#加載該依賴包的主要目的是Spark2的Logging為私有的,Fayson自己重寫了Logging類
export?SPARK_DIST_CLASSPATH=$SPARK_DIST_CLASSPATH:/opt/cloudera/external-jars/spark2-demo-1.0-SNAPSHOT.jar
#加載HBase的依賴包到Spark2環(huán)境變量中
for?loop?in?`ls?/opt/cloudera/parcels/CDH/jars/hbase-*.jar`;do
???export?SPARK_DIST_CLASSPATH=${loop}:${SPARK_DIST_CLASSPATH}
done
#加載HBase的配置到Spark2的環(huán)境變量中
export?HADOOP_CONF_DIR=${HADOOP_CONF_DIR}:/etc/hbase/conf/
2.完成上述配置后,部署Spark2客戶端配置
完成部署
3.在HBase中創(chuàng)建一個用于測試的表user_info
create?'user_info','info'3
SparkOnHBase示例代碼
1.在Spark2工程中添加SparkOnHBase的Maven依賴
<dependency>
????<groupId>org.apache.kudugroupId>
????<artifactId>kudu-spark2_2.11artifactId>
????<version>1.7.0-cdh5.15.0version>
dependency>
2.在工程中創(chuàng)建ClouderaSparkOnHBase.scala類,內(nèi)容如下:
package?com.cloudera.hbaseimport?org.apache.hadoop.hbase.client.Put
import?org.apache.hadoop.hbase.{HBaseConfiguration,?TableName}
import?org.apache.hadoop.hbase.spark.HBaseContext
import?org.apache.hadoop.hbase.util.Bytes
import?org.apache.spark.SparkConf
import?org.apache.spark.sql.SparkSession
/**
??*?package:?com.cloudera.hbase
??*?describe:?使用Cloudera提供的Spark?On?HBase訪問HBase
??*?creat_user:?Fayson
??*?email:?htechinfo@163.com
??*?creat_date:?2019/1/24
??*?creat_time:?上午10:59
??*?公眾號:Hadoop實操
??*/
object?ClouderaSparkOnHBase?{
??def?main(args:?Array[String]):?Unit?=?{
????//Spark?Conf配置信息
????val?conf?=?new?SparkConf()
??????.setAppName("ClouderaSparkOnHBase")
??????.set("spark.master",?"yarn")
??????.set("spark.submit.deployMode",?"client")
????//初始化SparkSession對象
????val?spark?=?SparkSession.builder().config(conf).getOrCreate()
????//初始化HBase?Configuration
????val?hbaseconf?=?HBaseConfiguration.create()
????//創(chuàng)建HBaseContext對象
????val?hbaseContext?=?new?HBaseContext(spark.sparkContext,?hbaseconf)
????//準(zhǔn)備一個RDD,后面用于向HBase表插入數(shù)據(jù)
????val?rdd?=?spark.sparkContext.parallelize(Array(
??????(Bytes.toBytes("1"),?Array((Bytes.toBytes("info"),?Bytes.toBytes("a"),?Bytes.toBytes("1")))),
??????(Bytes.toBytes("2"),?Array((Bytes.toBytes("info"),?Bytes.toBytes("b"),?Bytes.toBytes("2")))),
??????(Bytes.toBytes("3"),?Array((Bytes.toBytes("info"),?Bytes.toBytes("c"),?Bytes.toBytes("3")))),
??????(Bytes.toBytes("4"),?Array((Bytes.toBytes("info"),?Bytes.toBytes("d"),?Bytes.toBytes("4")))),
??????(Bytes.toBytes("5"),?Array((Bytes.toBytes("info"),?Bytes.toBytes("e"),?Bytes.toBytes("5"))))
????))
????val?tableName?=?TableName.valueOf("user_info")
????//使用HBaseContext.bulkPut向指定的HBase表寫數(shù)據(jù)
????hbaseContext.bulkPut[(Array[Byte],?Array[(Array[Byte],?Array[Byte],?Array[Byte])])](rdd,
??????tableName,
??????(putRecord)?=>?{
????????val?put?=?new?Put(putRecord._1)
????????putRecord._2.foreach((putValue)?=>
??????????put.addColumn(putValue._1,?putValue._2,?putValue._3)
????????)
????????put
??????});
??}
}
3.使用Maven命令編譯工程
mvn?clean?scala:compile?package4.將編譯好的spark2-demo-1.0-SNAPSHOT.jar上傳到集群有Spark2 Gateway的節(jié)點上,使用spark2-submit命令提交
kinit?faysonspark2-submit?--class?com.cloudera.hbase.ClouderaSparkOnHBase?\
????--master?yarn?--num-executors?4?--driver-memory?1g?\
????--driver-cores?1?--executor-memory?1g?--executor-cores?1?\
????/data/disk1/hbase-spark-demo/spark2-demo-1.0-SNAPSHOT.jar
作業(yè)執(zhí)行成功
5.登錄HBase查看user_info表數(shù)據(jù)
4
總結(jié)
1.Spark2使用SparkOnHBase開發(fā)訪問HBase時,代碼編譯時會報“Could not access type Logging in package org.apache.spark”具體可以參考Fayson前面的文章《HBase-Spark無法在Spark2編譯通過問題解決》
2.在進(jìn)行Spark2與HBase環(huán)境集成時,將spark2-demo-1.0-SNAPSHOT.jar包加載至環(huán)境變量(確保集群所有節(jié)點/opt/cloudera/external目錄下均有這個Jar包),是為了HBaseContext能夠正常加載org.apche.spark.Logging類,當(dāng)然可以將該類打包到一個獨立的包中,Fayson這里偷懶直接使用示例工程的jar包。
3.使用SparkOnHBase可以方便的訪問HBase,在非Kerberos和Kerberos環(huán)境下不需要考慮認(rèn)證問題(Fayson在前面Spark2Streaming系列時使用的hbase-client API訪問HBase,Kerberos環(huán)境下還需要考Driver和Executor的jaas.conf配置)
4.在代碼中創(chuàng)建HBaseConfiguration.create()對象后設(shè)置ZK地址在每個Executor上無法正常獲取ZK連接,默認(rèn)加載的還是localhost配置(因為未在Spark2環(huán)境變量中指定HBase配置文件地址導(dǎo)致),因此使用SparkOnHBase必須完成Spark2與HBase的集成。
GitHub地址:
https://github.com/fayson/cdhproject/blob/master/spark2demo/src/main/scala/com/cloudera/hbase/ClouderaSparkOnHBase.scala
https://github.com/fayson/cdhproject/blob/master/spark2demo/pom.xml
提示:代碼塊部分可以左右滑動查看噢
為天地立心,為生民立命,為往圣繼絕學(xué),為萬世開太平。
溫馨提示:如果使用電腦查看圖片不清晰,可以使用手機打開文章單擊文中的圖片放大查看高清原圖。
推薦關(guān)注Hadoop實操,第一時間,分享更多Hadoop干貨,歡迎轉(zhuǎn)發(fā)和分享。
大家工作學(xué)習(xí)遇到HBase技術(shù)問題,把問題發(fā)布到HBase技術(shù)社區(qū)論壇http://hbase.group,歡迎大家論壇上面提問留言討論。想了解更多HBase技術(shù)關(guān)注HBase技術(shù)社區(qū)公眾號(微信號:hbasegroup),非常歡迎大家積極投稿。
技術(shù)社群
【HBase生態(tài)+Spark社區(qū)大群】
群福利:群內(nèi)每周進(jìn)行群直播技術(shù)分享及問答
加入方式1:
https://dwz.cn/Fvqv066s?spm=a2c4e.11153940.blogcont688191.19.1fcd1351nOOPvI
加入方式2:釘釘掃碼加入
總結(jié)
以上是生活随笔為你收集整理的java连接hbase_HBase实战 | 05405.15.0Spark2使用HBaseSpark访问HBase的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java tostring的用处_JAV
- 下一篇: 百度相关搜索软件_不太热门的办公神器软件