HBase
Hbase的引言
什麼是HBase
hbase是Apache 組織開源的頂級項目 distributed, scalable, big data store 產品
hbase是基於Hadoop的一個NoSQL產品 Column類型的NoSQL
hbase是Google BigTable的開源實現, 爬蟲爬取的網頁
hbase運行億級數據查詢時,效率可達到秒級,毫秒級 在線處理 實時的處理
NoSQL特點
1. 部分NoSQL In-Memory 內存型 (Redis)
2. Schema-Less NoSchema 弱格式 無格式
3. 杜絕表連接
4. 弱化事務,沒有事務 (Redis有事務,MongoDB(4.x 沒事務 4.x後有事務)
5. 搭建集羣方便
NoSQL分類
1. key value 類型 redis
2. document 類型 mongodb
3. column 類型 HBase Cassandra
4. 圖 類型 neo4j (金融 知識圖譜)
Hbase存儲的邏輯結構
mysql
t_user
HBase
多版本的好處:修改速度快,直接新增一條新數據,給舊數據標記墓碑
Hbase僞分佈式環境的搭建
Hmaster、 Hregionserver
1. linux服務器 ip 主機名 主機映射 防火牆 selinux ssh免密 jdk
2. hadoop安裝
2.1 解壓縮
2.2 6個配置文件
2.3 格式化
2.4 啓動進程
3. 安裝zookeeper
3.1 解壓縮
3.2 配置conf/zoo.cfg
3.3 創建臨時目錄 data ---> myid文件(集羣)
3.4 啓動服務
4. hbase的安裝
4.1 解壓縮hbase
4.2 hdfs上創建 /hbase文件夾
hbase_home/data/tmp文件夾
4.3 修改hbase相關的配置文件
env.sh
export HBASE_MANAGES_ZK=false
export JAVA_HOME=/usr/java/jdk1.7.0_71
hbase-site.xml
<property >
<name>hbase.tmp.dir</name>
<value>/opt/install/hbase-0.98.6-hadoop2/data/tmp</value>
</property>
<property >
<name>hbase.rootdir</name>
<value>hdfs://CentOSA:8020/hbase</value>
</property>
<property >
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>CentOSA</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/install/zookeeper-3.4.6</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
4.4 修改
regionservers文件
CentOSA
4.5 替換hbase相關hadoop的jar
4.6 啓動hbase
bin/hbase-daemon.sh start master
bin/hbase-daemon.sh start regionserver
4.7 網絡訪問
http://CentOS:60010
bin/hbase shell
Hbase的shell命令
1. help 幫助命令
help '命令名字'
2. hbase中數據庫的概念
namespace
2.1 顯示所有的數據庫
list_namespace
默認 default
hbase
2.2 顯示當前數據庫中所有的表
list_namespace_tables 'hbase'
2.3 創建一個數據庫
create_namespace 'test'
2.4 描述數據庫
describe_namespace 'test'
2.5 修改數據庫
alter_namespace
2.6 刪除數據庫
drop_namespace 'test'
3. 創建hbase中的表【重點】
3.1 基本的建表方式 【默認default庫中】
create 't1','cf1'
3.2 創建多個列簇【默認default庫中】
create 't1','cf1','cf2'
3.3 指定表所屬的數據庫
create 'test:t1','cf1'
3.4 詳細描述列簇的相關屬性
create 'test:t2',{NAME=>'cf1',VERSIONS=>2},{NAME=>'cf2'}
4. 描述表
describe 'test:t1'
5. 修改表
alter 'test:t2',{NAME=>'cf2',VERSIONS=>2}
6. 刪除表
disable 'test:t2'
drop 'test:t2'
7. 失效 生效表相關命令
enable disable
enable_all disable_all
is_enable is_disable
8. 判斷表是否存在
exists
9. 表的查找命令
list 'namespace:t.*'
10. 插入數據
put 't1',’rowkey‘,'family:qualify','value'
put 'namespace:t1',’rowkey‘,'family:qualify','value'
11. 刪除數據
delete 'namespace:t1' ,'rowkey','family:qualify','timestamp'
12. 全表掃描
scan '表名'
scan 'namespace:tb1', {STARTROW => '20170521_10001',STOPROW => '20170521_10003'}
scan 'test:user',{STARTROW=>'001',STOPROW=>'004'}
不包括stoprow的值
13. 某條數據的查詢
get 'test:user','001'
get 'test:user','001','base:name'
HBase 集羣搭建
1.時間同步集羣
CentOS 作爲時間同步服務器 主節點
1. yum install ntp 三臺機器
2. service ntpd start 三臺機器
chkconfig ntpd on
3. 服務器節點 主節點
ntpdate -u 202.112.10.36
vi /etc/ntp.conf
restrict 192.168.111.0 mask 255.255.255.0 nomodify notrap
# 中國這邊最活躍的時間服務器 : http://www.pool.ntp.org/zone/cn
server 210.72.145.44 perfer # 中國國家受時中心
server 202.112.10.36 # 1.cn.pool.ntp.org
server 59.124.196.83 # 0.asia.pool.ntp.org
# 允許上層時間服務器主動修改本機時間
restrict 210.72.145.44 nomodify notrap noquery
restrict 202.112.10.36 nomodify notrap noquery
restrict 59.124.196.83 nomodify notrap noquery
# 外部時間服務器不可用時,以本地時間作爲時間服務
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
service ntpd restart
4. client端
vi /etc/ntp.conf
server 192.168.111.41 #這裏指的是ntp服務的ip 192.168.206.130
restrict 192.168.111.41 nomodify notrap noquery
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
5. 三臺機器 service ntpd restart
6. 從節點同步主節點時間 ntpdate -u 192.168.184.16
adjust time server 192.168.19.10 offset -0.017552 sec
5. date命令查看處理結果
2.Hadoop集羣搭建
HDFS集羣
YARN集羣
3. Zookeeper集羣
1. 解壓縮
2. 創建數據文件夾
zookeeper_home/data
3. 修改配置文件
conf/zoo.cfg
dataDir
server.0
4. 在data文件夾中創建 myid文件 0 1 2
5. 啓動服務
4. HBase集羣
1. 準備:hbase_home data/tmp logs目錄中的內容清空
hdfs 上面 hbase目錄清空
2. 修改hbase_home/conf/hbase-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_71
export HBASE_MANAGES_ZK=false
3. hbase-site.xml
<property >
<name>hbase.tmp.dir</name>
<value>/opt/install/hbase-0.98.6-hadoop2/data/tmp</value>
</property>
<property >
<name>hbase.rootdir</name>
<value>hdfs://CentOSA:8020/hbase</value>
</property>
<property >
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>CentOSA,CentOSB,CentOSC</value>
</property>
4. regionservers
CentOSA
CentOSB
CentOSC
5. 啓動hbase
bin/hbase-daemon.sh start master
bin/hbase-daemon.sh start regionserver
HBase JAVA API
# java訪問HBase的核心API
Configruation HBase相關的配置
Htable HBase中的表
Put 插入數據
Get 查詢數據
Scan 掃描數據
BytesUtil 字節處理
Maven依賴
<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>0.98.6-hadoop2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-server -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>0.98.6-hadoop2</version>
</dependency>
方法
對象 | 作用 | 基本用法 |
---|---|---|
Configruation | Hbase相關的配置文件 | conf.set(“key”,“value”); |
HTable | Hbase中的表 | 表相關的操作都是HTable完成 |
Put | HBase中插入數據 | Put put = new Put(rowkey) put.add HTable.put(put) |
Delete | HBase中的刪除操作 | Delete delete = new Delete(rowkey) HTable.delete(delete) |
Get | HBase查詢單條數據 | Get get = net Get(rowkey) HTable.get(get) —> Result |
Result | 單行數據 | Result – Cells — Cell — cloneFamily cloneQualify cloneValue |
Scan | 表的掃描 | ResultScanner —> Result |
HBase中的過濾器
-
行鍵相關的過濾器
1.比較行鍵值的大小 Filter filter1 = new RowFilter(CompareFilter.CompareOp.GREATER, new BinaryComparator(Bytes.toBytes("0003"))); scan.setFilter(filter1); 2. 比較行鍵按照特定的規則設計 Filter filter1 = new PrefixFilter(Bytes.toBytes("000")); scan.setFilter(filter1);
-
列簇相關的篩選
1. 只要base列簇相關的數據 Filter filter1 = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("base"))); scan.setFilter(filter1);
-
限定符相關篩選
Filter filter1 = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("age"))); scan.setFilter(filter1);
-
值的篩選
Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("1") ); scan.setFilter(filter);
-
列簇中的數據進行篩選
SingleColumnValueFilter filter = new SingleColumnValueFilter( Bytes.toBytes("base"), Bytes.toBytes("sex"), CompareFilter.CompareOp.EQUAL, new SubstringComparator("male")); filter.setFilterIfMissing(true); //filter.setFilterIfMissing(false); //符合要求的數據 password=123456 //column 中不包含password限定符 查詢出來 scan.setFilter(filter); //同時要排除password 限定符 SingleColumnValueExcludeFilter filter = new SingleColumnValueExcludeFilter( Bytes.toBytes("base"), Bytes.toBytes("password"), CompareFilter.CompareOp.NOT_EQUAL, new SubstringComparator("66666")); filter.setFilterIfMissing(true); //filter.setFilterIfMissing(false); //符合要求的數據 password=123456 //column 中不包含password限定符 查詢出來 scan.setFilter(filter);
-
FilterList
設置多個過濾器 同時生效 FilterList filterList = new FilterList(); Filter filter1 = new PrefixFilter(Bytes.toBytes("000")); SingleColumnValueFilter filter2 = new SingleColumnValueFilter( Bytes.toBytes("base"), Bytes.toBytes("password"), CompareFilter.CompareOp.EQUAL, new SubstringComparator("123456")); filter2.setFilterIfMissing(true); filterList.addFilter(filter1); filterList.addFilter(filter2); scan.setFilter(filterList);
HBase中列簇相關的屬性
1. 創建HBase表
create 'table_name',{NAME=>'',VERSIONS=>''}
2. Hbase列簇的常見屬性
# 列簇的名字
NAME='xxxxx'
# 列簇對應限定符 能存幾個版本的數據
VERSIONS => '1'
# TTL Time To Live
指定的是cell中的數據,存儲在HBase中的存活時間 'FOREVER'
TTL => 100
# 指定HBase上存儲的數據 是否 啓動壓縮
COMPRESSION => 'NONE'
COMPRESSION => 'snappy'
# 列簇中的數據,存儲在內存中,提高查詢效率 (默認關閉)
IN_MEMORY => 'false’
# 緩存 列簇部分數據,從而提高查詢效率
BLOCKCACHE => 'true'
# Block是列簇中存儲數據的最小單位
BLOCKSIZE => '65536'
調整大 順序查詢 需求高
調整小 隨機查詢 需求高
# 提高查詢效率
BLOOMFILTER 布隆過濾
HBase 體系結構
1.RegionServer
2. HMaster作用
1. HRegionServer 集羣是否健康
2. Region---RegionServer分配
3. 新Region加入後,負載均衡
3. Zookeeper作用 【重點】
1. 管理HMaster的高可用
2. 存儲了HBase中非常重要的信息 meta信息
rowkey 範圍 ---- region ---- RegionServer(健康)
4. HBase compact 和 split
RowKey設計
1. HBase相關的查詢操作,95%上都是對RowKey查詢。
2. 設計過程
2.1 複合
2.2 查詢內容作爲rowkey組成
3. rowkey 64K 10--100字節唯一
4. rowkey結合自己的實際需求
4.1 區域查詢多,建議 rowkey 連續
4.4 區域查詢少,散列 hash ---> 加密、UUID
System.out.println(UUID.randomUUID().toString());
String rowkey = "xx_male_001";
String result = DigestUtils.md5Hex(rowkey);
System.out.println(result);