Sparkは、E-MapReduce (EMR) SQLまたはDataFrameを使用して、Tablestoreデータに対して複雑な計算と効率的な分析を実行するのに役立ちます。
機能
基本機能に加えて、Tablestore Sparkコネクタは、バッチコンピューティング向けに次のコア機能を提供します。
インデックスの選択: 適切なインデックスは、データクエリの効率を決定します。フィルタ条件に最適なインデックスを選択して、クエリ効率を高めることができます。Tablestoreでは、グローバルセカンダリインデックスとサーチインデックスのいずれかを選択できます。
パーティションプルーニング: この機能を使用すると、フィルタ条件に基づいてきめ細かい構成を使用して、不要な分割を事前にフィルタリングできるため、サーバーから送信されるデータ量が削減されます。
プロジェクション列とフィルタのプッシュダウン: この機能を使用すると、プロジェクション列とフィルタ条件をサーバーにプッシュダウンできるため、各パーティションから送信されるデータ量が削減されます。
各分割のサイズの動的調整: この機能を使用すると、各分割のサイズと分割数を調整できます。各分割はResilient Distributed Dataset (RDD)のパーティションにバインドされているため、Sparkタスクの実行が高速化されます。
説明ComputeSplitsBySizeオペレーションを呼び出して、分割を取得できます。このオペレーションは、指定されたサイズに基づいてテーブル内のすべてのデータを分割に分割し、これらの分割間の分割点と分割が分散されているマシンの情報を返します。このオペレーションは、コンピューティングエンジンで同時実行計画などの計画を実行するために使用されます。
ストリームコンピューティングは、Change Data Capture (CDC)を使用して、Tunnel Serviceに基づいて、Sparkのマイクロバッチモードでストリーミング消費とコンピューティングを完了します。一方、少なくとも1回のセマンティクスが提供されます。ストリームコンピューティングでは、1つの分割がRDDの1つのパーティションにバインドされます。テーブルのパーティションをスケールアウトして、データスループットの線形スケーラビリティを実装できます。
EMR SQLまたはDataFrameの使用
Sparkを使用してTablestoreにアクセスするには、次のいずれかの方法を使用できます。EMR SQLとDataFrameを使用します。
EMR SQLの使用
このメソッドは、標準SQLステートメントを使用してビジネスデータにアクセスし、操作を実行します。このメソッドを使用して、既存のビジネスロジックのシームレスな移行を実装できます。
DataFrameの使用
このメソッドにはプログラミングの知識が必要です。ただし、このメソッドを他の機能と組み合わせて複雑なビジネスロジックを実行できるため、複雑で柔軟なシナリオに適しています。
データアクセス方法
Tablestoreは、Sparkのバッチコンピューティングがデータにアクセスするための次の方法を提供します。テーブルまたはグローバルサーチインデックスからのKVベースのクエリと、サーチインデックスベースのクエリ。このように、Tablestoreでは、幅広いクエリおよび分析機能に加えて、大量のデータの読み取りと書き込みが可能です。
2つのデータアクセス方法の違い:
KVベースのクエリは、フィルタリングに指定されたフィールドがプライマリキー列の場合に高い効率を実現します。ただし、フィルタリングに指定されたフィールドが非プライマリキー列の場合、これらのフィールド値は頻繁に変更されるため、このメソッドは適していません。また、KVベースのクエリはジオクエリをサポートしていません。
サーチインデックスベースのクエリは、次のデータアクセスシナリオに適用されます。
説明転置インデックスと列指向ストレージに基づいて、サーチインデックスは、Elasticsearchと同様の全文検索、あいまい検索、ジオクエリ、集計などのクエリおよび分析機能を提供します。
レイテンシに対する要件が高い、少数のリアルタイムデータ分析シナリオ。
フィルタリングに指定された複数のフィールドが非プライマリキー列です。これらのフィールドは、グローバルセカンダリインデックスまたはテーブルのプライマリキーに含めることはできません。
フィールドがフィルタリングに使用される場合、フィルタリング効率が高くなります。フィールドを使用して、ほとんどのデータをフィルタリングできます。
たとえば、
select * from table where col = 1000;
では、colは非プライマリキー列を示します。条件col = 1000を使用して、ほとんどのデータをフィルタリングできます。クエリ条件にジオクエリのフィールドが含まれています。
次のセクションでは、図とSQLステートメントselect * from table where col1 like 'A%' or col2 = 'a';
を使用して、2つのクエリタイプの使用方法を説明します。
サーチインデックスを使用してデータにアクセスする場合、値が「A%」であるcol1列を含むデータの行(pk1 = 1)をサーチインデックスから取得できます。また、値が「a」であるcol2列を含む2つのデータ行(pk1 = 1とpk1 = 2)をサーチインデックスから取得できます。次に、2つの結果はunionを使用して連結され、条件を満たすデータ(
pk1 = 1,col1 = 'Alibaba Cloud',col2 = 'a'
)が取得されます。KVベースのクエリを使用する場合、データはTablestoreテーブルからクエリされます。テーブルは、プライマリキー列を使用してのみクエリできます。SQLステートメントで指定されたフィールドがテーブルのプライマリキー列でない場合、テーブル全体をスキャンする必要があります。
col1はテーブルのプライマリキー列ではありません。したがって、Tablestoreはテーブル全体をスキャンして、値が「A%」であるcol2列を含むデータの行を検索します。col2はテーブルのプライマリキー列ではありません。したがって、Tablestoreはテーブル全体を再度スキャンして、値が「a」であるcol2列を含む2つのデータ行を検索します。次に、2つの結果はunionを使用して連結されます。
プライマリキー列がcol1とcol2であるインデックステーブルを作成することもできます。ただし、この方法では柔軟性が低下します。