ポイント: HBaseは、Hadoopに基づいて構築されたオープンソースのNoSQLデータベースであり、大規模データセットへの効率的なランダムアクセスを目的とし、マスター-スレーブアーキテクチャを採用しています。HDFSまたはAmazon S3にデータを保存することをサポートし、行、列ファミリー、およびバージョン管理のためのタイムスタンプに基づく独自のスキーマを特徴としています。
- HBaseはGoogleのBig Tableにインスパイアされています。
- ビッグデータアプリケーションにおいて高スループットを可能にします。
概要
HBaseは、GoogleのBig Tableデータベースのオープンソース実装であり、GoogleがGoogle Earthやウェブインデックスデータなどのデータを保存する場所です。
HBaseは、Hadoop上に構築された構造化されたnoSQLデータベースです。HBaseデータはHDFS(Hadoop Distributed File System)に保存できます。また、Amazon S3にHBaseデータを保存することもできますが、全く異なるアーキテクチャです。HBaseは、RDBMS(Oracleなど)の行と列の構造を持っているため構造化されていますが、列指向データベースであり、行指向ではありません。以下で説明します。HBaseは、ビッグデータに対するランダムアクセスを提供します。Hadoopはそうではありません:Hadoopはファイルを書くだけのバッチシステムですが、ファイルを更新しません。
Cassandraと同様に、HBaseはメモリテーブルにデータを保存し、その後、ディスクに大量の書き込みを行ってストレージにフラッシュします。これにより、ビッグデータアプリケーションに必要な高スループットが得られます。
(この記事は、私たちのHadoopガイドの一部です。右側のメニューを使用して移動してください。)
アーキテクチャ
HBaseはマスター-スレーブアーキテクチャを持っています。マスターサーバはリージョンサーバを調整します。リージョンサーバは、書き込み、読み取り、その他のデータ操作を担当します。
HadoopにインストールされているApache Zookeeperは、構成と分散操作を処理します。
HBaseのインストール
以下に、HBaseでテーブルを作成し、データを書き込む方法の例をいくつか示します。したがって、最初にHBaseをインストールする必要があります。HBaseのインストール手順はインターネットで見つけることができます。これにはRPMパッケージはありません。基本的には、最初にHadoopをインストールする必要があります。その後、HBaseをダウンロードして解凍し、Hadoop構成ファイルhbase-site.xmlに少し変更を加えます。したがって、そのインストールは複雑ではありません。
これらの例では、HBaseを分散モードではなくスタンドアロンで使用します。
HBaseスキーマ
HBaseスキーマは、OracleやMySQLに慣れている読者には奇妙に見えるでしょう。最初に、それを明確にするためのいくつかの定義を示しましょう。私たちの例では製品データベースを使用します。しかし、それはHBaseが在庫管理システムに適していることを意味するわけではありません。特に、非常に大規模なものには適しています。
- テーブル—行の集合。
- 行—列ファミリーの集合。
- 列ファミリー—列の集合。HBaseはデータを列ファミリーで保存し、行では保存しません。これにより、列が互いに近くにあるため、列の取得が高速になります。
- 列—製品価格のような個々のデータ項目。たとえば、製品情報を保存するように設計されたシステムでは、特性という列ファミリーと、在庫という別の列ファミリーを持つことができます。特性には説明、製造業者、シリアル番号などの列が含まれる場合があります。在庫にはitemCount、SKU(在庫管理単位)、EAN(バーコードヨーロッパ)、UPC(バーコードアメリカ)などが含まれる場合があります。列はこのように参照します:特性:itemCount。
- タイムスタンプ—HBaseは行キー、列、およびタイムスタンプをインデックスします。タイムスタンプは、単純な整数などの任意の時間形式にすることができます。タイムスタンプはキーの一部であるため、重複行を持つことができます。つまり、行の複数のバージョンを持つことができます。たとえば、時刻nの会計トランザクションと、別の時刻の同じ情報を持つことができます。
- 行キー—行キー列に保存するものは、行キーです。したがって、それは単なる序数ではありません。この例では、製品番号を使用します。行キーに名前(productNumberのように)を付けることはありません。HBaseは行キーをアルファベット順に保持しているため、類似のアイテムが互いに隣接して保持されます。たとえば、GoogleのドキュメントでGoogle Big Tableを説明しているときに、web indexの例を使用します。abc.comのデータはsales.abc.comの隣に保持されます。(Googleはそれらを隣接して保存するために、これらのドメイン名を逆にしてcom.abcおよびcom.abc.salesのように保存します。)
- セル—技術的にHBaseはデータをマップに保存します。Python、Scala、およびJavaプログラマーは、マップが(キー->値)データ構造であり、重複キーが許可されないことを知っています。Googleは、HBaseを「スパース、一貫性があり、分散された多次元、ソートされたマップ」と言います。データはこのマップ((rowkey、column family、column、timestamp)-> value)として保存されます。したがって、セルは列値であると言えます。これは正確な技術的定義ではありませんが、考えるのが簡単な方法です。
例を示すと、行は、行キー、タイムスタンプ、列ファミリー、および列を持つ構造を持っています。しかし、すべての行が同じ列を持つ必要はなく、これもRDBMSからの大きな変化です。ここで「スパース」という定義が登場します。特定の列を持たない行は、その空の値を保存するために、RDBMSのように空間を消費しません。
| 行キー | タイムスタンプ | カラムファミリー | カラムファミリー | カラムファミリー | カラムファミリー |
| カラム1 | カラム2 | カラム3 | カラム4 |
製品データベースがあるとします。製品はSKU(在庫管理単位)で保存されます。SKUは単品、6パック、ケースなどです。UPCコードはバーコードです。数量は在庫にある量です。
したがって、以下のスキーマでは、製品番号を行キーとし、特性と在庫という2つの製品ファミリーを持ちます。それぞれに列があるため、以下のサンプルデータがあります:
| 製品番号 | タイムスタンプ | 特性 | 在庫 | 在庫 | ||
| 説明 | UPC | メーカー | SKU | 数量 | ||
| 1 | 10 | スケートボード | 123 | 各 | 100 | |
| 2 | 10 | メガネ | 456 | パッケージ | 400 | |
| 2 | 15 | メガネ | 456 | パッケージ | 600 | |
| 3 | 20 | イノシシ | 789 | マコ | 各 | 2 |
行キー2とUPC列456を持つ2行があります。違いはタイムスタンプです。したがって、異なる2つの時点で在庫レベルがあります。
製品3には特性:製造業者列があり、他の行にはありません。これは、行が異なる列を持つことができることを示しています。以下の例では、このスキーマで作業します。
HBaseシェル
/usr/local/hbase/hbase(version)/bin/をパスに入れて、次のようにシェルを開くことができます:
hbase shell
これは、HBaseの上に構築されたJRuby IRBシェルです。したがって、変数を作成したり、その他の操作を行ったりできます。
シェルを使用してテーブルを作成する
次のようにテーブルを作成します:
create <table name>, <column family 1>,<column family 2>, ...
次のように:
create 'products', 'characteristics’, 'inventory'
listと入力すると、作成されたことを示し、次にdescribeコマンドでスキーマを表示します。
テーブルにデータを追加する
今、テーブルにデータを入れる前に列名を作成する必要はありません。その場で行います。コマンドは:
put <table name>, <row key>, <column family: column>
特定の行と列に値を入れます。1回のputで複数の列に書き込むことはできません。
put 'products', '123', 'characteristics:description', 'skateboard'
同じ製品の別のセルに書き込みます:
put 'products', '123', 'inventory:count', '100'
その後、スキャンを使用してデータをリストします:
scan 'products'
ROW COLUMN+CELL
123 column=characteristics:description, timestamp=1488291808832, value=skateboard
123 column=inventory:count, timestamp=1488292001662, value=100
データを取得する
特定の行/セルを取得する方法は次のとおりです:
get 'products', '123', 'characteristics:description'
COLUMN CELL
characteristics:descrip timestamp=1488291808832, value=skateboard
バージョンの使用
複数のバージョンを保存するためにタイムスタンプ機能を使用するには、テーブルを次のように作成します:
create 'products', {NAME => 'characteristics', VERSIONS => 3}, {NAME => 'inventory', VERSIONS => 3}
これは、各行/列の最大3バージョンを保持することを意味します。
次に、値を書き込み、タイムスタンプを指定しません。システム時間を使用します。
put 'products', '123', 'characteristics:description', 'skateboard'
同じ行、列の値を書き込み、タイムスタンプに任意の整数を使用します。ここでは2を使用します。
put 'products', '123', 'characteristics:description', 'skateboard', 2
今、スキャンしてテーブル内のデータを表示すると、2つのバージョンがあります:
scan 'products', {VERSIONS => 3}
ROW COLUMN+CELL
123 column=characteristics:description, timestamp=1488293615489, value=ska
teboard
123 column=characteristics:description, timestamp=2, value=skateboard
テーブルを削除する
テーブルを削除するには、まずそれを無効にする必要があります:
disable ‘products’
その後、削除できます:
drop 'products'
テーブル名の周りに引用符を付けることに注意してください。
データ型
私たちの例では、すべての例で文字列を使用していることに注意してください。HBaseは値をバイトとして書き込むため、バイトとして保存できる任意のオブジェクト(ビットを除くすべて)が保存できます。したがって、文字列、数字、画像、複雑なオブジェクトをサポートしています。これをJavaで使用すると、次のようになります:
Put(Bytes.toBytes());
Javaを使用してテーブルを作成する
HBaseで作業しているほとんどのプログラマーはJavaを使用します。HBaseはシェル用にJRubyを使用しており、これもJavaへのインターフェースです。
Javaを使用してテーブルを作成する方法の例を示します。この例を実行するには、以下のようにCLASSPATHを設定する必要があります。基本的に、hbase classpathコマンドは、プログラムをコンパイルするために必要な非常に長い文字列を返します。
export CLASSPATH=$CLASSPATH:`hbase classpath`
cat HbaseExamples.java:
import java.io.IOException;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.conf.Configuration;
public class HbaseExamples {
public static void main(String[] args) throws IOException {
Configuration conf = HBaseConfiguration.create();
HBaseAdmin admin = new HBaseAdmin(conf);
HTableDescriptor tableDescriptor = new
HTableDescriptor(TableName.valueOf("products"));
tableDescriptor.addFamily(new HColumnDescriptor("characteristics"));
tableDescriptor.addFamily(new HColumnDescriptor("inventory"));
admin.createTable(tableDescriptor);
System.out.println(" Table created ");
}
}
CLASSPATHを設定してから、プログラムをコンパイルして実行します:
export CLASSPATH=`hbase classpath`
javac -cp `hbase classpath` HbaseExamples.java
java -cp $CLASSPATH:. HbaseExamples
それは、コンソールにHBaseメッセージをたくさんエコーして、以下で終わるはずです:
2017-02-27 16:06:01,616 INFO [main] client.HBaseAdmin: Created products
Table created
今、シェルを開いて、リストして、製品テーブルが作成されたことを確認できます:
hbase(main):009:0> list
TABLE
products
これで、開始するための十分な情報があります。HBaseを使用し始める前に、マスターやリージョン、スキーマを作成する方法をさらに研究し、そのアーキテクチャに一貫性のある方法でデータを構築する必要があります。つまり、MySQLやOracleを長年使用してきた私たちのような人々が持つRDBMSバイアスを取り除く必要があります。また、HBaseスクリプトで変数を使用する方法を調べるために、いくつかのJRubyを学ぶことができます。
これらの投稿は私自身のものであり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。