Navigation überspringen

Analysen in Azure SQL Data Warehouse nahezu in Echtzeit

Veröffentlicht am 25 September, 2018

Program Manager II, Azure SQL Data Warehouse

Mit immer schnellerer Erzeugung von Daten dank IoT und Streams wächst auch die Nachfrage nach zügigerem Zugriff auf Daten zu Analysezwecken. Analysen in nahezu Echtzeit werden in allen Branchensegmenten gefordert – von Großunternehmen im Einzelhandel, die Preisänderungen in Echtzeit vornehmen, über Produktionsanlagen, die Systeme zur Anomalieerkennung einsetzen, um mögliche Probleme in der Produktionsstraße vorherzusagen, bevor diese auftreten, bis hin zu Bergbau- und Gasunternehmen, die Daten hochsensibler Bohrsensoren analysieren, um immer zu wissen, was bei einer Bohrung unter der Erde vor sich geht. Es hat sich gezeigt, dass Analysen in nahezu Echtzeit enorme Vorteile mit sich bringen.

Wir freuen uns, heute bekanntzugeben, dass wir Funktionen für die Analyse in nahezu Echtzeit in Azure SQL Data Warehouse einführen. Diese Funktionen werden durch die öffentliche Vorschauversion der Streamerfassung in SQL Data Warehouse aus Azure Databricks-Streamdatenrahmen ermöglicht.

Strukturiertes Streaming in Azure Databricks

Azure Databricks ist ein vollständig verwalteter Microsoft-Clouddienst, der Databricks Runtime ausführt. Der Dienst stellt eine Apache Spark-Implementierung speziell für Unternehmen in Azure zur Verfügung. Mit strukturiertem Streaming in Apache Spark können Benutzer eine Abfrage eines Streams skalierbar und fehlertolerant definieren.

Strukturiertes Streaming ist eine skalierbare und fehlertolerante Methode zum Ausführen von Abfragen für Streams. Der Streamdatenrahmen ist eine ungebundene Tabelle. Neue Daten aus dem Stream werden dieser Tabelle hinzugefügt. Abfragen können für die angefügten Bereiche oder für die gesamte Tabelle ausgeführt werden.

Stream

Azure SQL Data Warehouse als Ausgabesenke

Streamingabfragen können sehr nützlich sein, um offensichtliche Fragen zu einem Stream zu klären, wie z.B. die Durchschnitts-, Höchst- und Tiefstwerte im Laufe der Zeit. Allerdings haben Downstreamanalysten in diesem Szenario keinen Zugriff auf Daten in nahezu Echtzeit. Um dies zu ermöglichen, müssen Sie die Daten so schnell wie möglich in eine SQL Data Warehouse-Instanz übertragen, damit Analysten die Daten in nahezu Echtzeit mit Tools wie Power BI abfragen, visualisieren und interpretieren können.

Beispiel: Stream mit Rate in Azure SQL Data Warehouse

Mit diesem Beispiel können wir die Funktionalität auf einfache Weise veranschaulichen. Ein strukturierter Stream verfügt über einen Datengenerator, der einen Zeitstempel und einen Wert in einer angegebenen Rate pro Sekunde erzeugt. Diesen Mechanismus verwenden wir zum Erstellen eines einfachen Streamingbeispiels.

Erstellen Sie zunächst eine Senkentabelle in Ihrer SQL Data Warehouse-Instanz. Wie oben erwähnt, generiert der Ratenstream einen Zeitstempel und einen Wert, die wir als Schema für unsere Tabelle verwenden können. Öffnen Sie dazu Ihr bevorzugtes Datenbankverwaltungstool, und erstellen Sie die folgende Tabelle:

```sql
CREATE TABLE [dbo].[Stream_CI]
(
   [timestamp] DATETIME NULL,
   [Value] BIGINT NULL
)
WITH
(
   DISTRIBUTION = ROUND_ROBIN,
   CLUSTERED INDEX ([zeitstempel])
)
```
Eine Tabelle mit der Verteilung ROUND_ROBIN und einem gruppierten Index für den Zeitstempel ist der beste Kompromiss für das Streamen von Daten in eine SQL Data Warehouse-Instanz. Dieser Kompromiss bietet sowohl eine akzeptable Erfassungsgeschwindigkeit als auch eine angemessene Abfrageleistung. 

Nachdem Sie nun die Senkentabelle in SQL Data Warehouse erstellt haben, sehen Sie sich nun den Teil zu Azure Databricks an. Der Code, den Sie unten sehen, wurde in Python geschrieben. Die gleiche Funktionalität gibt es aber auch in R und Scala.

Stellen Sie zunächst eine Verbindung mit der SQL Data Warehouse-Instanz, in der Sie gerade die Tabelle erstellt haben, und mit einem Azure-Speicherkonto her.

