Lao Liuは現在、来年の学校募集に向けて懸命に取り組んでいます。この記事を書く主な目的は、彼が自国語でレビューしたビッグデータの知識ポイントを詳細に説明し、資料に機械的な方法を使用して独自の方法を使用することを拒否することです。理解!
01 HBaseナレッジポイント(3)
ポイント13:HBaseテーブルのホットな問題
ホットな問題は何ですか?
つまり、hbaseのデータを取得するときは、最初に行キーを使用してデータ行を見つける必要がありますが、ここで問題があります。行キーの設計により、テーブルのデータは1つまたは少数のノードにのみ分散される場合があります。 hbaseクラスター内。
多数のクライアントがhbaseクラスターのデータにアクセスすると、少数のRegionServerに対して読み取りおよび書き込み要求が多すぎて負荷が大きくなり、他のRegionServerの負荷が非常に小さいため、ホットスポットが発生します。 。
ホットな問題の理由を詳しく教えてください。
①hbaseのデータは辞書式順序でソートされます。個々のリージョンに多数の連続する行キーが書き込まれると、リージョン間のデータ分散のバランスがとれなくなります。
②テーブルを作成する場合、事前にパーティションを作成する必要はありません。作成されたテーブルには、デフォルトでリージョンが1つしかなく、現在のリージョンに大量のデータが書き込まれます。
③作成されたテーブルは事前にパーティション化されていますが、設計された行キーには従うべきルールがなく、設計された行キーはハッシュフィールドを追加しません。
ホットな問題の解決策
事前パーティション
事前パーティション化の目的により、デフォルトでクラスターの1つのノードに1つのリージョンのみを分散させるのではなく、テーブルデータをクラスター内に均等に分散させることができます。
塩で
具体的には、行キーにランダムなプレフィックスを割り当てて、前の行キーの先頭とは異なるものにします。
ポイント14:ローキーデザイン
13点目では、ローキーのデザインが悪いとホットな問題が発生すると言われています。では、rowkeyはどのように正確に設計する必要がありますか?
行キーの設計には3つの原則がありますが、これは私の決定ではありません。このように書かれた情報を読みました。
1つ目は、行キーの長さの原則です。できるだけ短く、短すぎないことをお勧めします。そうしないと、行キーが辞書式順序で並べ替えられ、これらのデータが次のようにまとめて保存されるため、行キー間でプレフィックスが重複する可能性が高くなります。可能な限り。
2つ目は、行キーハッシュの原則です。これは、行キーにランダムなプレフィックスを追加して、行キーを可能な限り異なるものにし、ホットな問題を回避しようとすることです。
最後に、rowkeyの唯一の原則は、それを一意に保つことです。
ポイント15:HBaseデータのバックアップ
Liuが知っているHBaseデータバックアップには2つのタイプがあります。1つは、HBaseが提供するクラスを使用してHBaseのテーブルのデータをHDFSにエクスポートし、必要に応じてHBaseテーブルにエクスポートすることです。
①HBaseテーブルからHDFSへのエクスポート
hbase org.apache.hadoop.hbase.mapreduce.Export myuser /hbase_data/myuser_bak
②必要に応じて、HBaseにバックアップターゲットテーブルを作成します
create 'myuser_bak','f1','f2'
③HDFSのデータをバックアップ対象テーブルにインポートする
hbase org.apache.hadoop.hbase.mapreduce.Driver import myuser_bak /hbase_data/myuser_bak/
このようにして、最初の方法は終了します。2番目の方法では、スナップショットを使用してテーブルをバックアップします。オンライン情報によると、HBaseデータ移行とスナップショットによるコピーが最も推奨されるデータ移行方法です。この方法はよくわかりません。さて、後でお話ししますが、今回はまずお話しさせていただきますので、皆様の印象に残ります。
ポイント16:HBaseセカンダリインデックス
なぜセカンダリインデックスが必要なのですか?
①HBaseの場合、レコードの行を正確に検索する場合は、行キーを使用してクエリを実行するしか方法はありませんが、行キーを使用してデータをクエリしない場合は、全表スキャンを実行する必要があります。大きなテーブルの場合、全表スキャンのコストが高すぎるため、別の方法を見つける必要があります。
多くの場合、複数の側面からデータをクエリする必要があります。たとえば、特定の学生の情報を見つける際に、名前、ID番号、学生番号などでクエリを実行できますが、データの多くの側面を行キーに入れることはほとんど不可能です(ビジネスの柔軟性はそうではありません)許可してください、右行キーの長さも許可されていません)。
したがって、これを実現するには、セカンダリインデックス(セカンダリインデックス)が必要です。
②HBaseクエリをより効率的にすることでもあります。たとえば、行キー以外のフィールド検索を使用して第2レベルの応答を実現するには、HBaseでセカンダリインデックスを作成する必要がある場合があります。
セカンダリインデックスを作成する方法は?
セカンダリインデックスを作成するには、フェニックス(Phoenix)を使用することをお勧めします。OldLiuがフェニックスの概念について簡単に説明します。
2つのインデックスを作成します。
①グローバルインデックス。読み取りが多く書き込みが少ないビジネスシナリオに適しています。
データテーブルへのすべての更新操作によってインデックステーブルが更新され、インデックステーブルが異なるデータノードに分散され、ノード間のデータ転送により大きなパフォーマンスがもたらされるため、データの書き込み時にグローバルインデックスを使用すると非常にコストがかかります。消費。
フェニックスは、データを読み取るときに、クエリにかかる時間を短縮するためにインデックステーブルを選択します。デフォルトでは、クエリするフィールドがインデックスフィールドでない場合、インデックステーブルは使用されません。つまり、クエリ速度は向上しません。
②ローカルインデックス。書き込み操作が頻繁でスペースが限られているシナリオに適しています。
グローバルインデックスと同様に、Phoenixはクエリを実行するときにインデックスを使用するかどうかを自動的に決定します。
ローカルインデックスを使用する場合、インデックスデータとデータテーブルのデータは同じサーバーに格納されるため、書き込み操作中に異なるサーバーのインデックステーブルにインデックスを書き込む追加のオーバーヘッドが回避されます。
ローカルインデックスを使用する場合、クエリフィールドがインデックスフィールドでなくても、インデックステーブルが使用されるため、グローバルインデックスとは異なり、クエリ速度が向上します。
ポイント17:HBase名前空間
名前空間の概念
HBaseでは、名前空間はリレーショナルデータベースのデータベースと同等です。これは、テーブルのグループの論理グループを指します。つまり、同じグループ内のテーブルの用途は似ています。これは、名前空間を使用することで、ビジネスでテーブルを簡単に分割できると言っているのと同じです。
名前空間の基本操作
创建namespace
hbase>create_namespace 'nametest'
查看namespace
hbase>describe_namespace 'nametest'
列出所有namespace
hbase>list_namespace
在namespace下创建表
hbase>create 'nametest:testtable', 'fm1'
查看namespace下的表
hbase>list_namespace_tables 'nametest'
删除namespace
hbase>drop_namespace 'nametest'
ポイント18:HBaseデータバージョンの確認とTTL
HBaseでは、データの上限と下限を設定できます。これは、実際に保持されるデータの履歴バージョンの数を定義するためのものです。保存される履歴バージョンの数をカスタマイズすることで、データの複数の履歴バージョンのデータクエリを実現できます。 。
下限
デフォルトバージョンの下限は0で、これは無効になっています。使用される行バージョンの最小数は、存続時間(TTL Time To Live)と組み合わされ、0を使用して、実際のニーズに応じて0以上のバージョンを持つことができます。つまり、値の1つのバージョンのみがに書き込まれます。細胞。
上界
以前のバージョンのデフォルトの上限は3です。これは、行が3つのコピーを保持し、現在のバージョンがデフォルトで1になっていることを意味します。
データのTTL
実際の作業では、一定期間後に不要になる可能性のあるデータに遭遇することがよくあります。このとき、時間指定タスクを使用してこれらのデータを定期的に削除する
か、HbaseのTTL(Time To Live)機能を使用することもできます。データは定期的にクリアされます。
次の古いLiuは、データを明確に設定し、データのTTLを設定するコードを記述します。
public class HBaseVersionsAndTTL {
public static void main(String[] args) throws IOException {
//获得连接
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
//创建连接对象
Connection connection = ConnectionFactory.createConnection(configuration);
//建表的时候用Admin
Admin admin = connection.getAdmin();
if(!admin.tableExists(TableName.valueOf("version_hbase"))) {
//添加表名信息
HTableDescriptor version_hbase = new HTableDescriptor(TableName.valueOf("version_hbase"));
HColumnDescriptor f1 = new HColumnDescriptor("f1");
//最大版本、最小版本、TTL
f1.setMinVersions(3);
f1.setMaxVersions(5);
f1.setTimeToLive(30);//30s
version_hbase.addFamily(f1);
admin.createTable(version_hbase);
}
//插入数据
Table version_hbase = connection.getTable(TableName.valueOf("version_hbase"));
for(int i = 0; i < 6; i++) {
Put put = new Put("001".getBytes());
put.addColumn("f1".getBytes(), "name".getBytes(), ("zhangsan" + i).getBytes());
version_hbase.put(put);
}
//查询
Get get = new Get("001".getBytes());
//设置最大版本
get.setMaxVersions();
Result result = version_hbase.get(get);
Cell[] cells = result.rawCells();
for(Cell cell: cells) {
System.out.println(Bytes.toString(CellUtil.cloneValue(cell)));
}
//关闭连接
admin.close();
version_hbase.close();
connection.close();
}
}
02HBaseの概要
さて、ビッグデータHBaseの知識ポイントはほぼ要約されており、内容も比較的大きいので、よく理解し、自分の言葉で伝えるように努める必要があります。
最後に、何か悪いことや悪いことを感じたら、公式アカウントに連絡することができます:一生懸命働いているラオス・リウ、そしてコミュニケーション!ビッグデータの開発に興味のある学生の皆様のお役に立てれば幸いです。