Hadoop生態圈-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. 行鍵相關的過濾器

    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);
    
  2. 列簇相關的篩選

    1. 只要base列簇相關的數據
    Filter filter1 = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new
                    BinaryComparator(Bytes.toBytes("base")));
    
    scan.setFilter(filter1);
    
  3. 限定符相關篩選

    Filter filter1 = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new
    BinaryComparator(Bytes.toBytes("age")));
    
    scan.setFilter(filter1);
    
  4. 值的篩選

    Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("1") );
    
    scan.setFilter(filter);
    
  5. 列簇中的數據進行篩選

    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);
    
  6. 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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章