CentOS7でHBaseをインストールして使用する

目次

バックグラウンド

データ構造

インストール

启πhadoop、kafka、ZooKeeper

hbase圧縮パッケージを解凍します

HBaseを構成する

hbaseを開始します

hbaseを閉じる

hbaseコマンドラインを入力します

コマンド

テーブルを作成し、列ファミリーを指定します

データを挿入し、行キー、列ファミリー修飾子、および値を指定します

スキャンテーブル

1行のデータを取得する

データの削除(セル)

テーブルを無効にして削除します

テーブルが複数のバージョンのデータをサポートするようにします

ハイブとの統合

豚との統合

行の主要な設計原則

長さの原則

唯一の原則

ハッシュの原則

コプロセッサーの使用

結論

バックグラウンド

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パッケージを再実行します

結論

上記、ご不明な点がございましたら、コメント欄でご相談ください。

おすすめ

転載: blog.csdn.net/qq_37475168/article/details/107304312