HBase の基礎知識 (7): HBase パフォーマンス最適化例の完全解決

1. 高可用性

HBase では、HMaster は HRegionServer のライフ サイクルを監視し、RegionServer の負荷を分散する責任があります。HMaster がハングアップすると、HBase クラスター全体が異常な状態に陥り、このときの動作状態は長くは続かなくなります。したがって、HBase は HMaster の高可用性構成をサポートします。

1. HBase クラスターをシャットダウンします (オンになっていない場合は、この手順をスキップします)。

bin/stop-hbase.sh

2. conf ディレクトリにバックアップマスターファイルを作成します。

touch conf/backup-masters

3.バックアップマスターファイルで高可用性 HMaster ノードを構成する

echo hadoop103 > conf/backup-masters

4.conf ディレクトリ全体を他のノードに scp します。

scp -r conf/ 
--hadoop103:/opt/module/hbase/
scp -r conf/ 
--hadoop104:/opt/module/hbase/

5.ページを開いてテストして表示しますhttp://hadooo102:16010

 

2. 事前パーティショニング

各リージョンは StartRow と EndRow を保持しており、追加されたデータがリージョンが保持する RowKey 範囲と一致する場合、データはメンテナンスのためにこのリージョンに渡されます。この原則に従って、HBase のパフォーマンスを向上させるために、データを配置するパーティションを事前に大まかに計画できます。

1. 事前パーティショニングを手動で構成する

Hbase> create 'staff1','info','partition1',SPLITS =>  ['1000','2000','3000','4000'] 

2. 16 進シーケンスの事前パーティションを生成する

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

3.ファイルに設定されているルールに従って、事前パーティションにsplits.txtファイルを作成します。ファイルの内容は次のとおりです。

aaaa bbbb cccc dddd 

次に、以下を実行します。

create 'staff3','partition3',SPLITS_FILE => 'splits.txt' 

4.JavaAPIを使用して事前パーティションを作成する

//自定义算法,产生一系列 hash 散列值存储在二维数组中
byte[][] splitKeys = 某个散列值函数
//创建 HbaseAdmin 实例
HBaseAdmin hAdmin = new HBaseAdmin(HbaseConfiguration.create());
//创建 HTableDescriptor 实例
HTableDescriptor tableDesc = new HTableDescriptor(tableName);
//通过 HTableDescriptor 实例和散列值二维数组创建带有预分区的 Hbase 表
hAdmin.createTable(tableDesc, splitKeys);

3. 行キー

データの一意の識別子は RowKey になるように設計されているため、データがどのパーティションに格納されるかは、RowKey が事前にパーティション化された範囲に含まれるかによって決まります。 RowKey を設計する主な目的は、データをすべての領域に均等に分散させることです。 . データの偏りをある程度防ぐ。次に、RowKey の一般的に使用される設計ソリューションについて説明します。

1. 乱数、ハッシュ、ハッシュ値を生成する

比如:
原 本 rowKey 为 1001 的 , SHA1 后 变 成 :
dd01903921ea24941c26a48f2cec24e0bb0e8cc7
原 本 rowKey 为 3001 的 , SHA1 后 变 成 :
49042c54de64a1e9bf0b33e00245660ef92dc7bd
原 本 rowKey 为 5001 的 , SHA1 后 变 成 :
7b61dec07e02c188790670af43e717f0f46e8913
在做此操作之前,一般我们会选择从数据集中抽取样本,来决定什么样的 rowKey 来 Hash
后作为每个分区的临界值。

2. 文字列の反転

20170524000001 は 10000042507102 に変換されます。
20170524000002 は 20000042507102 に変換されます。

これにより、ある程度まで徐々に投入されるデータをハッシュ化することもできます。

3.文字列の連結

20170524000001_a12e 
20170524000001_93i7

4. メモリの最適化

HBase は動作中に多くのメモリ オーバーヘッドを必要とします。結局、Table はメモリにキャッシュできます。一般に、使用可能なメモリ全体の 70% が HBase の Java ヒープに割り当てられますただし、GC プロセスが長時間継続すると、RegionServer が長期間利用できない状態になるため、非常に大きなヒープ メモリを割り当てることはお勧めできません。通常、16 ~ 48G のメモリで十分です。システム メモリが十分な場合は、フレームワークが占有するメモリが多すぎるため、フレームワークが不十分な場合、フレームワークもシステム サービスが停止します。

