Apache Igniteのガイド
1. 前書き
Apache Igniteは、オープンソースのメモリ中心の分散プラットフォームです。 データベース、キャッシュシステム、またはインメモリデータ処理として使用できます。
プラットフォームはメモリをストレージレイヤーとして使用するため、パフォーマンスが非常に優れています。 簡単に言えば、this is one of the fastest atomic data processing platforms currently in production use.
2. インストールとセットアップ
最初に、初期設定とインストール手順についてgetting started pageを確認してください。
ビルドするアプリケーションのMaven依存関係:
org.apache.ignite
ignite-core
${ignite.version}
org.apache.ignite
ignite-indexing
${ignite.version}
ignite-core is the only mandatory dependency for the project。 SQLも操作したいので、ignite-indexingもここにあります。 $\{ignite.version}は、ApacheIgniteの最新バージョンです。
最後のステップとして、Igniteノードを開始します。
Ignite node started OK (id=53c77dea)
Topology snapshot [ver=1, servers=1, clients=0, CPUs=4, offheap=1.2GB, heap=1.0GB]
Data Regions Configured:
^-- default [initSize=256.0 MiB, maxSize=1.2 GiB, persistenceEnabled=false]
上記のコンソール出力は、準備ができていることを示しています。
3. メモリアーキテクチャ
The platform is based on Durable Memory Architecture。 これにより、ディスクとメモリの両方にデータを保存および処理できます。 クラスターのRAMリソースを効果的に使用することにより、パフォーマンスが向上します。
メモリとディスク上のデータは、同じバイナリ表現を持っています。 つまり、あるレイヤーから別のレイヤーに移動する際に、データの追加の変換は行われません。
耐久性のあるメモリアーキテクチャは、ページと呼ばれる固定サイズのブロックに分割されます。 ページはJavaヒープの外部に格納され、RAMに編成されます。 一意の識別子があります:FullPageId。
ページは、PageMemoryの抽象化を使用してメモリと相互作用します。
ページの読み取り、書き込み、ページIDの割り当てに役立ちます。 Inside the memory, Ignite associates pages with Memory Buffers。
4. メモリページ
ページには次の状態があります。
-
アンロード-ページバッファがメモリにロードされていません
-
クリア-ページバッファがロードされ、ディスク上のデータと同期されます
-
Durty –ページバッファーは、ディスク内のデータとは異なるデータを保持します
-
チェックポイントの汚れ–最初の修正がディスクに保持される前に、別の修正が開始されます。 ここでチェックポイントが開始され、PageMemoryはページごとに2つのメモリバッファを保持します。
Durable memory allocates local a memory segment called Data Region.デフォルトでは、クラスターメモリの20%の容量があります。 複数領域構成により、使用可能なデータをメモリに保持できます。
領域の最大容量はメモリセグメントです。 物理メモリまたは連続バイト配列です。
To avoid memory fragmentations, a single page holds multiple key-value entries。 すべての新しいエントリは、最適なページに追加されます。 キーと値のペアのサイズがページの最大容量を超える場合、Igniteはデータを複数のページに保存します。 同じロジックがデータの更新にも適用されます。
SQLおよびキャッシュインデックスは、Bツリーと呼ばれる構造に格納されます。 キャッシュキーは、キー値の順に並べられます。
5. ライフサイクル
Each Ignite node runs on a single JVM instance。 ただし、単一のJVMプロセスで複数のIgniteノードを実行するように構成することは可能です。
ライフサイクルイベントの種類を見てみましょう。
-
BEFORE_NODE_START –Igniteノードの起動前
-
AFTER_NODE_START –Igniteノードの開始直後に発生します
-
BEFORE_NODE_STOP –ノード停止を開始する前
-
AFTER_NODE_STOP –Igniteノードが停止した後
デフォルトのIgniteノードを開始するには:
Ignite ignite = Ignition.start();
または、構成ファイルから:
Ignite ignite = Ignition.start("config/example-cache.xml");
初期化プロセスをさらに制御する必要がある場合は、LifecycleBeanインターフェイスを使用する別の方法があります。
public class CustomLifecycleBean implements LifecycleBean {
@Override
public void onLifecycleEvent(LifecycleEventType lifecycleEventType)
throws IgniteException {
if(lifecycleEventType == LifecycleEventType.AFTER_NODE_START) {
// ...
}
}
}
ここでは、ライフサイクルイベントタイプを使用して、ノードの開始/停止の前後にアクションを実行できます。
そのために、CustomLifecycleBeanを含む構成インスタンスをstartメソッドに渡します。
IgniteConfiguration configuration = new IgniteConfiguration();
configuration.setLifecycleBeans(new CustomLifecycleBean());
Ignite ignite = Ignition.start(configuration);
6. インメモリデータグリッド
Ignite data grid is a distributed key-value storage、パーティション化されたHashMapに非常に精通しています。 水平方向にスケーリングされます。 これは、追加するクラスターノードが多くなり、より多くのデータがメモリにキャッシュまたは格納されることを意味します。
キャッシュ用の追加レイヤーとしてのNoSql、RDMSデータベースなど、サードパーティソフトウェアのパフォーマンスを大幅に向上させることができます。
6.1. キャッシングサポート
データアクセスAPIは、JCache JSR107仕様に基づいています。
例として、テンプレート構成を使用してキャッシュを作成しましょう。
IgniteCache cache = ignite.getOrCreateCache(
"baeldingCache");
詳細については、ここで何が起こっているかを見てみましょう。 最初に、Igniteはキャッシュが保存されているメモリ領域を見つけます。
次に、Bツリーインデックスページは、キーハッシュコードに基づいて配置されます。 インデックスが存在する場合、対応するキーのデータページが検索されます。
インデックスがNULLの場合、プラットフォームは指定されたキーを使用して新しいデータエントリを作成します。
次に、いくつかのEmployeeオブジェクトを追加しましょう。
cache.put(1, new Employee(1, "John", true));
cache.put(2, new Employee(2, "Anna", false));
cache.put(3, new Employee(3, "George", true));
繰り返しますが、永続メモリはキャッシュが属するメモリ領域を探します。 キャッシュキーに基づいて、インデックスページはBツリー構造に配置されます。
インデックスページが存在しない場合は、新しいページがリクエストされ、ツリーに追加されます。
次に、データページがインデックスページに割り当てられます。
キャッシュから従業員を読み取るには、単にキー値を使用します。
Employee employee = cache.get(1);
6.2. ストリーミングサポート
メモリ内のデータストリーミングは、ディスクおよびファイルシステムベースのデータ処理アプリケーションに代替アプローチを提供します。 The Streaming API splits the high load data flow into multiple stages and routes them for processing。
サンプルを変更して、ファイルからデータをストリーミングできます。 最初に、データストリーマを定義します。
IgniteDataStreamer streamer = ignite
.dataStreamer(cache.getName());
次に、ストリームトランスフォーマーを登録して、受け取った従業員を雇用済みとしてマークできます。
streamer.receiver(StreamTransformer.from((e, arg) -> {
Employee employee = e.getValue();
employee.setEmployed(true);
e.setValue(employee);
return employee;
}));
最後のステップとして、employees.txtファイル行を繰り返し処理し、それらをJavaオブジェクトに変換します。
Path path = Paths.get(IgniteStream.class.getResource("employees.txt")
.toURI());
Gson gson = new Gson();
Files.lines(path)
.forEach(l -> streamer.addData(
employee.getId(),
gson.fromJson(l, Employee.class)));
streamer.addData()を使用して、従業員オブジェクトをストリームに配置します。
7. SQLサポート
このプラットフォームは、メモリ中心のフォールトトレラントSQLデータベースを提供します。
純粋なSQL APIまたはJDBCのいずれかで接続できます。 ここでのSQL構文はANSI-99であるため、クエリ、DML、DDL言語操作のすべての標準集計関数がサポートされています。
7.1. JDBC
より実用的にするために、従業員のテーブルを作成し、それにいくつかのデータを追加しましょう。
その目的のために、次のステップとしてwe register a JDBC driver and open a connection:
Class.forName("org.apache.ignite.IgniteJdbcThinDriver");
Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1/");
標準のDDLコマンドを使用して、Employeeテーブルにデータを入力します。
sql.executeUpdate("CREATE TABLE Employee (" +
" id LONG PRIMARY KEY, name VARCHAR, isEmployed tinyint(1)) " +
" WITH \"template=replicated\"");
WITHキーワードの後に、キャッシュ構成テンプレートを設定できます。 ここでは、REPLICATEDを使用します。 By default, the template mode is PARTITIONED。 ここではTo specify the number of copies of the data we can also specify BACKUPSパラメータ。デフォルトでは0です。
次に、INSERTDMLステートメントを使用していくつかのデータを追加しましょう。
PreparedStatement sql = conn.prepareStatement(
"INSERT INTO Employee (id, name, isEmployed) VALUES (?, ?, ?)");
sql.setLong(1, 1);
sql.setString(2, "James");
sql.setBoolean(3, true);
sql.executeUpdate();
// add the rest
その後、レコードを選択します。
ResultSet rs
= sql.executeQuery("SELECT e.name, e.isEmployed "
+ " FROM Employee e "
+ " WHERE e.isEmployed = TRUE ")
7.2. オブジェクトをクエリする
It’s also possible to perform a query over Java objects stored in the cache。 IgniteはJavaオブジェクトを個別のSQLレコードとして扱います。
IgniteCache cache = ignite.cache("exampleCache");
SqlFieldsQuery sql = new SqlFieldsQuery(
"select name from Employee where isEmployed = 'true'");
QueryCursor> cursor = cache.query(sql);
for (List> row : cursor) {
// do something with the row
}
8. 概要
このチュートリアルでは、Apache Igniteプロジェクトについて簡単に説明しました。 このガイドでは、パフォーマンスの向上、耐久性、軽量APIなど、他の類似製品に対するプラットフォームの利点を強調しています。
その結果、we learned how to use the SQL language and Java API for to store, retrieve, stream the data inside of the persistence or in-memory grid.
いつものように、この記事の完全なコードはover on GitHubで入手できます。