① hbase怎麼用
HBase安裝及簡單使用
通過之前的hadoop0.20.2的安裝並調試成功,接下來我們繼續安裝hbase0.90.5。在安裝hbase0.90.5之前,因為hbase0.90.5隻支持jdk1.6,所以,我把之前的jdk1.8卸載,重新安裝了jdk1.6。
第一步:
首先需要下載hbase0.90.5.tar.gz,並解壓到/home/hadoop/的目錄下,同時將目錄修改為hbase0.90.5
第二步:
替換hadoop核心jar包,主要母的是防止hbase和hadoop版本不同出現兼容問題,造成hmaster啟動異常
將hbase0.90.5/lib目錄中的hadoop-core-0.20-append-r1056497.jar包進行備份後刪除,再將/home/hadoop/hadoop下面的hadoop-0.20.2-core.jar賦值到/home/hadoop/hbase0.90.5目錄下即可
第三步:
編輯配置文件
①/home/hadoop/hbase0.90.5/conf/hbase-env.sh
我們對行鍵'1001'中列族info的列名age賦值24(1001:info:age=>24),插入兩次,會將最後一次的值進行合並,其中,用時間戳來區分。從圖片中的時間戳不同可以看出保存的是最後一次put的內容。
② HBase存儲架構
上圖是HBase的存儲架構圖。
由上圖可以知道,客戶端是通過Zookeeper找到HMaster,然後再與具體的Hregionserver進行溝通讀寫數據的。
具體到物理實現,細節包括以下這些:
首先要清楚HBase在hdfs中的存儲路徑,以及各個目錄的作用。在hbase-site.xml 文件中,配置項 <name> hbase.rootdir</name> 默認 「/hbase」,就是hbase在hdfs中的存儲根路徑。以下是hbase0.96版本的個路徑作用。1.0以後的版本請參考這里: https://blog.bcmeng.com/post/hbase-hdfs.html
1、 /hbase/.archive
HBase 在做 Split或者 compact 操作完成之後,會將 HFile 移到.archive 目錄中,然後將之前的 hfile 刪除掉,該目錄由 HMaster 上的一個定時任務定期去清理。
2、 /hbase/.corrupt
存儲HBase損壞的日誌文件,一般都是為空的。
3、 /hbase/.hbck
HBase 運維過程中偶爾會遇到元數據不一致的情況,這時候會用到提供的 hbck 工具去修復,修復過程中會使用該目錄作為臨時過度緩沖。
4、 /hbase/logs
HBase 是支持 WAL(Write Ahead Log) 的,HBase 會在第一次啟動之初會給每一台 RegionServer 在.log 下創建一個目錄,若客戶端如果開啟WAL 模式,會先將數據寫入一份到.log 下,當 RegionServer crash 或者目錄達到一定大小,會開啟 replay 模式,類似 MySQL 的 binlog。
5、 /hbase/oldlogs
當.logs 文件夾中的 HLog 沒用之後會 move 到.oldlogs 中,HMaster 會定期去清理。
6、 /hbase/.snapshot
hbase若開啟了 snapshot 功能之後,對某一個用戶表建立一個 snapshot 之後,snapshot 都存儲在該目錄下,如對表test 做了一個 名為sp_test 的snapshot,就會在/hbase/.snapshot/目錄下創建一個sp_test 文件夾,snapshot 之後的所有寫入都是記錄在這個 snapshot 之上。
7、 /hbase/.tmp
當對表做創建或者刪除操作的時候,會將表move 到該 tmp 目錄下,然後再去做處理操作。
8、 /hbase/hbase.id
它是一個文件,存儲集群唯一的 cluster id 號,是一個 uuid。
9、 /hbase/hbase.version
同樣也是一個文件,存儲集群的版本號,貌似是加密的,看不到,只能通過web-ui 才能正確顯示出來
10、 -ROOT-
該表是一張的HBase表,只是它存儲的是.META.表的信息。通過HFile文件的解析腳本 hbase org.apache.hadoop.hbase.io.hfile.HFile -e -p -f 可以查看其存儲的內容,如下所示:
以上可以看出,-ROOT-表記錄的.META.表的所在機器是dchbase2,與web界面看到的一致:
11、 .META.
通過以上表能找到.META.表的信息,該表也是一張hbase表,通過以上命令,解析其中一個region:
以上可以看出,adt_app_channel表的數據記錄在dchbase3這台reginserver上,也與界面一致,如果有多個region,則會在表名後面加上rowkey的范圍:
通過以上描述,只要找到-ROOT-表的信息,就能根據rowkey找到對應的數據,那-ROOT-在哪裡找呢?從本文一開始的圖中可以知道,就是在zookeeper中找的。進入zookeeper命令行界面:
可以看出-ROOT-表存儲在 dchbase3 機器中,對應界面如下:
以上就是HBase客戶端根據指定的rowkey從zookeeper開始找到對應的數據的過程。
那在Region下HBase是如何存儲數據的呢?
以下就具體操作一張表,查詢對應的HFile文件,看HBase的數據存儲過程。
在HBase創建一張表 test7,並插入一些數據,如下命令:
查看wal日誌,通過 hbase org.apache.hadoop.hbase.regionserver.wal.HLog --mp -p 命令可以解析HLog文件,內容如下:
查看HFile文件,內容如下:
由此可見,HFile文件就是存儲HBase的KV對,其中Key的各個欄位包含了的信息如下:
由於hbase把cf和column都存儲在HFile中,所以在設計的時候,這兩個欄位應該盡量短,以減少存儲空間。
但刪除一條記錄的時候,HBase會怎麼操作呢?執行以下命令:
刪除了rowkey為200的記錄,查看hdfs,原來的HFile並沒有改變,而是生成了一個新的HFile,內容如下:
所以在HBase中,刪除一條記錄並不是修改HFile裡面的內容,而是寫新的文件,待HBase做合並的時候,把這些文件合並成一個HFile,用時間比較新的文件覆蓋舊的文件。HBase這樣做的根本原因是,HDFS不支持修改文件。
③ HBase中顯示表的指令是
進入hbase shell命令界面:hbase shell
2. 查看錶格:list
3. 查看所有命令:help
4. 創建表格(如果不記得命令格式 可以直接輸入create 系統會給出提示和示例):create 'test','f1','f2','f3'
創建了一個表名為test 有f1 f2 f3三個列族的表
5. 查看錶格結構信息:desc 'test'
④ hbase 數據遷移
hbase snapshot數據遷移問題
不需要提前建表,分區也會自動同步
HBase自身也提供了ExportSnapshot的方法可以從HDFS文件層基於某個快照快速的導出HBase的數據,並不會對RegionServer造成影響,但該源生的方法不支持增量
1、在源集群執行
snapshot 'src_table', 'snapshot_src_table'
snapshot的流程主要有三個步驟
加鎖: 加鎖對象是regionserver的memstore,目的是禁止在創建snapshot過程中對數據進行insert,update,delete操作
刷盤:刷盤是針對當前還在memstore中的數據刷到HDFS上,保證快照數據相對完整,此步也不是強制的,如果不刷會,快照中數據有不一致風險
創建指針: snapshot過程不拷貝數據,但會創建對HDFS文件的指針,snapshot中存儲的就是這些指針元數據
2、在源集群執行,屬於推送方式,在目標集群執行數據拉取方式
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot test_snap --from hdfs://HDFS80386/hbase --to hdfs://shyt-hadoop-4031.xx.com.cn:8020/apps/hbase/data -mappers 20 -bandwidth 5
3、在目標集群執行使用hbase用戶
disable 'dalishen:bbs_member'
restore_snapshot 'bbs_member_snap'
使用restore命令在目標集群自動新建表,以及與archive里的HFile建立link
執行該步驟的時候,可能會遇到許可權問題,需要賦許可權
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=hbase, access=WRITE, inode="/apps/hbase/data/archive/data/dalishen/bbs_member//f/.links-":hadoop:hdfs:drwxr-xr-x
源集群
groups hadoop hdfs 可以發現導入的是源集群的許可權
所以需要賦許可權
hdfs dfs -chmod -R 777 /apps/hbase/data/archive/data/dalishen/bbs_member/
enable 'dalishen:bbs_member'
不需要提前建表,分區也會自動同步,支持增量備份,需要指定要備份的時間范圍
Table也是屬於HBase數據遷移的工具之一,以表級別進行數據遷移。Table的本質也是利用MapRece進行同步的,與DistCp不同的時,它是利用MR去scan 原表的數據,然後把scan出來的數據寫入到目標集群的表。這種方式也有很多局限,如一個表數據量達到T級,同時又在讀寫的情況下,全量scan表無疑會對集群性能造成影響。
1.3->1.1 高到低版本 不需要提前建表,分區也會自動同步
檢查是否開啟同步
echo "list_replicated_tables" | hbase shell -n |grep dalishen:app_deviceid
沒有的話執行
enable_table_replication 'tname'
1.源集群hadoop查詢數據量,如太大先別遷移超過5000w
hbase org.apache.hadoop.hbase.maprece.RowCounter 'dalishen:app_deviceid'
2.源集群上執行 替換表名
hbase org.apache.hadoop.hbase.maprece.CopyTable -Dhbase.client.scanner.caching=1000 -Dmapred.map.tasks.speculative.execution=false -D maprece.task.timeout=6000000 --families=f:f --peer.adr=10.52.24.42:2181:/hbase-unsecure --new.name=dalishen:app_deviceid dalishen:app_deviceid
3.目標集群上執行數據量對比下
hbase org.apache.hadoop.hbase.maprece.RowCounter 'dalishen:app_deviceid'
4.指定時間戳進行增量同步
hbase org.apache.hadoop.hbase.maprece.CopyTable -Dhbase.client.scanner.caching=1000 -Dmapred.map.tasks.speculative.execution=false -D maprece.task.timeout=6000000 --starttime=1600792683760 --endtime=1600792684760 --families=f:f --peer.adr=172.18.12.7:2181:/hbase --new.name=testwang testwang
在源集群進入hbase shell
1、 add_peer '1', 'shyt-hadoop-4032.xxx.com.cn,shyt-hadoop-4031.xxx.com.cn,shyt-hadoop-4030.xxx.com.cn:2181:/hbase-unsecure'
2、修改REPLICATION_SCOPE屬性=1,全局模式,此數據會被復制給所有peer
alter 'testwang',{NAME => 'f' ,REPLICATION_SCOPE => '1'}
3、hbase(main):006:0> enable_table_replication 'testwang'
0 row(s) in 0.0860 seconds
The replication swith of table 'testwang' successfully enabled
驗證在源集群 put 'testwang','1005','f:name','1005'
在目標集群 get 'testwang','1005'
校驗數據量:通count
hbase org.apache.hadoop.hbase.maprece.RowCounter 'testwang'
查看同步狀態: status 'replication'
建議大表先進行snapshot方式同步,然後再利用進行增量數據同步,小表直接 table數據遷移,最後配置hbase replication peer實時同步