BigBrother的大数据之旅Day 12 Hbase(1)
HBASE (Hadoop Database)是個高可用,高性能, 面向列可伸縮、實時讀寫的分布式數據庫
Hadoop HDFS作為其文件存儲系統,利用Hadoop MapReduce來處理HBase中的海量數據,利用Zookeeper作為其分布式協同服務
1 hbse的表結構
| 11248112 | t6 | CF2:q1=val1 | CF3:q3=val3 | |
| t3 | ||||
| t2 | CF1:q2=val2 |
l RowKey
是Byte array,是表中每條記錄的“主鍵”,Rowkey的設計非常重要;
l Timestamp
版本號,類型為Long,默認值是系統時間戳,可由用戶自定義
l ColumnFamily
列族,擁有一個名稱(string),包含一個或者多個相關列
l Column
屬于某一個列族,格式為:familyName:columnName,每條記錄可動態添加
l Value(Cell)
單元格由行鍵、列族、列、 時間戳唯一決定(默認保存3個時間戳記錄)
單元格的數據是沒有類型的,全部以字節碼形式存儲
2 hbase的架構及其組件和作用
(1) client 是用戶端的接口,保存cache
(2) zookeeper分布式調度框架, 集群搭建使用了zookeeper的配置元數據功能(存儲HBase的schema和table元數據),是一個進程通知其他進程需要做什么的一種常用方式.ZooKeeper使用共享存儲模型來實現應用間的協作和同步原語。
zookeeper 存貯所有Region的尋址入口。
(3) Hmaster
a 為 regionServer分配region,
b 負責regionserver的負載均衡,
c 發現失效端regionserver后,重新分配其上的region
d 管理用戶對table端增刪改查
(4)region server
多個regionserver合為一個regionserver集群(Cluster)
a 維護region處理region端IO請求
b 負責切分在運行過程中變得過大的region
(5) region
hbase的表分為多個region(橫著把表切開)
ps : 數據是連續的
region裂變: region不斷增大,當增大到一個閾值端時候就會分割為兩個region
(6) store 分為memstore(1個)和storefile(0-n個)
a 一個store對應一個列族(豎著切行)
b 首先向memstore中存儲數據,當數據到達一定閾值時,flash cache把數據寫到storefile中(每次都是一個單獨的文件)
c n個storefile合并為一個文件,分為大合并和小合并,大合并期間會刪除多余的數據,平常只會在數據上添加墓碑標記,進行邏輯刪除
總之 region server cluster >> region server >> region>> store
3 詳述hbase的讀寫流程
寫流程:
(1) client 通過zookeeper的調度向regionserver發送請求
(2) 數據首先寫入hlog和memstore(key排序)
(3)當memstroe中數據到達一定閾值時,flush(單獨的一個線程)到storefile(只讀文件)
(4)多個storefile文件合并為大的storefile文件
(5)單個StoreFile大小超過一定閾值后,觸發Split操作,把當前Region Split成2個新的Region。父Region會下線,新Split出的2個子Region會被HMaster分配到相應的RegionServer上,使得原先1個Region的壓力得以分流到2個Region上。
讀操作
client–>Zookeeper–>-ROOT-表(好像0.96版本后就取消了)–>.META.表(內存表,存放在regionserver上)–>RegionServer–>Region–>client
(1) client訪問zk,查找root表,得到.meta表的信息(region元數據)
(2) 從.meta表中找到目標region信息,找到對應端regionserver
(3) 獲取數據 優先級為 blockcache > memstore> storefile
如果blockcache中沒有查詢到的結果,會把最后讀取的結果存放到cache中(前提是讀到了數據)
4 hbase集群搭建步驟
(1)copy hbase-0.98.12.1-hadoop2-bin.tar.gz到HBASE主節點
(2)解壓文件到 /usr/local/hbase(記得創建hbase目錄)
tar zxvf hbase-0.98.12.1-hadoop2-bin.tar.gz -C /usr/local/hbase
(3) 配置環境變量
/usr/local/hbase/hbase-0.98.12.1-hadoop2/conf下
? a: hbase-env.sh中設置HBASE_MANAGES_ZK為false – 不使用hbase自帶的zookeeper,使用自己的zookeeper集群
? b: 配置java_home
export JAVA_HOME=/usr/java/jdk1.7.0_80
export HBASE_MANAGES_ZK=false
(4) 配置hbse-site.xml文件
/usr/local/hbase/hbase-0.98.12.1-hadoop2/conf
<configuration><property><name>hbase.rootdir</name><value>hdfs://mycluster/hbase</value></property><property><name>hbase.zookeeper.quorum</name><value>node2,node3,node4</value></property><property><name>hbase.zookeeper.property.dataDir</name><value>/var/bjsxt/hbase/zookeeper</value></property><property><name>hbase.cluster.distributed</name><value>true</value></property> </configuration>(5) 配置backup節點
在/usr/local/hbase/hbase-0.98.12.1-hadoop2/conf下
創建backup-master文件,并寫入
node2 – node2 為backup節點,將來會在機器上開啟從master進程
(6) 配置regionserver節點
在/usr/local/hbase/hbase-0.98.12.1-hadoop2/conf下
vim regionservers 寫入
node2 node3 node4(7) copy hdfs-site.xml文件到hbase的conf下
(8) scp hbse到每個節點(node2,node3,node4)
(9) 在每個node的profile文件中加入hbase的位置環境變量
export HBASE_HOME=/usr/local/hbase/hbase-0.98.12.1-hadoop2 export PATH=$PATH:$HBASE_HOME/bin記得要source一下這個文件哦
(10) 在bin下面有開啟和關閉的腳本
(11) 通過瀏覽器測試訪問[外鏈圖片轉存失敗
(12) 命令行訪問
5 列出hbase的基本操作
| 創建表 | create ‘表名’, ‘列族名1’[,…] |
| 查看所有表 | list |
| 添加記錄 | put ‘表名’, ‘RowKey’, ‘列族名稱:列名’, ‘值’ |
| 查看記錄 | get ‘表名’, ‘RowKey’, ‘列族名稱:列名’ |
| 查看表中的記錄總數 | count ‘表名’ |
| 刪除記錄 | delete ‘表名’ , ‘RowKey’, ‘列族名稱:列名’ |
| 刪除一張表 | 先要屏蔽該表,才能對該表進行刪除。 第一步 disable ‘表名稱’ 第二步 drop ‘表名稱’ |
| 查看所有記錄 | scan '表名" ’ --慎用如果表數據多的話 |
6 列出hbase的java api基本操作
//conf為配置文件,添加了zookeeper的地址 //創建一個數據庫級的對象 admin = new HBaseAdmin(conf) //創建表級的對象,tm為表的名稱 table = new HTable(conf,tm.getBytes())//表級操作 //判斷tm表是否存在 admin.tableExists(tm) //把tm表置為無效 admin.disableTable(tm) //刪除表,首先需要把表置為無效 admin.deleteTable(tm) //創建表 admin.createTable(tm)//行級操作 //寫操作 //1 創建行級操作的對象put,并指定rowkey Put put = new Put("001rowkey".getBytes()); //2 要插入的每一列的值 //cf列族名,name為列名,zs是值 put.add("cf".getBytes(),"name".getBytes()),"zs".getBytes()); //3 寫入表 table.put(put);//讀操作 get和scan // ----get---- //1 創建讀取行對象get,并指定rowkey Get get = new Get("001rowkey".getBytes()); //2 指定需要查詢的列族和列 // 添加要獲取的列和列族,減少網絡的io,相當于在服務器端做了過濾 get.addColumn("cf".getBytes(),"name".getBytes()); //3 查詢的返回值 Result result = table.get(get); //4 獲取查詢的單元結果 Cell cel1 = result.getColumnLatestCell("cf".getBytes(),name.getBytes()); //5 輸出結果 System.out.print(Bytes.toString(CellUtil.cloneValue(cel1)))//------scan-------- //1 創建對象,并指定rowkey Scan scan = new Scan(); //從rowkey1111掃描到rowkey1112不包含1113 scan.setStarRow("1111".getBytes()); scan.setStopRow("1113".getBytes()); //2 設置查詢的列族和列 scan.addColumn("cf".getBytes(),"name".getBytes()); //3 用結果接收一下 ResultScanner rss = table.getScanner(scan); //4 遍歷結果集 for (Result result : rss) {List<Cell> cellsName = result.getColumnCells("cf".getBytes(), "name".getBytes());for (Cell cell : cellsName) {//5 輸出結果System.out.print("\t\t" + Bytes.toString(CellUtil.cloneValue(cell)));}System.out.println(); //其他api scan相關 addFamily指定要掃描列族中的所有列 setTimeRange指定要獲取的列的timestamp范圍 setTimestamp指定要獲取列值的timestamp setMaxVersions指定要獲取的列值的版本數 setBatch限制next()方法返回的值的最大數量 setFilter指定過濾器 setCacheBlocks(boolean)顯式指定禁用本次掃描服務端的block緩存 使用完畢后不要忘了,關閉admin哦 admin.close();參考
版權聲明:本文參考圖片為CSDN博主「山上的神仙」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u011833033/article/details/79773421
總結
以上是生活随笔為你收集整理的BigBrother的大数据之旅Day 12 Hbase(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TED演讲分类整理
- 下一篇: 怎么取消吃鸡的记住计算机,电脑系统小知识