荐 任务3: Spark RDD读写HBase数据
任务3: Spark RDD读写HBase数据
文章目录
一、实训背景
HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
二、实训环境
- 两台1核2G的主机
- 主机系统为centos6.5
- 都已安装jdk1.8,并在~/.bashrc配置了环境变量
- 都已配置好ssh免密码登陆
- 都已搭建好spark standalone集群平台
- 都已搭建好hadoop集群环境
三、实训步骤
步骤1: 安装HBase
- 从清华大小镜像站点下载HBbase
root@server1 ~# wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/1.4.13/hbase-1.4.13-bin.tar.gz
2、解压程序包,并放在/usr/local
目录下
root@server1 ~# tar xzvf hbase-1.4.13-bin.tar.gz -C /usr/local
3、配置环境变量,在~/.bashrc
中将hbase下的bin目录添加到path中。
export PATH=$PATH:/usr/local/hbase/bin
注意,要运行source ~/.bashrc
命令使之生效。
4、查看Hbase的版本
root@server1 ~# hbase version
步骤2: 配置HBase数据存储于hadoop
-
在hbase-env.sh配置JAVA_HOME环境变量
[root@server1 conf]# vi hbase-env.sh export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el6_10.x86_64
-
配置hbase-site.xml文件
[root@server1 conf]# vi hbase-site.xml <configuration> <property> <name>hbase.rootdir</name> <!-- hbase存放数据目录 --> <value>hdfs://server1:9000/hbase</value> <!-- 端口要和Hadoop的fs.defaultFS端口一致--> </property> <property> <name>hbase.cluster.distributed</name> <!-- 是否分布式部署 --> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <!-- zookooper 服务启动的节点,只能为奇数个 --> <value>server1,server2</value> </property> <property> <!--zookooper配置、日志等的存储位置,必须为以存在 --> <name>hbase.zookeeper.property.dataDir</name> <value>/data/hbase/zookeeper</value> </property> <property> <!--hbase web 端口 --> <name>hbase.master.info.port</name> <value>16610</value> </property> </configuration>
-
配置regionservers
[root@server1 conf]# vi regionservers server1 server2
-
拷贝Hbase到server2
root@server1 local# scp -r hbase-2.2.4/ server2:/usr/local
-
启动HBase集群
start-hbase.sh
-
打开http://server1:16610查看启动的情况
可以看到HBase启动成功了。
步骤3: 制作HBase样本数据
-
启动HBase客户端
[root@server1 hbase-2.2.4]# hbase shell
-
创建student表,列簇为info
hbase(main):006:0> create 'student','info' 0 row(s) in 1.3820 seconds => Hbase::Table - student
-
可以查看到表已经创建
hbase(main):007:0> list TABLE student 1 row(s) in 0.0080 seconds => ["student"]
-
插入两条记录包含用户名、年纪、性别
hbase(main):008:0> put 'student','1','info:name','jie' 0 row(s) in 0.1670 seconds hbase(main):009:0> put 'student','1','info:gender','M' 0 row(s) in 0.0160 seconds hbase(main):010:0> put 'student','1','info:age','22' 0 row(s) in 0.0100 seconds hbase(main):011:0> put 'student','2','info:name','sin' 0 row(s) in 0.0060 seconds hbase(main):012:0> put 'student','2','info:gender','F' 0 row(s) in 0.0080 seconds hbase(main):013:0> put 'student','2','info:age','20' 0 row(s) in 0.0090 seconds
查看表添加信息
hbase(main):015:0> scan 'student' ROW COLUMN+CELL 1 column=info:age, timestamp=1594658385946, value=22 1 column=info:gender, timestamp=1594658377621, value=M 1 column=info:name, timestamp=1594658360224, value=jie 2 column=info:age, timestamp=1594658537082, value=20 2 column=info:gender, timestamp=1594658413265, value=F 2 column=info:name, timestamp=1594658396448, value=sin 2 row(s) in 0.0560 seconds
步骤4: Spark RDD读取HBase数据
-
在开始编程操作HBase数据库之前,需要对做一些准备工作。
请新建一个终端,执行下面命令,把HBase的lib目录下的一些jar文件拷贝到Spark中,这些都是编程时需要引入的jar包,需要拷贝的jar文件包括:所有hbase开头的jar文件、guava-12.0.1.jar、htrace-core-3.1.0-incubating.jar和protobuf-java-2.5.0.jar,可以打开一个终端按照以下命令来操作:
# 在server1、server2添加 cd /usr/local/spark/jars mkdir hbase cd hbase cp /usr/local/hbase/lib/hbase*.jar ./ cp /usr/local/hbase/lib/guava-12.0.1.jar ./ # **此处为bug1,此文件需与share/hadoop/common/lib内guava.jar版本一致,将版本低的删除,选版本高的** cp /usr/local/hbase/lib/htrace-core-3.1.0-incubating.jar ./ cp /usr/local/hbase/lib/protobuf-java-2.5.0.jar ./
只有这样,后面编译和运行过程才不会出错。
-
在
/usr/local/spark/mycode/hbase
(自行创建相应文件夹)下,编写读取代码RDDtest.scala
如下import org.apache.hadoop.conf.Configuration import org.apache.hadoop.hbase._ import org.apache.hadoop.hbase.client._ import org.apache.hadoop.hbase.mapreduce.TableInputFormat import org.apache.hadoop.hbase.util.Bytes import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ import org.apache.spark.SparkConf object SparkOperateHBase { def main(args: Array[String]) { val conf = HBaseConfiguration.create() val sc = new SparkContext(new SparkConf()) //设置查询的表名 conf.set(TableInputFormat.INPUT_TABLE, "student") val stuRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat], classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable], classOf[org.apache.hadoop.hbase.client.Result]) val count = stuRDD.count() println("Students RDD Count:" + count) stuRDD.cache() //遍历输出 stuRDD.foreach({ case (_,result) => val key = Bytes.toString(result.getRow) val name = Bytes.toString(result.getValue("info".getBytes,"name".getBytes)) val gender = Bytes.toString(result.getValue("info".getBytes,"gender".getBytes)) val age = Bytes.toString(result.getValue("info".getBytes,"age".getBytes)) println("Row key:"+key+" Name:"+name+" Gender:"+gender+" Age:"+age) }) } }
-
在
/usr/local/spark/mycode/hbase
目录下编写parkhbase.sbt,使用sbt打包,name := "RDDtest" version := "1.3.10" scalaVersion := "2.11.12" libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.5" libraryDependencies += "org.apache.hbase" % "hbase-client" % "1.4.13" libraryDependencies += "org.apache.hbase" % "hbase-common" % "1.4.13" libraryDependencies += "org.apache.hbase" % "hbase-server" % "1.4.13"
打包命令如下:
[root@server1 ~]cd /usr/local/spark/mycode/hbase [root@server1 hbase]# sbt package [info] Updated file /usr/local/spark/mycode/hbase/project/build.properties: set sbt.version to 1.3.10 [info] Loading project definition from /usr/local/spark/mycode/hbase/project [info] Loading settings for project hbase from sparkhbase.sbt ... [info] Set current project to RDDtest (in build file:/usr/local/spark/mycode/hbase/) [warn] There may be incompatibilities among your library dependencies; run 'evicted' to see detailed eviction warnings. [info] Compiling 1 Scala source to /usr/local/spark/mycode/hbase/target/scala-2.11/classes ... [success] Total time: 34 s, completed 2020-7-14 0:50:01 [info] Loading project definition from /usr/local/spark/mycode/hbase/project [info] Loading settings for project hbase from sparkhbase.sbt ... [info] Set current project to RDDtest (in build file:/usr/local/spark/mycode/hbase/) [success] Total time: 14 s, completed 2020-7-14 0:50:41
打包成功后,生成的jar包的位置为
/usr/local/spark/mycode/hbase/target/scala-2.11/rddtest_2.11-1.3.10.jar
。最后,通过 spark-submit 运行程序。我们就可以将生成的 jar 包通过 spark-submit 提交到 Spark 中运行了,命令如下:
/usr/local/spark/bin/spark-submit --driver-class-path /usr/local/spark/jars/hbase/*:/usr/local/hbase/conf --class "SparkOperateHBase" /usr/local/spark/mycode/hbase/target/scala-2.11/rddtest_2.11-1.3.10.jar
此处为bug2,运行spark-submit报错提示java.lang.NoClassDefFoundError: com/yammer/metrics/core/Gauge
时,说明我们在1添加少了metrics-core-*.jar
,进入 /usr/local/spark/jars/hbase/
添加即可
重新运行spark-submit命令
- 在终端可以看到结果为:
Students RDD Count:2
Row key:1 Name:jie Gender:M Age:22
Row key:2 Name:sin Gender:F Age:20
本文地址:https://blog.csdn.net/kichum123/article/details/107327537
上一篇: 三门峡网站建设有哪些内容 网站建设哪家好
下一篇: 吞不下吐不出 什么在作怪