パーティション再分割を使用して Azure Stream Analytics での処理を最適化する
この記事では、完全に並列化できないシナリオのために、パーティション再分割を使用して Azure Stream Analytics クエリをスケーリングする方法について説明します。
次の場合は並列処理を使用できない可能性があります。
- 入力ストリームのパーティション キーを制御できない。
- ソースが入力を複数のパーティションに分散させ、それらを後でマージする必要がある。
Event Hubs の PartitionId など、自然な入力スキームに従ってシャード化されていないストリームのデータを処理する場合は、パーティション再分割または再シャッフルが必要です。 パーティションを再分割すると、各シャードを個別に処理できるため、ストリーミング パイプラインを直線的にスケールアウトできます。
パーティションを再分割する方法
入力をパーティション再分割するには、次の 2 つの方法があります。
- パーティション再分割を行う別の Stream Analytics ジョブを使用する
- パーティション再分割してからカスタム分析ロジックを行う 1 つのジョブを使用する
入力をパーティション再分割するための別の Stream Analytics ジョブを作成する
入力を読み取り、パーティション キーを使用してイベント ハブ出力への書き込みを行うジョブを作成できます。 このイベント ハブは、分析ロジックを実装する別の Stream Analytics ジョブの入力として機能します。 ジョブにこのイベント ハブ出力を構成する場合は、Stream Analytics でデータをパーティション再分割するときに使用するパーティション キーを指定する必要があります。
-- For compat level 1.2 or higher
SELECT *
INTO output
FROM input
--For compat level 1.1 or lower
SELECT *
INTO output
FROM input PARTITION BY PartitionId
単一の Stream Analytics ジョブ内での入力のパーティション再分割
最初に入力を再分割するステップをクエリに導入し、これをクエリ内の他のステップで使用することもできます。 たとえば、DeviceId に基づいて入力をパーティション再分割する場合、クエリは次のようになります。
WITH RepartitionedInput AS
(
SELECT *
FROM input PARTITION BY DeviceID
)
SELECT DeviceID, AVG(Reading) as AvgNormalReading
INTO output
FROM RepartitionedInput
GROUP BY DeviceId, TumblingWindow(minute, 1)
次のクエリ例では、パーティション再分割された 2 つのデータ ストリームを結合します。 パーティション再分割された 2 つのデータ ストリームを結合する場合、これらのストリームのパーティション キーとカウントが同じである必要があります。 結果は、同じパーティション スキームを持つストリームです。
WITH step1 AS
(
SELECT * FROM input1
PARTITION BY DeviceID
),
step2 AS
(
SELECT * FROM input2
PARTITION BY DeviceID
)
SELECT * INTO output
FROM step1 PARTITION BY DeviceID
UNION step2 PARTITION BY DeviceID
出力スキームでは、各サブストリームを個別にフラッシュできるように、ストリーム スキーム キーとカウントが一致している必要があります。 また、ストリームは、フラッシュする前に別のスキームによって再びマージおよびパーティション再分割することもできますが、この方法は処理の全体的な待機時間が増え、リソースの使用率が増加するため、避けてください。
パーティション再分割のためのストリーミング ユニット
ジョブのリソース使用量について実験して観察し、必要なパーティションの正確な数を判断します。 ストリーミング ユニット (SU) の数は、各パーティションに必要な物理リソースに応じて調整する必要があります。 一般に、各パーティションには 6 つの SU が必要です。 ジョブに割り当てられているリソースが不足しているときは、ジョブが恩恵を受ける場合にシステムでパーティション再分割が適用されます。
SQL 出力のためのパーティション再分割
ジョブで出力に SQL データベースを使用する場合、スループットを最大化するために、最適なパーティション数に一致するように明示的なパーティション再分割を使用します。 SQL は 8 つのライターで最適に動作するため、フラッシュする前またはさらに上流の段階でフローを 8 つに再分割すると、ジョブのパフォーマンスが向上する可能性があります。
入力パーティションが 8 個より多い場合、入力パーティション構成の継承は適切な選択ではない可能性があります。 出力ライターの数を明示的に指定するために、クエリ内で INTO を使用することを検討してください。
次の例では、自然にパーティション分割されているかどうかに関係なく、入力から読み取り、DeviceID ディメンションに従ってストリームを10倍に再分割し、データを出力にフラッシュします。
SELECT * INTO [output]
FROM [input]
PARTITION BY DeviceID INTO 10
詳細については、「Azure SQL Database への Azure Stream Analytics の出力」を参照してください。