HBase入門詳解(三)

個人博客原文鏈接

環境:centos7+hadoop3.0.3+hbase2.0.1+jdk8

HBase的MapReduce操作

注意事項:
* Map繼承TableMapper
* Reduce繼承TableReducer
* 最後Reduce輸出的value的類型是Mutation
* 通過TableMapReduceUtil來設置相關信息

實例:統計行鍵並添加到指定列族

public class RowCountMR extends Configured implements Tool {
    public static void main(String[] args) throws Exception {
        ToolRunner.run(new RowCountMR(), args);
    }

    @Override
    public int run(String[] args) throws Exception {
        // 設置配置信息
        Configuration conf = getConf();
        conf.set("hbase.zookeeper.quorum","hadoop5:2181");
        conf.set("hbase.master.dns.interface", "hadoop5");
        // 創建job對象
        Job job = Job.getInstance(conf,"xj_count");
        // 創建掃描對象
        Scan scan = new Scan();
        // 創建Map任務,傳入表名、scan、Mapper類、map輸出key類型、map輸出value類型、job
        TableMapReduceUtil.initTableMapperJob(conf.get("inpath"), scan, RCMapper.class, Text.class, IntWritable.class, job);
        // 創建Reduce對象,傳入表名、Reducer類、job
        TableMapReduceUtil.initTableReducerJob(conf.get("outpath"), RCReducer.class, job);
        // 提交任務
        job.waitForCompletion(true);
        return 0;
    }

    // 創建Map類繼承TableMapper
    public static class RCMapper extends TableMapper<Text,IntWritable>{
        @Override
        protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException {
            context.write(new Text("t"),new IntWritable(1));
        }
    }

    // 創建Reducer類繼承TableReducer
    public static class RCReducer extends TableReducer<Text, IntWritable, Text> {
        @Override
        protected void reduce(Text key, Iterable<IntWritable> value, Context context) throws IOException, InterruptedException {
            long l = 0;
            for (IntWritable v : value) {
                l+=v.get();
            }

            // 創建put對象並指定行健
            Put put = new Put(Bytes.toBytes("xj"));
            // 添加數據信息,列族,列名,值
            put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("count"), Bytes.toBytes(""+l));
            // 輸出的value是Mutation類型的
            context.write(key, put);
        }
    }
}

HBase的用戶權限控制

簡介:
R - 代表讀取權限
W - 代表寫權限
X - 代表執行權限
C - 代表創建權限
A - 代表管理權限

  1. 配置權限
    修改配置文件hbase-site.xml
    添加內容
    <property>
        <name>hbase.superuser</name>
        <value>hbase</value>
    </property>
    <property>
        <name>hbase.coprocessor.region.classes</name>
    <value>org.apache.hadoop.hbase.security.access.AccessController</value> 
    </property>
      <property>
        <name>hbase.coprocessor.master.classes</name>
        <value>org.apache.hadoop.hbase.security.access.AccessController</value>
      </property>
      <property>
        <name>hbase.rpc.engine</name>
        <value>org.apache.hadoop.hbase.ipc.SecureRpcEngine</value>
      </property>
    <property>
        <name>hbase.security.authorization</name>
        <value>true</value>
      </property>
    
  2. 授予權限
    給用戶’HBaseTest’授予所有權限
    grant 'HBasetest','RWXCA'
  3. 撤銷權限
    撤銷用戶’HBaseTest’所有權限
    revoke 'HBaseTest'
  4. 列出指定表的權限
    列出表’student’的所有權限
    user_permission 'student'