```python
# Einstellungen im Zusammenhang mit SQL Data Warehouse (zum Herstellen der Verbindung mit der SQL Data Warehouse-Instanz)
dwDatabase = <datenbankname>
dwServer = <servername>
dwUser = <sqlBenutzer>
dwPass = <sqlBenutzerkennwort>
dwJdbcPort =  "1433"
dwJdbcExtraOptions = "encrypt=true;trustServerCertificate=true;loginTimeout=30;"
sqlDwUrl = "jdbc:sqlserver://" + dwServer + ".database.windows.net:" + dwJdbcPort + ";database=" + dwDatabase + ";user=" + dwUser+";password=" + dwPass + ";"+dwJdbcExtraOptions
# Einstellungen im Zusammenhang mit Blob Storage (für temporären Speicher)
# Der Wert ist die URL des Speicherkontos in folgendem Format: <kontoname>.blob.core.windows.net
blobStorage = <blobStorageKonto>
blobContainer = <speichercontainer>
blobAccessKey =  <zugriffsschlüssel>
# Richten Sie den Zugriffsschlüssel des Blob Storage-Kontos in der Konfigurationsdatei der Notebooksitzung ein.
spark.conf.set(
   "fs.azure.account.key."+blobStorage ,
   blobAccessKey)
```

In diesem Codeblock verwenden wir der Einfachheit und Schnelligkeit halber Benutzernamen und Kennwörter. Dies wird jedoch nicht empfohlen. Stattdessen wird empfohlen, Geheimnisbereiche zu verwenden, um Geheimnisse sicher im Azure Key Vault zu speichern.

Nachdem Sie eine Verbindung zwischen SQL Data Warehouse, Ihrem Speicherkonto und Azure Databricks hergestellt haben, erstellen Sie einen Lesestream, und schreiben Sie die Ausgabe in Ihre SQL Data Warehouse-Instanz.

Die wichtigsten Parameter für den Stream mit Rate sind rowsPerSecond und numPartitions. RowsPerSecond gibt an, wie viele Zeilen das System pro Sekunde zu erstellen versucht. NumPartitions gibt an, wie viele Partitionen zum Erstellen von Zeilen belegt werden. Wenn der Wert für rowsPerSecond sehr hoch ist und das System nicht genügend Daten generiert, verwenden Sie mehr Partitionen.

```python
# Bereiten Sie die Streamquelle vor.
df = spark.readStream \
   .format("rate") \
   .option("rowsPerSecond", "10000") \
   .option("numPartitions", "5") \
   .load()
```

Verwenden Sie das Format „com.databricks.spark.sqldw“, um den Lesestream in SQL Data Warehouse zu schreiben. Diese Formatoption ist in Databricks Runtime integriert und in allen Clustern mit Databricks 4.3 und höher verfügbar.

```python
# Die Strukturierter Stream-API, die die Daten fortlaufend in die Tabelle in SQL Data Warehouse schreiben soll.
df.writeStream \
   .format("com.databricks.spark.sqldw") \
   .option("url", sqlDwUrl) \
   .option("tempDir", "wasbs://"+blobContainer+ "@" + blobStorage + "/tmpdir/stream") \
   .option("forwardSparkAzureStorageCredentials", "true") \
   .option("dbTable", "Stream_CI") \
   .option("checkpointLocation", "/checkpoint") \
   .trigger(processingTime="30 seconds") \
   .start()
```

Diese Anweisung verarbeitet den Stream mit Rate alle 30 Sekunden. Die Daten aus dem Stream werden in den temporären Speicherort geschrieben, der von tempDir definiert wird. Sobald sich die Dateien an dieser Stelle befinden, lädt SQL Data Warehouse die Daten mit PolyBase in die angegebene Tabelle. Wenn der Ladevorgang abgeschlossen ist, werden die Daten vom Speicherort gelöscht. So wird sichergestellt, dass sie nur einmal gelesen werden.
Der Stream generiert jetzt Daten und schreibt diese in SQL Data Warehouse. Sie können das Ganze überprüfen, indem Sie die Daten in SQL Data Warehouse abfragen.

```sql
SELECT COUNT(Value), DATEPART(mi,[timestamp]) AS [event_minute]
FROM Stream_ci
GROUP BY DATEPART(mi,[timestamp])
ORDER BY 2
```

Jetzt können Sie Ihre Streamdaten in SQL Data Warehouse abfragen.

Zusammenfassung

In diesem Blogbeitrag haben wir ein einfaches Beispiel besprochen, das veranschaulicht, wie Sie das strukturierte Streaming in Azure Databricks und SQL Data Warehouse einsetzen können, um Analysen in nahezu Echtzeit zu ermöglichen. Im Beispiel wurden der Einfachheit halber ein Stream mit Rate und ein einfacher Schreibbefehl verwendet. Sie können aber auch Kafka-Streams als Datenquelle und unternehmensspezifische Aggregationen mit rollierenden Fenstern verwenden.

Weitere Informationen: