Apache Igniteのガイド

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で入手できます。