列族的高級配置

  1. 可配置的數據塊大小
    HFile數據塊大小可以放在列族層次設置,本質和hdfs數據塊不是一回事,是在hbase內部,把Hfile劃分成了塊,默認大小是64k。每個數據塊都會將索引值放入hfile中,塊越小那麼數據小,hfile中索引值越多佔用容量越大,帶來的效果是隨機訪問性能更好。如果每個數據塊體積變大,那麼hfile中索引值佔用容量越小,能讓更多的數據加載進入內存,從而提高順序訪問性能。
    create ‘mytable’,{NAME=>‘cf1’,BLOCKSIZE=>‘65536’}

  2. 數據塊緩存
    把數據放進讀緩存裏並不一定能提高效率,比如,一張表或者表中的列族,只是偶爾進行get和scan,那麼有無此緩存功能都無所謂,並不會提高效率。此外,再比如,如果一張表或者表中的列族,高頻率的進行scan操作,那麼會造成緩存濫用的情況,很有可能把真正能提高性能的數據排擠出緩存。爲了避免上述情況發生,可以關閉緩存功能,緩存功能默認是打開的。
    create ‘mytable’,{NAME=>‘cf1’,BLOCKCACHE=>‘false’}

  3. 激進緩存
    可以選擇一些列族,賦予他們在數據塊緩存中有更高的優先級,從而可以提高他們被緩存的概率,以及減小被從緩存中刪除的概率。要注意此屬性,除了讓此列族比其他列族更激進外無其他特殊功能。默認值爲false
    create ‘mytable’,{NAME=>‘cf1’,IN_MEMORY=>‘true’}

  4. 布隆過濾器
    布隆過濾器允許對存儲在每個數據塊的數據做一個反向測試,當某行被請求時,先檢查布隆過濾器,看看該行在不在這個數據塊中,返回結果不在或者 不確定在不在,那麼可以減少訪問block的次數,從而提高隨機訪問的效率
    布隆過濾器會佔用額外的內存空間,並且隨着表數據的增長而增長,當空間不是問題時,在數據量較大的情況下,布隆過濾器的性能尤爲突顯。
    create ‘mytable’,{NAME=>‘cf1’,BLOOMFILTER=>‘ROWCOL’}
    ROW只針對rowkey進行過濾,get提高效率,scan無影響
    ROWCOL指既針對rowkey也針對qualifier進行過濾,get提高效率, scan看情況,如果scan有針對列名在操作則提高效率,如果沒有則無影響

  5. 生存時間
    早於TTL值所指定時間的數據,會在下一次大合併時會被刪除。在同一個單元上的多個時間版本的數據也生效。 可以禁用,也可以設置值爲INT.MAX_VALUE 即永遠啓用,單位:秒。
    create ‘mytable’,{NAME=>‘cf1’,TTL=>‘18000’}

  6. 壓縮
    HFile可以被壓縮並存放在HDFS上,這有助於節省硬盤空間,但是讀寫壓縮數據會擡高CPU的利用率。推薦啓用壓縮,除非能確定壓縮不會帶來益處,或者CPU利用率有限制。
    Hbase有多種壓縮編碼,LZO,Snappy,GZIP前兩者是流行的兩種,但是LZO受版權影響需要單獨安裝,故常用Snappy。注意,數據只有在硬盤上是壓縮的,在內存中或者網絡傳輸時是沒有壓縮的。
    create ‘mytable’,{NAME=>‘cf1’,COMPRESSION=>‘SNAPPY’}

協處理器Coprocessor

簡介:
HBase變成數據處理工具
處理數據的壓力放在服務器端
給HBase添加新的行爲

  1. Observer
    Observer類似於傳統數據庫中的觸發器,當發生某些事件的時候這類協處理器會被Server端調用。Observer Coprocessor 就是一些散佈在HBaseServer端代碼中的hook鉤子,在固定的事件發生時被調用。比如:put操作之前有鉤子函數prePut,該函數在put操作執行前會被RegionServer調用;在put操作之後則有postPut鉤子函數
  2. EndPoint
    Endpoint協處理器類似傳統數據庫中的存儲過程,客戶端可以調用這些 Endpoint協處理器執行一段Server端代碼,並將Server端代碼的結果返回給客戶端進一步處理,最常見的用法就是進行聚合操作。

HBase的熱點效應

  1. 產生原因
    • row key單調遞增
    • 表採用默認分區
      檢索HBase的記錄首先要通過row key來定位數據行。當大量的client訪問HBase集羣的一個或少數幾個節點,造成少數Region Server的讀寫請求過多、負載過大,而其他Region S
      erver負載卻很小,就造成了“熱點”現象
  2. 解決方案
    • row key不採用單調遞增算法,可以採用隨機算法生成
    • 考慮數據分佈情況,合理安排row key範圍進行預分區
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章