目次
データを挿入し、行キー、列ファミリー修飾子、および値を指定します
テーブルが複数のバージョンのデータをサポートするようにします
バックグラウンド
CentOS7下のHBaseのインストールプロセスを記録し、あなたが記事を参照することができ、事前にHadoopを、カフカとのZooKeeperをインストールしてくださいHadoop2.5.0のインストールと展開CentOS7の下で、カフカのCentOS7のインストールと使用し、その監視コンポーネント、CentOS7インストール飼育係
データ構造
1.論理構造
列、列ファミリー、行キー、地区、およびその他の名詞の関係を次の図に示します。
行キーは辞書式にソートされます
2.物理ストレージ構造を次の図に示します。
3.アーキテクチャ図は次のとおりです
4.書き込みプロセス
memstoreの点滅:
5.読書プロセス
6.ストレージファイルのマージ
7.パーティショニング
インストール
启πhadoop、kafka、ZooKeeper
hbase圧縮パッケージを解凍します
[root@localhost szc]# tar -zxvf hbase-1.3.1-bin.tar.gz
HBaseを構成する
hbaseディレクトリの下にconfディレクトリを入力し、hbase-site.xml、hbase-env.sh、およびregionserversの3つのファイルを変更します。これらはすべてCentOSのローカルIPです。
[root@localhost szc]# cd hbase-1.3.1/conf/
hbase-env.sh JAVA_HOMEを変更し、hbaseに付属のZooKeeperをオフにします
export JAVA_HOME=/home/szc/jdk8_64
export HBASE_MANAGES_ZK=false
hbase-site.xmlは、hdfsパス、ディストリビューション、webUIポート、ZooKeeperおよびその他の情報を構成します
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://192.168.57.141:8020/Hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>192.168.57.141</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/szc/zookeeper/data</value>
</property>
<property>
<name>hbase.master.info.port</name>
<value>16010</value>
</property>
</configuration>
regionservers構成サーバー
192.168.57.141
hbaseを開始します
[root@localhost conf]# cd ..
[root@localhost hbase-1.3.1]# ./bin/hbase-daemon.sh start master
[root@localhost hbase-1.3.1]# ./bin/hbase-daemon.sh start regionserver
ポート16010を開くと、WindowsブラウザでHBaseのwebuiを確認できます。
図の矢印は、表スペースの割り振りに使用されるregionserverを指しています。
HBaseクラスターを開始する場合は、start-hbase.shを実行できます。
[root@localhost hbase-1.3.1]# ./bin/start-hbase.sh
hbaseを閉じる
[root@localhost hbase-1.3.1]# ./bin/stop-hbase.sh
hbaseコマンドラインを入力します
[root@localhost hbase-1.3.1]# ./bin/hbase shell
2020-05-09 09:19:41,328 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/szc/hbase-1.3.1/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/szc/cdh/hadoop-2.5.0-cdh5.3.6/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.3.1, r930b9a55528fe45d8edce7af42fef2d35e77677a, Thu Apr 6 19:36:54 PDT 2017
hbase(main):001:0>
コマンド
テーブルを作成し、列ファミリーを指定します
hbase(main):019:0> create 'testtable', 'colfaml';
データを挿入し、行キー、列ファミリー修飾子、および値を指定します
hbase(main):007:0> put 'testtable', 'myrow-1', 'colfaml:ql', 'value-1'
hbase(main):008:0> put 'testtable', 'myrow-2', 'colfaml:qk', 'value-2'
hbase(main):009:0> put 'testtable', 'myrow-2', 'colfaml:qj', 'value-3'
スキャンテーブル
hbase(main):010:0> scan 'testtable'
ROW COLUMN+CELL
myrow-1 column=colfaml:ql, timestamp=1580287260033, value=value-1
myrow-2 column=colfaml:qj, timestamp=1580287323632, value=value-3
myrow-2 column=colfaml:qk, timestamp=1580287294044, value=value-2
2 row(s) in 0.0220 seconds
1行のデータを取得する
hbase(main):011:0> get 'testtable', 'myrow-1'
COLUMN CELL
colfaml:ql timestamp=1580287260033, value=value-1
1 row(s) in 0.0220 seconds
データの削除(セル)
hbase(main):012:0> delete 'testtable', 'myrow-2', 'colfaml:qj'
テーブルを無効にして削除します
hbase(main):013:0> disable 'testtable'
hbase(main):014:0> drop 'testtable'
テーブルが複数のバージョンのデータをサポートするようにします
hbase(main):015:0> alter 'test', { NAME => 'cf1', VERSIONS => 3 }
次に、テストテーブルの説明情報を表示します
hbase(main):016:0> describe 'test'
Table test is ENABLED
test
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf1', BLOOMFILTER => 'ROW', VERSIONS => '3', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_E
NCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '655
36', REPLICATION_SCOPE => '0'}
1 row(s) in 0.0110 seconds
3つのバージョンのストレージ情報をサポートできることがわかります。次に、row1とcf1に2つのデータを挿入します。
hbase(main):017:0> put 'test', 'row1', 'cf1', 'val2'
hbase(main):018:0> put 'test', 'row1', 'cf1', 'val3'
複数のバージョンのデータを確認した後、複数のバージョンの履歴データを表示することができます。
hbase(main):019:0> scan 'test', { VERSIONS => 3}
ROW COLUMN+CELL
row1 column=cf1:, timestamp=1580357787736, value=val3
row1 column=cf1:, timestamp=1580357380211, value=val2
1 row(s) in 0.0120 seconds
ハイブとの統合
まず、環境変数HBASE_HOMEを追加して、hbaseインストールディレクトリをポイントします。次に、hbaseとhiveのメタストアを開始します
ハイブにテーブルを作成する
create table pokes(key string, value string) row format delimited fields terminated by ',';
データを読む
load data local inpath '/home/szc/data.txt' into table pokes;
次に、ハイブでテーブルを作成し、HBaseStorageHandlerを使用してダンプし、ハイブテーブルの行キー、列、および列の間の対応する関係を指定します
create table hbase_table(key string, value string) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties('hbase.columns.mapping' = ':key, cf1:val')
完了すると、hbase_tableという名前のテーブルがハイブとhbaseの両方に表示され、ハイブ側にデータが挿入されます
insert overwrite table hbase_table select * from pokes;
このコマンドが完了するのを待ち、次のコマンドを実行して内容を確認します
select * from hbase_table;
豚との統合
最初にPigHome \ lib \ spark \ netty-all-***。Final.jarを上位レベルのディレクトリにコピーしてから、hadoopの履歴サーバーを起動します
mr-jobhistory-daemon.sh start historyserver
次に、データファイルをhdfsの/ user / usernameにコピーします
hadoop fs -copyFromLocal /home/szc/pig/tutorial/data/excite-small.log /user/songzeceng
hbaseでエキサイトテーブルを作成した後、pigを起動します。次のコマンドはすべてpigコマンドラインで実行されます。
最初にデータファイルをロードし、セパレータに従って列を分割します
raw = LOAD 'hdfs:///user/songzeceng/excite-small.log' USING PigStorage ('\t') AS (user, time, query);
次に、各行でユーザー\ u0000と時間のスプライシングを実行します。スプライシングの結果は行キーであり、残りのクエリは列の値です。
T = FOREACH raw GENERATE CONCAT(CONCAT(user, '\u0000'), time), query;
次に、TをHBaseのエキサイトテーブルに格納し、列を指定します
store T into 'excite' using org.apache.pig.backend.hadoop.hbase.HBaseStorage('cf1:query');
次に、データを表示し、pig側でテーブルをロードし、行キーと列値をキー変数とクエリ変数に格納します。どちらも文字列です。
R = LOAD 'excite' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('cf1:query', '-loadKey') as (key: chararray, query: chararray);
関係Rを表示
dump R;
サンプル出力は次のとおりです。
(FE785BA19AAA3CBB 970916083558,dystrophie musculaire duch?ne)
(FE785BA19AAA3CBB 970916083732,)
(FE785BA19AAA3CBB 970916083839,)
(FE785BA19AAA3CBB 970916084121,dystrophie)
(FE785BA19AAA3CBB 970916084512,dystrophie musculaire)
(FE785BA19AAA3CBB 970916084553,)
(FE785BA19AAA3CBB 970916085100,dystrophie musculaire)
(FEA681A240A74D76 970916193646,kerala)
(FEA681A240A74D76 970916194158,kerala)
(FEA681A240A74D76 970916194554,kerala)
(FEA681A240A74D76 970916195314,kerala)
(FF5C9156B2D27FBD 970916114959,fredericksburg)
(FFA4F354D3948CFB 970916055045,big cocks)
(FFA4F354D3948CFB 970916055704,big cocks)
(FFA4F354D3948CFB 970916060431,big cocks)
(FFA4F354D3948CFB 970916060454,big cocks)
(FFA4F354D3948CFB 970916060901,big cocks)
(FFA4F354D3948CFB 970916061009,big cocks)
(FFCA848089F3BA8C 970916100905,marilyn manson)
次に、\ u0000を押して、変数キー(行キー)をユーザーと時間に展開することもできます
S = foreach R generate FLATTEN (STRSPLIT(key, '\u0000', 2)) AS (user:chararray, time:long), query;
ダンプSの出力例は次のとおりです。
(FE785BA19AAA3CBB,970916083435,dystrophie musculaire)
(FE785BA19AAA3CBB,970916083531,dystrophie musculaire duch?ne)
(FE785BA19AAA3CBB,970916083558,dystrophie musculaire duch?ne)
(FE785BA19AAA3CBB,970916083732,)
(FE785BA19AAA3CBB,970916083839,)
(FE785BA19AAA3CBB,970916084121,dystrophie)
(FE785BA19AAA3CBB,970916084512,dystrophie musculaire)
(FE785BA19AAA3CBB,970916084553,)
(FE785BA19AAA3CBB,970916085100,dystrophie musculaire)
(FEA681A240A74D76,970916193646,kerala)
(FEA681A240A74D76,970916194158,kerala)
(FEA681A240A74D76,970916194554,kerala)
(FEA681A240A74D76,970916195314,kerala)
(FF5C9156B2D27FBD,970916114959,fredericksburg)
(FFA4F354D3948CFB,970916055045,big cocks)
(FFA4F354D3948CFB,970916055704,big cocks)
(FFA4F354D3948CFB,970916060431,big cocks)
(FFA4F354D3948CFB,970916060454,big cocks)
(FFA4F354D3948CFB,970916060901,big cocks)
(FFA4F354D3948CFB,970916061009,big cocks)
(FFCA848089F3BA8C,970916100905,marilyn manson)
行の主要な設計原則
長さの原則
最大値は64KBで、推奨される長さは10〜100バイト、できれば8の倍数です。短くても短くてもかまいません。長い行キーはパフォーマンスに影響します。
唯一の原則
行キーは一意である必要があります
ハッシュの原則
1)、ソルトハッシュ:タイムスタンプの前に乱数を追加し、それを行キーとして使用します
2)文字列の反転:タイムスタンプを文字列に変換してから、行キーとして反転します。この方法は、タイムスタンプ、電話番号の回線キーで一般的に使用されます
3)パーティション番号を計算します:カスタムロジックを使用してパーティション番号を定義します
コプロセッサーの使用
HBaseでのコプロセッサーの役割は、RDBSでのトリガーの役割と同様であり、使用方法は次のとおりです。
1.クラスを定義し、BaseRegionObserverから継承し、その中のpreXX()またはpostXX()メソッドをオーバーライドします。メソッドの機能は、名前が示すように、XX操作の実行前後にロジックをカスタマイズすることです。
public class InsertCoprocessor extends BaseRegionObserver {
@Override
public void postPut(ObserverContext<RegionCoprocessorEnvironment> e, Put put, WALEdit edit, Durability durability) throws IOException {
Table table = e.getEnvironment().getTable(TableName.valueOf(Names.TABLE.getValue()));
String rowKey = new String(put.getRow());
String[] values = rowKey.split("_");
// 5_17885275338_20200103174616_19565082510_0713_1
CoprocessorDao dao = new CoprocessorDao();
String from = values[1];
String to = values[3];
String callTime = values[2];
String duration = values[4];
if (values[5].equals("0")) {
String flag = "1";
int regionNum = dao.getRegionNumber(to, callTime);
rowKey = regionNum + "_" + from + "_" + callTime
+ "_" + to + "_" + duration + "_" + flag;
byte[] family_in = Names.CF_CALLIN.getValue().getBytes();
Put put_in = new Put(rowKey.getBytes());
put_in.addColumn(family_in, "from".getBytes(), from.getBytes());
put_in.addColumn(family_in, "to".getBytes(), to.getBytes());
put_in.addColumn(family_in, "callTime".getBytes(), callTime.getBytes());
put_in.addColumn(family_in, "duration".getBytes(), duration.getBytes());
put_in.addColumn(family_in, "flag".getBytes(), flag.getBytes());
table.put(put_in);
table.close();
}
}
private class CoprocessorDao extends BaseDao {
public int getRegionNumber(String tel, String date) {
return genRegionNum(tel, date);
}
}
}
上記は、行キーの6番目の部分に従って別のプットを挿入して、別のレコードを挿入するかどうかを決定し、挿入後にテーブルを閉じることを忘れないでください。
2.次に、テーブルを作成するときに、プロセッサクラスを追加します
public HBaseDao() throws Exception {
...
createTable(Names.TABLE.getValue(), ValueConstant.REGION_COUNT,
"com.szc.telcom.consumer.coprocessor.InsertCoprocessor", new String[] {
Names.CF_CALLER.getValue(), Names.CF_CALLIN.getValue()
});
...
}
protected void createTable(String name, Integer regionCount, String coprocessorClass, String[] colFamilies) throws Exception {
...
createNewTable(name, coprocessorClass, regionCount, colFamilies);
}
private void createNewTable(String name, String coprocessorClass, Integer regionCount, String[] colFamilies) throws Exception {
...
if (!StringUtils.isEmpty(coprocessorClass)) {
tableDescriptor.addCoprocessor(coprocessorClass);
}
....
admin.createTable(tableDescriptor, splitKeys);
}
3.依存関係のパッケージ化では、関連するpomのパッケージ化されたプラグインの依存関係
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>
jar-with-dependencies
</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.szc.telcom.producer.Bootstrap</mainClass> <!-- 自定义主类 -->
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
ここでのコプロセッサーはプロジェクトのモジュールであるため、プロジェクト全体をパッケージ化できます
4.依存コプロセッサーjarパッケージをHBaseクラスターのlibディレクトリーに配置します
5. HBaseクラスターを再起動し、プロジェクトjarパッケージを再実行します
結論
上記、ご不明な点がございましたら、コメント欄でご相談ください。