# 读写HBase数据

> 来源：梦飞idc云平台 | 原文：https://www.mfisp.com/14071.html | 发布：2022-12-09 | 更新：2022-12-09 | 分类：建站教程、投稿分享

**读写HBase数据**  
① 在hbaseshell中使用命令创建HBase数据库；  
② 使用spark读写HBase数据库中的数据。  
**实验原理**  
**-> HBase**  
HBase是一个高可靠、高性能、面向列、可伸缩分布式数据库，主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理非常庞大的表，可以通过水平扩展的方式，利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表。

 

**-> hbase-shell**  
hbase-shell是一种HBase交互式操作环境，可以在其中输入命令，完成数据库创建和表的增、删、查、改等操作。

 

**1. HBase的安装**  
**∥ 下载文件**

 

HBase是Hadoop生态系统中的一个组件，但是，Hadoop安装以后，本身并不包含HBase，因此，需要单独安装HBase。打开火狐浏览器，访问如下链接下载hbase-1.1.5-bin.tar.gz，下载的文件被放到了Linux系统的“/home/user/Downloads/”目录下。

 

拷贝代码  
http://file.ictedu.com/fileserver/big_data_common/data/hbase-1.1.5-bin.tar.gz

 

**∥ 安装文件**  
下载完安装文件以后，需要对文件进行解压。按照Linux系统使用的默认规范，用户安装的软件一般都是存放在“/usr/local/”目录下，打开一个终端，请使用hadoop用户登录终端，执行如下命令：

 

拷贝代码  
sudo tar -zxf /home/user/Downloads/hbase-1.1.5-bin.tar.gz -C /usr/local  
将解压的文件名hbase-1.1.5改为hbase，以方便使用，命令如下：

 

拷贝代码  
sudo mv /usr/local/hbase-1.1.5 /usr/local/hbase  
将HBase安装目录下的bin目录（即/usr/local/hbase/bin）添加到系统的PATH环境变量中，这样，每次启动HBase时就不需要到“/usr/local/hbase”目录下执行启动命令，方便HBase的使用。请使用vim编辑器打开“~/.bashrc”文件，命令如下：

 

拷贝代码  
vim ~/.bashrc  
然后再把HBase的bin目录“/usr/local/hbase/bin”追加到PATH中。当要在PATH中继续加入新的路径时，只要用英文冒号“:”隔开，把新的路径加到后面即可，追加后的结果如下：

 

拷贝代码  
export PATH=$PATH:/usr/local/hadoop/sbin:/usr/local/hadoop/bin:/usr/local/hbase/bin  
添加后，执行如下命令使设置生效：

 

拷贝代码  
source ~/.bashrc  
需要为当前登录Linux系统的hadoop用户添加访问HBase目录的权限，将HBase安装目录下的所有文件的所有者改为hadoop，命令如下：

 

拷贝代码  
cd /usr/local  
sudo chown -R hadoop ./hbase

 

**∥ 配置**  
使用vim编辑器打开“/usr/local/hbase/conf/hbase-env.sh”，命令如下：

 

拷贝代码  
vim /usr/local/hbase/conf/hbase-env.sh  
打开hbase-env.sh文件以后，需要在hbase-env.sh文件中配置JAVA_HOME、HBASE_CLASSPATH和HBASE_MANAGES_ZK。其中，HBASE_CLASSPATH设置为本机Hadoop安装目录下的conf目录（即/usr/local/hadoop/conf）。JAVA_HOME和HBASE_MANAGES_ZK的配置方法和上面单机模式的配置方法相同。修改后的hbase-env.sh文件应该包含如下三行信息：

 

拷贝代码  
export JAVA_HOME=/usr/share/jdk1.8.0_181  
export HBASE_CLASSPATH=/usr/local/hadoop/conf  
export HBASE_MANAGES_ZK=true  
修改完成以后，保存hbase-env.sh文件并退出vim编辑器。

 

**使用vim编辑器打开并编辑“/usr/local/hbase/conf/hbase-site.xml”文件，命令如下：**

 

