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