現在JavaScriptの設定が無効になっています。このページを利用するにはJavaScriptの設定を有効にしてください。WEEKの5日目の記事です。Sparkと同様にインメモリ技術を活用した高耐障害性分散データ処理プラットフォームです。Igniteはリアルタイム処理に優れ、非トランザクションとACIDトランザクション的な処理を両方サポートします。Igniteには早期開発段階から導入されました。Sparkの統合はどういう風に実現されたか、既にSparkを使ってデータ処理を行うシステムへIgnite導入のメリットについて説明します。Ignite(以下、Ignite)は、メモリを中心に据えた分散データベース・キャッシュ・コンピュートといった複数の機能を備えたプラットフォームです。Fitness[4]等に採用されています。Ignite以外にもインメモリ技術を活用したプラットフォームはいくつかあります。Dataset)コンセプトを開発し、Hadoopの処理能力のボトルネックを解消した有名なインメモリデータ処理エンジンです。SparkはIgniteのようにデータを分散させほとんどのコンピュート処理はメモリ上で行い、高度な機械学習やインタラクティブなアドホッククエリーのような複数のステップにわたる高速な処理を実現可能としています。加えて、関係データモデルや手続き型APIを提供し、ユーザーの利便性を考慮してそれらを柔軟に組み合わせることができるので、非トランザクション的な分析によく使われるプラットフォームです。Igniteはリアルタイム処理に優れ、大量データに対して非トランザクションとACIDトランザクション的な処理を両方サポートします。RDDが実装され、2.4.0からDataFrameサポートも導入されました。この統合により、既にSparkを使ってデータ処理を行うシステムにとって以下のようなメリットがあります。Sparkワーカー間の迅速かつ容易なステートシェアリングができ、複雑なデータ処理実現の際にボトルネックになりそうなファイルシステムへのデータオフロードを避けれます。SQLのパフォーマンス向上を達成できます。SQLを利用し同じデータストアに対してIgniteの得意なリアルタイム処理機能やSparkのOLAP・機械学習機能のオーバヘッドの少ない多様なデータ処理ができます。以下は、IgniteとSparkのインテグレーションやその利用について説明します。共用RDDRDDはSparkに於けるコアなデータ抽象です。RDDにより並列処理を可能とするデータの分割や分散を隠蔽し、ユーザーに高度なAPIを提供することができます。IgniteはRDDインターフェースを実装しているため、Sparkのバックエンドとして使うことが可能です。APIをそのまま利用できます。...).filter(...).map(...)また、不変のデータ構造であるSparkのネイティブRDDと違って、IgniteRDDは複数のSparkタスクに共有され(図1参照)、ファイルシステムにRDD内容を書き出すことなくステートシェアリングが容易にできます。あるアプリケーションの処理によるデータに対する変更はあった場合、その変更は即時に他のアプリケーションに共有できます。それにより複雑な処理のパイプラインで必要な出力はなくなりさらに高速なデータ処理の実装は可能です。Igniteパティーションマッピングが行われSparkのDAGSchedulerにデータロケーション情報が伝わりデータロカリティ(どのノードにデータが存在するか)を考慮した並列処理が行われます。DataFrameサポートSparkに限らず、データ分析にはSQLがデファクト標準言語となっています。APIで発行可能です。SQLの主なデータ抽象である、スキーマ(概念的にRDBのテーブルに相当)を持った構造化データをあらわすDataset(DataFrame)です。Igniteは、DataFrameを拡張し、Igniteがストレージに用いられることを可能としています。IgniteSparkSessionを利用し、テーブル、ビュー、関数などのメターデータを管理するcatalogに登録しそれへのアクセスを透過的かつ迅速に行われるようにしています。それにより、長期的ストレージを持たないSparkに高速なIgniteからのデータロードやオフロード機能を与えて(RDDと同じく)Sparkワーカーに跨ったステートシェアリングが可能となります。以下は、IgniteクラスターにあるUser型データに対するクエリーのサンプルです。SQLはCatalystクエリーオプティマイザに生成された論理プランを、複数の最適化を通り物理プランにします。pushdownやJOIN仕方の変更のようなルールベースやコストベースの最適化をプランに適用します。Igniteクラスターのデータに対してクエリーが行われるとき、全テーブルはIgniteにある場合、Ignite側で実装されたextraOptimizationsであるIgniteOptimizationにより最適化が行われます。これにより全処理はIgniteクエリーエンジンにて行われ、データ移動を最低限にしてより効率の高いクエリー実行が実現できます。具体的に、論理オペレーターのツリーである論理クエリープランの構築に使われるLogicalPlanをスキャンしそのオペレーターをなるべくIgniteのQueryAccumulatorに追加します。追加できたらIgniteにて処理が可能であることで論理プランから取り除かれます。QueryAccumulatorで集まった情報に基づいてSQLクエリーを作成します。この最適化が不要な場合、ignite.disableSparkSQLOptimizationオプションをtrueにして無効にすることもできます。Igniteデータベースのインデックスの活用Sparkはストレージを持たない分散処理フレームワークです。一般的にディスクを用いたストレージからデータをロードし、処理終了次第そのデータを破棄・保存します。SQLはクエリーの最適化行いますが、どうしてもインデックスを要しているクエリーには、ORCやParquetのようなインデックスをサポートする形式のデータへのアクセスが必要となります。Igniteはそのものでインデックスをサポートしているので、Sparkとの統合によりインデックスの活用もできクエリーの大きな高速化が可能となります(1,000xの高速化の報告も見られます)。ユースケースIgniteとSparkを組み合わせた活用例として、[8]では紹介されたユースケースは上記を活用し株価予測を実現しています。Sparkの高度なストリーミング機能を利用しデータ分析を行って処理結果をIgniteデータベースで持つことにしています。結果はTableau[9]で参照します。詳しくは、[8]を参照してください。Sparkインテグレーションについては、[10-12]を参照してください。最後に本稿では大規模データ処理システムではIgniteとSparkの組み合わせでどのようなメリットを得ることができるか解説しました。Ignite導入により既にSparkを使ってデータ処理を行うシステムでSparkワーカー間のステートシェアリングやSQLのパフォーマンス向上などは実現できますが、Ignite利用者にもSparkを使うメリットはあります。その一つは、Sparkが提供する高度なストリーム処理です。Igniteは高速なデータストリーミングの機能を実装していますが、ベーシックなものであってSparkのマッピングやフィルタリングを使ってより高度なストリーム処理が実現できます。最後になりますが、IgniteとSparkの設定方法は[13]を参照できます。JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。JAPANのサービス開発を支える技術やデザイン、文化を発信しています。Reserved.このページの先頭へ。