拷贝代码  
vim /usr/local/hbase/conf/hbase-site.xml  
在hbase-site.xml文件中，需要设置属性hbase.rootdir，用于指定HBase数据的存储位置。在HBase伪分布式模式中，是使用伪分布式模式的HDFS存储数据，因此，需要把hbase.rootdir设置为HBase在HDFS上的存储路径，根据Hadoop伪分布式模式的配置可以知道，HDFS的访问路径为“hdfs://localhost:9000/”，因为，这里设置hbase.rootdir为“hdfs://localhost:9000/hbase”。此外，由于采用了伪分布式模式，因此，还需要将属性hbase.cluter.distributed设置为true。修改后的hbase-site.xml文件中的配置信息如下：

 

拷贝代码

 

hbase.rootdir  
hdfs://localhost:9000/hbase

 

hbase.cluster.distributed  
true

 

保存hbase-site.xml文件，并退出vim编辑器。

 

**2. 创建一个HBase表**  
**∥ 启动Hadoop**  
因为HBase是伪分布式模式，需要调用HDFS，所以，需要首先切换到hadoop用户下,hadoop密码为hadoop@12#$，然后再在终端中输入下面命令启动Hadoop的HDFS：

 

拷贝代码  
su - hadoop  
cd /usr/local/hadoop  
./sbin/start-dfs.sh

 

∥ 启动HBase  
然后，执行如下命令启动HBase：  
//启动HBase

 

拷贝代码  
cd /usr/local/hbase  
./bin/start-hbase.sh  
//启动HBase Shell

 

拷贝代码  
./bin/hbase shell

 

**∥ 创建HBase表**  
如果里面已经有一个名称为student的表，请使用如下命令删除该表：

 

拷贝代码  
disable ‘student’  
拷贝代码  
drop ‘student’  
在HBase Shell中执行如下命令创建student表：

 

拷贝代码  
create ‘student’,‘info’  
首先录入student表的第一个学生记录

 

拷贝代码  
put ‘student’,‘1’,‘info:name’,‘Xueqian’  
拷贝代码  
put ‘student’,‘1’,‘info:gender’,‘F’  
拷贝代码  
put ‘student’,‘1’,‘info:age’,‘23’  
然后录入student表的第二个学生记录

 

拷贝代码  
put ‘student’,‘2’,‘info:name’,‘Weiliang’  
拷贝代码  
put ‘student’,‘2’,‘info:gender’,‘M’  
拷贝代码  
put ‘student’,‘2’,‘info:age’,‘24’

 

**3. 配置Spark**  
**∥ 把HBase安装目录下的一些jar文件拷贝到Spark安装目录中**  
把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，命令如下：

 

拷贝代码  
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 ./  
拷贝代码  
cp /usr/local/hbase/lib/htrace-core-3.1.0-incubating.jar ./  
拷贝代码  
cp /usr/local/hbase/lib/protobuf-java-2.5.0.jar ./

 

**读写HBase数据**  
① 在hbase-shell中使用命令创建HBase数据库；  
② 使用Spark读写HBase数据库中的数据。  
实验原理  
**-> HBase**  
HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库，主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理非常庞大的表，可以通过水平扩展的方式，利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表。

 

**-> hbase-shell**  
hbase-shell是一种HBase交互式操作环境，可以在其中输入命令，完成数据库创建和表的增、删、查、改等操作。

 

**1. HBase的安装  
∥ 下载文件**  
HBase是Hadoop生态系统中的一个组件，但是，Hadoop安装以后，本身并不包含HBase，因此，需要单独安装HBase。打开火狐浏览器，访问如下链接下载hbase-1.1.5-bin.tar.gz，下载的文件被放到了Linux系统的“/home/user/Downloads/”目录下。

 

拷贝代码  
http://file.ictedu.com/fileserver/big_data_common/data/hbase-1.1.5-bin.tar.gz  
**∥ 安装文件**  
下载完安装文件以后，需要对文件进行解压。按照Linux系统使用的默认规范，用户安装的软件一般都是存放在“/usr/local/”目录下，打开一个终端，请使用hadoop用户登录终端，执行如下命令：

 