5. 基本的な最適化

1. HDFS ファイルへのコンテンツの追加を許可する

hdfs-site.xml、hbase-site.xml

属性:dfs.support.append 
解释:开启 HDFS 追加同步,可以优秀的配合 HBase 的数据同步和持久化。默认值为 true。 

2. DataNode で許可されるオープン ファイルの最大数を最適化する

hdfs-site.xml

属性:dfs.datanode.max.transfer.threads 
解释:HBase 一般都会同一时间操作大量的文件,根据集群的数量和规模以及数据动作, 设置为 4096 或者更高。默认值:4096

3.待ち時間が長いデータ操作の待ち時間を最適化します。

hdfs-site.xml

属性:dfs.image.transfer.timeout 
解释:如果对于某一次数据操作来讲,延迟非常高,socket 需要等待更长的时间,建议把 该值设置为更大的值(默认 60000 毫秒),以确保 socket 不会被 timeout 掉。

4.データ書き込み効率の最適化

マップレッドサイト.xml

属性:
mapreduce.map.output.compress 
mapreduce.map.output.compress.codec 
解释:开启这两个数据可以大大提高文件的写入效率,减少写入时间。第一个属性值修改为 true,第二个属性值修改为:org.apache.hadoop.io.compress.GzipCodec 或者其 他压缩方式。

5.RPCリスナーの数を設定する

hbase-site.xml

属性:Hbase.regionserver.handler.count 
解释:默认值为 30,用于指定 RPC 监听的数量,可以根据客户端的请求数进行调整,读写 请求较多时,增加此值。

6.HStore ファイルサイズの最適化

hbase-site.xml

 属性:hbase.hregion.max.filesize 
 解释:默认值 10737418240(10GB),如果需要运行 HBase 的 MR 任务,可以减小此值, 因为一个 region 对应一个 map 任务,如果单个 region 过大,会导致 map 任务执行时间 过长。该值的意思就是,如果 HFile 的大小达到这个数值,则这个 region 会被切分为两 个 Hfile。

7。HBase クライアント キャッシュを最適化する

hbase-site.xml

属性:hbase.client.write.buffer 
解释:用于指定 Hbase 客户端缓存,增大该值可以减少 RPC 调用次数,但是会消耗更多内 存,反之则反之。一般我们需要设定一定的缓存大小,以达到减少 RPC 次数的目的。

8. HBaseで取得した行数をスキャンするにはscan.nextを指定します。

hbase-site.xml

属性:hbase.client.scanner.caching 
解释:用于指定 scan.next 方法获取的默认行数,值越大,消耗内存越大。 

9. フラッシュ、コンパクト、および分割メカニズムは、MemStore がしきい値に達すると、Memstore 内のデータを Storefile にフラッシュします。コンパクト メカニズムは、フラッシュされた小さなファイルを大きな Storefile にマージします。分割とは、リージョンがしきい値に達すると、大きすぎるリージョンが 2 つに分割されることを意味します。

関係する属性: つまり: 128M は Memstore のデフォルトのしきい値です

hbase.hregion.memstore.flush.size:134217728

つまり、このパラメータの機能は、単一の HRegion 内のすべての Memstore のサイズの合計が指定された値を超えた場合に、HRegion のすべての Memstore をフラッシュすることです。RegionServer のフラッシュは、リクエストをキューに追加して、生産モデルと消費モデルをシミュレートすることによって非同期的に処理されます。ここで問題が発生し、キューを消費する時間がなくなり、大量のリクエストのバックログが生成されると、メモリが急激に増加し、最悪の場合、OOM が発生する可能性があります。

hbase.regionserver.global.memstore.upperLimit:0.4 
hbase.regionserver.global.memstore.lowerLimit:0.38

つまり、MemStore が使用するメモリの総量が hbase.regionserver.global.memstore.upperLimit で指定された値に達すると、複数の MemStore がファイルにフラッシュされます。MemStore のフラッシュの順序は、サイズの降順で実行されます。 MemStore によって使用されるメモリがフラッシュされます。下限未満です。

おすすめ

転載: blog.csdn.net/zuodingquan666/article/details/135228913