java连接hbase_HBase实战 | 05405.15.0Spark2使用HBaseSpark访问HBase
转载自微信公众号Hadoop实操
温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
Fayson的github:
https://github.com/fayson/cdhproject
提示:代码块部分可以左右滑动查看噢
1
文章编写目的
越来越多的用户使用Spark对接HBase,对接HBase的方式有多种,通过HBase-client API实现,也有直接Spark On HBase的方式实现,比较常见的有华为的Spark-SQL-on-HBase,Hortonworks的Apache HBase Connector和Cloudera提供的SparkOnHBase,目前Cloudera的SparkOnHBase已提交的HBase的主干版本。本篇文章Fayson主要在Spark2环境下使用Cloudera的SparkOnHBase访问HBase。
内容概述
1.环境准备
2.SparkOnHBase示例代码
3.示例运行及验证
4.总结
测试环境
1.CM和CDH版本为5.15.0
2.Spark2.2.0.cloudera2
2
环境准备
在CDH5.15.0环境下安装了Spark2后默认是没有与HBase集成的,所以这里我们需要配置Spark2与HBase集成,在Spark环境变量中增加HBase的配置信息。
1.登录CM进入Spark2的配置界面搜索“spark-env.sh”,增加如下配置:
#配置Spark2的Java环境,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环境变量中for loop in `ls /opt/cloudera/parcels/CDH/jars/hbase-*.jar`;do export SPARK_DIST_CLASSPATH=${loop}:${SPARK_DIST_CLASSPATH}done#加载HBase的配置到Spark2的环境变量中export HADOOP_CONF_DIR=${HADOOP_CONF_DIR}:/etc/hbase/conf/
2.完成上述配置后,部署Spark2客户端配置
完成部署
3.在HBase中创建一个用于测试的表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.在工程中创建ClouderaSparkOnHBase.scala类,内容如下:
package com.cloudera.hbase
import org.apache.hadoop.hbase.client.Putimport org.apache.hadoop.hbase.{HBaseConfiguration, TableName}import org.apache.hadoop.hbase.spark.HBaseContextimport org.apache.hadoop.hbase.util.Bytesimport org.apache.spark.SparkConfimport 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() //创建HBaseContext对象 val hbaseContext = new HBaseContext(spark.sparkContext, hbaseconf) //准备一个RDD,后面用于向HBase表插入数据 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表写数据 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的节点上,使用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
作业执行成功
5.登录HBase查看user_info表数据
4
总结
1.Spark2使用SparkOnHBase开发访问HBase时,代码编译时会报“Could not access type Logging in package org.apache.spark”具体可以参考Fayson前面的文章《HBase-Spark无法在Spark2编译通过问题解决》
2.在进行Spark2与HBase环境集成时,将spark2-demo-1.0-SNAPSHOT.jar包加载至环境变量(确保集群所有节点/opt/cloudera/external目录下均有这个Jar包),是为了HBaseContext能够正常加载org.apche.spark.Logging类,当然可以将该类打包到一个独立的包中,Fayson这里偷懒直接使用示例工程的jar包。
3.使用SparkOnHBase可以方便的访问HBase,在非Kerberos和Kerberos环境下不需要考虑认证问题(Fayson在前面Spark2Streaming系列时使用的hbase-client API访问HBase,Kerberos环境下还需要考Driver和Executor的jaas.conf配置)
4.在代码中创建HBaseConfiguration.create()对象后设置ZK地址在每个Executor上无法正常获取ZK连接,默认加载的还是localhost配置(因为未在Spark2环境变量中指定HBase配置文件地址导致),因此使用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
提示:代码块部分可以左右滑动查看噢
为天地立心,为生民立命,为往圣继绝学,为万世开太平。
温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。
大家工作学习遇到HBase技术问题,把问题发布到HBase技术社区论坛http://hbase.group,欢迎大家论坛上面提问留言讨论。想了解更多HBase技术关注HBase技术社区公众号(微信号:hbasegroup),非常欢迎大家积极投稿。
技术社群
【HBase生态+Spark社区大群】
群福利:群内每周进行群直播技术分享及问答
加入方式1:
https://dwz.cn/Fvqv066s?spm=a2c4e.11153940.blogcont688191.19.1fcd1351nOOPvI
加入方式2:钉钉扫码加入
java连接hbase_HBase实战 | 05405.15.0Spark2使用HBaseSpark访问HBase相关推荐
- Java并发编程实战系列15之原子遍历与非阻塞同步机制(Atomic Variables and Non-blocking Synchronization)...
近年来,在并发算法领域的大多数研究都侧重于非阻塞算法,这种算法用底层的原子机器指令来代替锁来确保数据在并发访问中的一致性,非阻塞算法被广泛应用于OS和JVM中实现线程/进程调度机制和GC以及锁,并发数 ...
- java连接hbase_HBase 工具 | hbasesdk 推出HQL功能
hbase-sdk 基于HBase Client的相关API开发而来的一款轻量级的HBase ORM框架.提供SQL查询功能,以类SQL的方式--HQL读写HBase数据.? 针对HBase 1.x和 ...
- 《Java Web开发实战》Java工程师推荐的进阶之路
<Java Web开发实战>一书更加趋于实战性.此教材由浅入深.循序渐进,在语法阐述时尽量避免术语和公式,使初学者能够快速入门,全面掌握实战技能.它既可以作为高等院校本.专科计算机相关专业 ...
- 视频教程-JAVA WEB开发实战-Java
JAVA WEB开发实战 主要研究方向为J2EE..net .数据库 .前端.Android,曾经服务过大型上市国企IT部门,软件企业联合创始人,对软件研发管理.市场营销有自己独特思想体系! 张晨光 ...
- 名师讲坛——Java Web开发实战经典基础篇(JSP、Servlet、Struts、Ajax)
[书名]<名师讲坛--Java Web开发实战经典基础篇(JSP.Servlet.Struts.Ajax)> [作者]李兴华.王月清 [ISBN]9787302231585 }:YKf: ...
- 《Java 并发编程实战》--读书笔记
Java 并发编程实战 注: 极客时间<Java 并发编程实战>–读书笔记 GitHub:https://github.com/ByrsH/Reading-notes/blob/maste ...
- 拉勾教育 | Java 性能优化实战 21 讲
开篇词 开篇词 | Java 性能优化,是进阶高级架构师的炼金石 你好,我是李国.作为<Java 性能优化与面试 21 讲>这个课程的作者,我先来简单介绍下自己. 我曾任京东金融.陌陌科技 ...
- 五十二、Java连接Mysql数据库
@Author:Runsen @Date:2019/10/15 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不 ...
- java连接linux服务器执行shell命令(框架分析+推荐)
java连接linux服务器执行shell命令(框架分析+推荐) 一.分类+连接方式 程序打成jar包,在本地服务器上执行shell命令.这种使用MyRuntimeUtil工具类 java程序远程li ...
最新文章
- 2018.8.18 servlet使用的会话跟踪除session外还有哪些方式
- 仿QQ6 0侧滑之ViewDragHelper的使用(一)
- win2003系统+IIS6下,经常出现w3wp.exe和sqlserver.exe的内存占用居高不下
- 解决placeholder兼容性问题
- Python urllib与requests、XML和HTMLParser
- Bochs调试加载符号文件的问题
- Java 蜡烛图_ta-lib 里的蜡烛图形态函数源码
- 头条上python广告_满大街都是Python广告,真的如广告说的那样方便吗?,学精通后真能月如过万吗?业内大佬怎么看?...
- C语言 | 赋值与运算符
- dataguard switchover的自动化脚本实现
- Redis主从复制、哨兵模式和分布式集群
- 今天,这些公众号被永久禁言
- 离散数学杜忠复版答案_离散数学第2版答案
- 创建LabwindowsCVI工程
- oj美元和人民币java_【牛客网OJ题】:人民币转换
- 全网最好的子网划分方法与例题解析
- createrepo 是一个对rpm 文件进行索引建立的工具
- DDL语句--查看表
- Orcal数据库中ORA-01861: 文字与格式字符串不匹配
- 这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已
热门文章
- Spring Cloud Alibaba Nacos 的 2 种健康检查机制!
- Redis 面试题汇总
- Redis笔记之基本数据结构 动态字符串SDS
- C# Winform 窗体美化(一、IrisSkin 换肤库)
- 英语笔记:作文:What elective to choose
- python安装cv2模块_python - OpenCV已成功安装但未导入错误:没有名为“ cv2”的模块 - 堆栈内存溢出...
- 根可达算法的根_好屌好屌的「GC系列」JVM垃圾定位及垃圾回收算法浅析
- php类的举例,用类来代替递归方法,用php举例_php _ 搞代码
- android 滑动接听源码,android仿摩拜单车APP、炫酷RecyclerView、卡片滑动、仿饿了么点餐、自定义索引等源码...
- vue如何把数组转为json数组_vue.js,_vuejs Ajax取得一个数据json数组,vue.js - phpStudy...