拷贝代码  
sudo tar -zxf /home/user/Downloads/hbase-1.1.5-bin.tar.gz -C /usr/local  
将解压的文件名hbase-1.1.5改为hbase，以方便使用，命令如下：

 

拷贝代码  
sudo mv /usr/local/hbase-1.1.5 /usr/local/hbase  
将HBase安装目录下的bin目录（即/usr/local/hbase/bin）添加到系统的PATH环境变量中，这样，每次启动HBase时就不需要到“/usr/local/hbase”目录下执行启动命令，方便HBase的使用。请使用vim编辑器打开“~/.bashrc”文件，命令如下：

 

拷贝代码  
vim ~/.bashrc  
然后再把HBase的bin目录“/usr/local/hbase/bin”追加到PATH中。当要在PATH中继续加入新的路径时，只要用英文冒号“:”隔开，把新的路径加到后面即可，追加后的结果如下：

 

拷贝代码  
export PATH=$PATH:/usr/local/hadoop/sbin:/usr/local/hadoop/bin:/usr/local/hbase/bin  
添加后，执行如下命令使设置生效：

 

拷贝代码  
source ~/.bashrc  
需要为当前登录Linux系统的hadoop用户添加访问HBase目录的权限，将HBase安装目录下的所有文件的所有者改为hadoop，命令如下：

 

拷贝代码  
cd /usr/local  
sudo chown -R hadoop ./hbase  
∥ 配置  
使用vim编辑器打开“/usr/local/hbase/conf/hbase-env.sh”，命令如下：

 

拷贝代码  
vim /usr/local/hbase/conf/hbase-env.sh  
打开hbase-env.sh文件以后，需要在hbase-env.sh文件中配置JAVA_HOME、HBASE_CLASSPATH和HBASE_MANAGES_ZK。其中，HBASE_CLASSPATH设置为本机Hadoop安装目录下的conf目录（即/usr/local/hadoop/conf）。JAVA_HOME和HBASE_MANAGES_ZK的配置方法和上面单机模式的配置方法相同。修改后的hbase-env.sh文件应该包含如下三行信息：

 

拷贝代码  
export JAVA_HOME=/usr/share/jdk1.8.0_181  
export HBASE_CLASSPATH=/usr/local/hadoop/conf  
export HBASE_MANAGES_ZK=true  
修改完成以后，保存hbase-env.sh文件并退出vim编辑器。

 

**使用vim编辑器打开并编辑“/usr/local/hbase/conf/hbase-site.xml”文件，命令如下：**

 

拷贝代码  
vim /usr/local/hbase/conf/hbase-site.xml  
**在hbase-site.xml文件中，需要设置属性hbase.rootdir，用于指定HBase数据的存储位置。在HBase伪分布式模式中，是使用伪分布式模式的HDFS存储数据，因此，需要把hbase.rootdir设置为HBase在HDFS上的存储路径，根据Hadoop伪分布式模式的配置可以知道，HDFS的访问路径为“hdfs://localhost:9000/”，因为，这里设置hbase.rootdir为“hdfs://localhost:9000/hbase”。此外，由于采用了伪分布式模式，因此，还需要将属性hbase.cluter.distributed设置为true。修改后的hbase-site.xml文件中的配置信息如下：**

 

拷贝代码

 

hbase.rootdir  
hdfs://localhost:9000/hbase

 

hbase.cluster.distributed  
true

 

保存hbase-site.xml文件，并退出vim编辑器。

 

**2. 创建一个HBase表  
∥ 启动Hadoop**  
因为HBase是伪分布式模式，需要调用HDFS，所以，需要首先切换到hadoop用户下,hadoop密码为hadoop@12#$，然后再在终端中输入下面命令启动Hadoop的HDFS：

 

拷贝代码  
su - hadoop  
cd /usr/local/hadoop  
./sbin/start-dfs.sh  
**∥ 启动HBase  
然后，执行如下命令启动HBase：**  
//启动HBase

 

