讀寫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用戶下,[email protected]#$,然后再在終端中輸入下面命令啟動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用戶下,[email protected]#$,然后再在終端中輸入下面命令啟動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表中。