hbase性能优化2
為什么80%的碼農都做不了架構師?>>> ??
1)配置
??當你調用create方法時將會加載兩個配置文件:hbase-default.xml and hbase-site.xml,利用的是當前的java類路徑, 代碼中configuration設置的這些配置將會覆蓋hbase-default.xml和hbase-site.xml中相同的配置,如果兩個配置文件都存在并且都設置好了相應參上面的屬性下面的屬性即可
2)關于建表
? ?
public void createTable(HTableDescriptor desc)
HTableDescriptor?代表的是表的schema, 提供的方法中比較有用的有
setMaxFileSize,指定最大的regionsize
setMemStoreFlushSize?指定memstoreflush到HDFS上的文件大小
增加family通過 addFamily方法
??
public void addFamily(final HColumnDescriptor family)
HColumnDescriptor?代表的是column的schema,提供的方法比較常用的有
setTimeToLive:指定最大的TTL,單位是ms,過期數據會被自動刪除。
setInMemory:指定是否放在內存中,對小表有用,可用于提高效率。默認關閉
setBloomFilter:指定是否使用BloomFilter,可提高隨機查詢效率。默認關閉
setCompressionType:設定數據壓縮類型。默認無壓縮。
setMaxVersions:指定數據最大保存的版本個數。默認為3。
注意的是,一般我們不去setInMemory為true,默認是關閉的
3)關于入庫
? ?官方建議
table.setAutoFlush(false);//數據入庫之前先設置此項為false
table.setflushCommits();//入庫完成后,手動刷入數據
注意:
??在入庫過程中,put.setWriteToWAL(true/flase);
??關于這一項如果不希望大量數據在存儲過程中丟失,建議設置為true,如果僅是在測試演練階段,為了節省入庫時間建議設置為false
4)關于獲取表實例
HTablePool pool = new HTablePool(configuration, Integer.MAX_VALUE);
HTable table = (HTable) pool.getTable(tableName);
建議用表連接池的方式獲取表,具體池有什么作用,我想用過數據庫連接池的同學都知道,我就不再重復
不建議使用new HTable(configuration,tableName);的方式獲取表
5)關于查詢
建議每個查詢語句都放入try catch語句塊,并且finally中要進行關閉ResultScanner實例以及將不使用的表重新放入到HTablePool中的操作,具體做法如下
Java代碼
public static void QueryAll(String tableName) {? ?? ??
? ?? ???HTablePool pool = new HTablePool(configuration, Integer.MAX_VALUE);? ?? ??
? ?? ???HTable table = null;? ?? ??
? ?? ???ResultScanner rs = null;? ?? ??
? ?? ???try {? ?? ??
? ?? ?? ?? ?Scan scan = new Scan();? ?? ??
? ?? ?? ?? ?table = (HTable) pool.getTable(tableName);? ?? ??
? ?? ?? ?? ?rs = table.getScanner(scan);? ?? ??
? ?? ?? ?? ?for (Result r : rs) {? ?? ??
? ?? ?? ?? ?? ? System.out.println("獲得到rowkey:" + new String(r.getRow()));? ?? ??
? ?? ?? ?? ?? ? for (KeyValue keyValue : r.raw()) {? ?? ??
? ?? ?? ?? ?? ?? ???System.out.println("列:" + new String(keyValue.getFamily())? ?? ??
? ?? ?? ?? ?? ?? ?? ?? ?? ? + "====值:" + new String(keyValue.getValue()));? ?? ??
? ?? ?? ?? ?? ? }? ?? ??
? ?? ?? ?? ?}? ?? ??
? ?? ???} catch (IOException e) {? ?? ??
? ?? ?? ?? ?e.printStackTrace();? ?? ??
? ?? ???}finally{? ?? ??
? ?? ?? ?? ?rs.close();//?最后還得關閉? ?
? ?? ?? ?? ?pool.putTable(table); //實際應用過程中,pool獲取實例的方式應該抽取為單例模式的,不應在每個方法都重新獲取一次(單例明白?就是抽取到專門獲取pool的邏輯類中,具體邏輯為如果pool存在著直接使用,如果不存在則new)? ?
? ?? ???}? ?? ??
? ? }??
public static voidQueryAll(String tableName) {
? ? HTablePool pool = new HTablePool(configuration,Integer.MAX_VALUE);
? ? HTable table = null;
? ? ResultScanner rs = null;
? ? try {
? ?? ?Scan scan = new Scan();
? ?? ?table = (HTable) pool.getTable(tableName);
? ?? ?rs = table.getScanner(scan);
? ?? ?for (Result r : rs) {
? ?? ???System.out.println("獲得到rowkey:" + new String(r.getRow()));
? ?? ???for (KeyValue keyValue : r.raw()) {
? ?? ?? ? System.out.println("列:" + newString(keyValue.getFamily())
? ?? ?? ?? ???+ "====值:" + new String(keyValue.getValue()));
? ?? ???}
? ?? ?}
? ? } catch (IOException e) {
? ?? ?e.printStackTrace();
? ? }finally{
? ?? ?rs.close();//?最后還得關閉
? ?? ?pool.putTable(table); //實際應用過程中,pool獲取實例的方式應該抽取為單例模式的,不應在每個方法都重新獲取一次(單例明白?就是抽取到專門獲取pool的邏輯類中,具體邏輯為如果pool存在著直接使用,如果不存在則new)
? ? }
??}
更多精彩內容請關注:http://bbs.superwu.cn
關注超人學院微信二維碼:
轉載于:https://my.oschina.net/crxy/blog/419672
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的hbase性能优化2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [ JS 进阶 ] Ajax 详解 (2
- 下一篇: Markdown学习测试.md