拷贝代码  
cd /usr/local/hbase  
./bin/start-hbase.sh  
//启动HBase Shell

 

拷贝代码  
./bin/hbase shell  
**∥ 创建HBase表**  
如果里面已经有一个名称为student的表，请使用如下命令删除该表：

 

拷贝代码  
disable ‘student’  
拷贝代码  
drop ‘student’  
在HBase Shell中执行如下命令创建student表：

 

拷贝代码  
create ‘student’,‘info’  
首先录入student表的第一个学生记录

 

拷贝代码  
put ‘student’,‘1’,‘info:name’,‘Xueqian’  
拷贝代码  
put ‘student’,‘1’,‘info:gender’,‘F’  
拷贝代码  
put ‘student’,‘1’,‘info:age’,‘23’  
然后录入student表的第二个学生记录

 

拷贝代码  
put ‘student’,‘2’,‘info:name’,‘Weiliang’  
拷贝代码  
put ‘student’,‘2’,‘info:gender’,‘M’  
拷贝代码  
put ‘student’,‘2’,‘info:age’,‘24’  
**3. 配置Spark  
∥ 把HBase安装目录下的一些jar文件拷贝到Spark安装目录中**  
把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，命令如下：

 

拷贝代码  
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 ./  
拷贝代码  
cp /usr/local/hbase/lib/htrace-core-3.1.0-incubating.jar ./  
拷贝代码  
cp /usr/local/hbase/lib/protobuf-java-2.5.0.jar ./  
**4. 编写程序读取HBase数据  
∥ 新建一个代码文件SparkOperateHBase.scala**  
如果要让Spark读取HBase，就需要使用SparkContext提供的newAPIHadoopRDD这个API将表的内容以RDD的形式加载到Spark中。  
新建一个代码目录：  
#如果此前已经存在该目录则不用创建

 

拷贝代码  
cd /usr/local/spark  
mkdir mycode  
拷贝代码  
cd mycode  
mkdir hbase  
cd hbase  
mkdir -p src/main/scala  
cd src/main/scala  
vim SparkOperateHBase.scala  
在“/usr/local/spark/mycode/hbase/src/main/scala”目录下新建一个SparkOperateHBase.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)  
})  
}  
}  
**∥ 创建一个simple.sbt文件**  
可以利用sbt工具对SparkOperateHBase.scala代码文件进行编译打包，在执行打包命令之前，需要在“/usr/local/spark/mycode/hbase”目录下创建一个simple.sbt文件，并录入下面的内容：

 

拷贝代码  
name := “Simple Project”  
version := “1.0”  
scalaVersion := “2.11.8”  
libraryDependencies += “org.apache.spark” %% “spark-core” % “2.1.0”  
libraryDependencies += “org.apache.hbase” % “hbase-client” % “1.1.5”  
libraryDependencies += “org.apache.hbase” % “hbase-common” % “1.1.5”  
libraryDependencies += “org.apache.hbase” % “hbase-server” % “1.1.5”

 

**∥ 检查整个应用程序的文件结构**  
为了保证sbt能够正常运行，先执行如下命令检查整个应用程序的文件结构：

 

拷贝代码  
cd /usr/local/spark/mycode/hbase  
find .  
文件结构应该是类似如下的内容：  
.  
./src  
./src/main  
./src/main/scala  
./src/main/scala/SparkOperateHBase.scala  
./simple.sbt

 

**∥ 把整个应用程序打包成JAR包**  
接下来，我们可以通过如下代码将整个应用程序打包成JAR包：  
#一定把这个目录设置为当前目录

 

拷贝代码  
cd /usr/local/spark/mycode/hbase  
/usr/local/sbt/sbt package  
生成的应用程序JAR包的位置为“/usr/local/spark/mycode/hbase /target/scala-2.11/simple-project_2.11-1.0.jar”。

 

**∥ 使用spark-submit命令提交运行**  
由于文件打包时间较长，jar包已经提前保存在/home/user/Downloads/spark/hbase/1目录下，可以直接选取目录下文件提交

 

