Hbase優化

一:高可用

1):關閉集羣 node

  stop-hbase.sh算法

2):在conf目錄下建立 backup-masters 文件數組

  touch backup-masters緩存

3):backup-masters文件中配置高可用 HMaster 節點服務器

  echo k200 > backup-masterssession

4):將整個 conf 目錄 scp 到其餘節點app

  scp -r /soft/hive/conf/ k200:/soft/hive/
less

5):打開頁面測試函數

二:Hadoop 的通用性優化

1):NameNode 元數據備份使用 SSD oop

2):定時備份NameNode 上的元數據

  經過定時任務複製元數據目錄便可

3):爲 NameNode 指定多個元數據目錄

  使用 dfs.name.dir 或者 dfs.namenode.name.dir 指定。這樣能夠提供元數據的冗餘和健壯性,以避免發生故障。

4):NameNode的dir自恢復

  設置 dfs.namenode.name.dir.restore 爲 true,容許嘗試恢復以前失敗的dfs.namenode.name.dir目錄,在建立 checkpoint時作此嘗試,若是設置了多個磁盤,建議容許。

5):HDFS保證 RPC 調用會有較多的線程數

  hdfs-site.xml:

  屬性:dfs.namenode.handler.count

  解釋:該屬性是 NameNode 服務默認線程數,默認值爲10,根據機器的可用內存能夠調整爲 50~100

  屬性:dfs.datanode.handler.count

  解釋:該屬性是 DataNode 的處理線程數,默認值爲10,若是 HDFS客戶端程序讀寫請求比較多,能夠調高到 15~20,設置的值越大,內存消耗越多。通常業務中5~10便可。

6):HDFS副本數的調整

  hdfs.site.xml

  屬性:dfs.replication

  解釋:若是數據量巨大,且不是很是之重要,能夠調整爲 2~3,若是數據很是重要,能夠調整爲3~5.

7):HDFS文件快大小的調整

  hdfs-site.xml

  屬性:dfs.blocksize

  解釋:塊大小定義,該屬性應該根據存儲的大量的單個文件大小來設置,若是大量的單個文件都小於 100M,建議設置成 64M 塊大小,對於大於 100M 或者達到 GB 的這種狀況,建議

設置成 256M,通常設置範圍波動在 64M~256M 之間。

8):MapReduce Job 任務服務線程數調整

  mapred-site.xml

  屬性:mapreduce.jobtracker.handler.count

  解釋:該屬性是Job任務線程數,默認值爲10,根據機器的可用內存能夠調整爲50~100

9):Http 服務工做線程數

  mapred-site.xml

  屬性:mapreduce.tasktracker.http.threads

  解釋:定義HTTP 服務器工做線程數,默認值爲40,對於大集羣能夠調整到80~100

 三:Linux優化

1):開啓文件系統的預讀緩存能夠提升讀取速度

  blockdev --setra 32768 /dev/sda 

  注意:ra 是readahead的縮寫

2):關閉進程睡眠池

  sysctl -w vm.swappiness=0

  即不容許後臺進程進入睡眠狀態,若是進程空閒,則直接 kill 掉 釋放資源

四:ZooKeeper 優化

1):優化Zookeeper 會話超時時間

  hdfs-site.xml

  參數:zookeeper.session.timeout

  解釋:In hbase-site.xml,setzookeeper.session.timeout to 30 seconds or less to less to bound failure detection(20~30 seconds is a good start).該值會直接關係到 master 發現服務器宕機的最大週期,默認值爲 30

  秒,若是該值太小,會在 HBase 在寫入大量數據發生而GC 時,致使RegionServer 短暫的不可用,從而沒有向 ZK 發送心跳包,最終致使認爲從節點 shutdown。

  通常 20 臺左右的集羣須要配置 5 臺zookeeper。

 

Hbase 優化 

一:預分區

將數據索要投放的分區提早大體的規劃好,以提升HBase 性能

hbase> create 'staff','info','partition1',SPLITS => ['1000','2000','3000','4000']

{NAME =>'info' ,COMPRESSION => 'SNAPPY' } ,SPLITS => ['1000', '2000' , '3000' , '4000' ]

2)  生成 16 進制序列預分區

  create 'staff2','info','partition2',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}

3)   按照文件中設置的規則預分區

4)  使用 JavaAPI 建立預分區

//自定義算法,產生一系列 Hash 散列值存儲在二維數組中

byte[][] splitKeys = 某個散列值函數

//建立 HBaseAdmin 實例

HBaseAdmin hAdmin = new HBaseAdmin(HBaseConfiguration.create());

//建立 HTableDescriptor 實例

HTableDescriptor tableDesc = new HTableDescriptor(tableName);

//經過 HTableDescriptor 實例和散列值二維數組建立帶有預分區的HBase 表

hAdmin.createTable(tableDesc, splitKeys);

二: RowKey 設計

一條數據的惟一標識就是 rowkey,那麼這條數據存儲於哪一個分區,取決於 rowkey 處於哪一個一個預分區的區間內,設計 rowkey 的主要目的 ,就是讓數據均勻的分佈於全部的 region中,在必定程度上防止數據傾斜。

相關文章
相關標籤/搜索