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 - 代表管理許可權
- 配置許可權
修改配置檔案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>
- 授予許可權
給使用者’HBaseTest’授予所有許可權
grant 'HBasetest','RWXCA'
- 撤銷許可權
撤銷使用者’HBaseTest’所有許可權
revoke 'HBaseTest'
- 列出指定表的許可權
列出表’student’的所有許可權
user_permission 'student'
列族的高階配置
-
可配置的資料塊大小 HFile資料塊大小可以放在列族層次設定,本質和hdfs資料塊不是一回事,是在hbase內部,把Hfile劃分成了塊,預設大小是64k。每個資料塊都會將索引值放入hfile中,塊越小那麼資料小,hfile中索引值越多佔用容量越大,帶來的效果是隨機訪問效能更好。如果每個資料塊體積變大,那麼hfile中索引值佔用容量越小,能讓更多的資料載入進入記憶體,從而提高順序訪問效能。 create ‘mytable’,{NAME=>‘cf1’,BLOCKSIZE=>‘65536’}
-
資料塊快取 把資料放進讀快取裡並不一定能提高效率,比如,一張表或者表中的列族,只是偶爾進行get和scan,那麼有無此快取功能都無所謂,並不會提高效率。此外,再比如,如果一張表或者表中的列族,高頻率的進行scan操作,那麼會造成快取濫用的情況,很有可能把真正能提高效能的資料排擠出快取。為了避免上述情況發生,可以關閉快取功能,快取功能預設是開啟的。 create ‘mytable’,{NAME=>‘cf1’,BLOCKCACHE=>‘false’}
-
激進快取 可以選擇一些列族,賦予他們在資料塊快取中有更高的優先順序,從而可以提高他們被快取的概率,以及減小被從快取中刪除的概率。要注意此屬性,除了讓此列族比其他列族更激進外無其他特殊功能。預設值為false create ‘mytable’,{NAME=>‘cf1’,IN_MEMORY=>‘true’}
-
布隆過濾器 布隆過濾器允許對儲存在每個資料塊的資料做一個反向測試,當某行被請求時,先檢查布隆過濾器,看看該行在不在這個資料塊中,返回結果不在或者 不確定在不在,那麼可以減少訪問block的次數,從而提高隨機訪問的效率 布隆過濾器會佔用額外的記憶體空間,並且隨著表資料的增長而增長,當空間不是問題時,在資料量較大的情況下,布隆過濾器的效能尤為突顯。 create ‘mytable’,{NAME=>‘cf1’,BLOOMFILTER=>‘ROWCOL’} ROW只針對rowkey進行過濾,get提高效率,scan無影響 ROWCOL指既針對rowkey也針對qualifier進行過濾,get提高效率, scan看情況,如果scan有針對列名在操作則提高效率,如果沒有則無影響
-
生存時間 早於TTL值所指定時間的資料,會在下一次大合併時會被刪除。在同一個單元上的多個時間版本的資料也生效。 可以禁用,也可以設定值為INT.MAX_VALUE 即永遠啟用,單位:秒。 create ‘mytable’,{NAME=>‘cf1’,TTL=>‘18000’}
-
壓縮 HFile可以被壓縮並存放在HDFS上,這有助於節省硬碟空間,但是讀寫壓縮資料會擡高CPU的利用率。推薦啟用壓縮,除非能確定壓縮不會帶來益處,或者CPU利用率有限制。 Hbase有多種壓縮編碼,LZO,Snappy,GZIP前兩者是流行的兩種,但是LZO受版權影響需要單獨安裝,故常用Snappy。注意,資料只有在硬碟上是壓縮的,在記憶體中或者網路傳輸時是沒有壓縮的。 create ‘mytable’,{NAME=>‘cf1’,COMPRESSION=>‘SNAPPY’}
協處理器Coprocessor
簡介: HBase變成資料處理工具 處理資料的壓力放在伺服器端 給HBase新增新的行為
- Observer Observer類似於傳統資料庫中的觸發器,當發生某些事件的時候這類協處理器會被Server端呼叫。Observer Coprocessor 就是一些散佈在HBaseServer端程式碼中的hook鉤子,在固定的事件發生時被呼叫。比如:put操作之前有鉤子函式prePut,該函式在put操作執行前會被RegionServer呼叫;在put操作之後則有postPut鉤子函式
- EndPoint Endpoint協處理器類似傳統資料庫中的儲存過程,客戶端可以呼叫這些 Endpoint協處理器執行一段Server端程式碼,並將Server端程式碼的結果返回給客戶端進一步處理,最常見的用法就是進行聚合操作。
HBase的熱點效應
- 產生原因
- row key單調遞增
- 表採用預設分割槽 檢索HBase的記錄首先要通過row key來定位資料行。當大量的client訪問HBase叢集的一個或少數幾個節點,造成少數Region Server的讀寫請求過多、負載過大,而其他Region S erver負載卻很小,就造成了“熱點”現象
- 解決方案
- row key不採用單調遞增演算法,可以採用隨機演算法生成
- 考慮資料分佈情況,合理安排row key範圍進行預分割槽