读写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表中。