1. 程式人生 > >HBase入門詳解(三).md

HBase入門詳解(三).md

環境: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範圍進行預分割槽