日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

java连接hbase_HBase实战 | 05405.15.0Spark2使用HBaseSpark访问HBase

發(fā)布時間:2025/3/12 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java连接hbase_HBase实战 | 05405.15.0Spark2使用HBaseSpark访问HBase 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(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進入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.hbase

import?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?package

4.將編譯好的spark2-demo-1.0-SNAPSHOT.jar上傳到集群有Spark2 Gateway的節(jié)點上,使用spark2-submit命令提交

kinit?fayson
spark2-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.在進行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)每周進行群直播技術(shù)分享及問答
加入方式1:

https://dwz.cn/Fvqv066s?spm=a2c4e.11153940.blogcont688191.19.1fcd1351nOOPvI

加入方式2:釘釘掃碼加入

總結(jié)

以上是生活随笔為你收集整理的java连接hbase_HBase实战 | 05405.15.0Spark2使用HBaseSpark访问HBase的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。