拷贝代码  
/usr/local/spark/bin/spark-submit --driver-class-path /usr/local/spark/jars/hbase/*:/usr/local/hbase/conf --class “SparkOperateHBase” /home/user/Downloads/spark/HBase/1/simple-project_2.11-1.0.jar

 

**5. 编写程序向HBase写入数据**  
∥ 新建一个代码文件SparkWriteHBase.scala  
在“/usr/local/spark/mycode/hbase/src/main/scala”目录下新建一个代码文件SparkWriteHBase.scala，并在其中输入如下代码：

 

拷贝代码  
import org.apache.hadoop.hbase.HBaseConfiguration  
import org.apache.hadoop.hbase.mapreduce.TableOutputFormat  
import org.apache.spark._  
import org.apache.hadoop.mapreduce.Job  
import org.apache.hadoop.hbase.io.ImmutableBytesWritable  
import org.apache.hadoop.hbase.client.Result  
import org.apache.hadoop.hbase.client.Put  
import org.apache.hadoop.hbase.util.Bytes  
object SparkWriteHBase {  
def main(args: Array[String]): Unit = {  
val sparkConf = new SparkConf().setAppName(“SparkWriteHBase”).setMaster(“local”)  
val sc = new SparkContext(sparkConf)  
val tablename = “student”  
sc.hadoopConfiguration.set(TableOutputFormat.OUTPUT_TABLE, tablename)  
val job = new Job(sc.hadoopConfiguration)  
job.setOutputKeyClass(classOf[ImmutableBytesWritable])  
job.setOutputValueClass(classOf[Result])  
job.setOutputFormatClass(classOf[TableOutputFormat[ImmutableBytesWritable]])  
//下面这行代码用于构建两行记录  
val indataRDD = sc.makeRDD(Array(“3,Rongcheng,M,26”,“4,Guanhua,M,27”))  
val rdd = indataRDD.map(_.split(“,”)).map{arr=>{  
//设置行键（row key）的值  
val put = new Put(Bytes.toBytes(arr(0)))  
//设置info:name列的值  
put.add(Bytes.toBytes(“info”),Bytes.toBytes(“name”),Bytes.toBytes(arr(1)))  
//设置info:gender列的值  
put.add(Bytes.toBytes(“info”),Bytes.toBytes(“gender”),Bytes.toBytes(arr(2)))  
//设置info:age列的值  
put.add(Bytes.toBytes(“info”),Bytes.toBytes(“age”),Bytes.toBytes(arr(3).toInt))  
//构建一个键值对，作为rdd的一个元素  
(new ImmutableBytesWritable, put)

 

rdd.saveAsNewAPIHadoopDataset(job.getConfiguration())  
}  
}  
**∥ 把整个应用程序打包成JAR包**  
接下来，我们可以通过如下代码将整个应用程序打包成JAR包：  
#一定把这个目录设置为当前目录

 

拷贝代码  
cd /usr/local/spark/mycode/hbase  
/usr/local/sbt/sbt package  
生成的应用程序JAR包的位置为“/usr/local/spark/mycode/hbase /target/scala-2.11/simple-project_2.11-1.0.jar”。

 

**∥ 使用spark-submit命令提交运行**  
由于文件打包时间较长，jar包已经提前保存在/home/user/Downloads/spark/HBase/2目录下，可以直接选取目录下文件提交

 

拷贝代码  
/usr/local/spark/bin/spark-submit --driver-class-path /usr/local/spark/jars/hbase/*:/usr/local/hbase/conf --class “SparkWriteHBase” /home/user/Downloads/spark/HBase/2/simple-project_2.11-1.0.jar  
∥ 在hbase-shell中查看HBase表记录是否发生变化  
上面Spark程序执行成功以后，切换到HBase Shell交互式环境中，执行如下命令查看student表：

 

拷贝代码  
scan ‘student’  
可以看到，两条记录已经被成功插入到student表中。

---
本页由 梦飞idc云平台（https://www.mfisp.com）提供。站点导航见 https://www.mfisp.com/llms.txt
