Skapa en IoT-lösning med hjälp av Stream Analytics
Introduktion
I den här lösningen får du lära dig hur du använder Azure Stream Analytics för att få insikter i realtid från dina data. Utvecklare kan enkelt kombinera dataströmmar, till exempel klickströmmar, loggar och enhetsgenererade händelser, med historiska poster eller referensdata för att härleda affärsinsikter. Som en fullständigt hanterad dataflödesberäkningstjänst i realtid som finns i Microsoft Azure ger Azure Stream Analytics inbyggd återhämtning, låg svarstid och skalbarhet för att komma igång på några minuter.
När du har slutfört den här lösningen kan du:
- Bekanta dig med Azure Stream Analytics-portalen.
- Konfigurera och distribuera ett direktuppspelningsjobb.
- Formulera verkliga problem och lösa dem med hjälp av Stream Analytics-frågespråket.
- Utveckla strömningslösningar för dina kunder med hjälp av Stream Analytics med säkerhet.
- Använd övervaknings- och loggningsupplevelsen för att felsöka problem.
Förutsättningar
Du behöver följande förutsättningar för att slutföra den här lösningen:
Scenariointroduktion: "Hello, Toll!"
En avgiftsbelagd station är ett vanligt fenomen. Du stöter på dem på många expresswayer, broar och tunnlar över hela världen. Varje avgiftsstation har flera avgiftsbelagda bås. I manuella bås stannar du för att betala avgiften till en dirigent. I automatiserade bås skannar en sensor ovanpå varje monter ett RFID-kort som fästs på vindrutan på ditt fordon när du passerar vägtullsbåset. Det är enkelt att visualisera passagen av fordon genom dessa avgiftsbelagda stationer som en händelseström över vilken intressanta åtgärder kan utföras.
Inkommande data
Den här lösningen fungerar med två dataströmmar. Sensorer som är installerade i in- och utfarten till avgiftsstationerna skapar den första strömmen. Den andra strömmen är en statisk uppslagsdatauppsättning som har fordonsregistreringsdata.
Dataström för inmatning
Dataströmmen för indata innehåller information om bilar när de kommer in på avgiftsbelagda stationer. Utgångsdatahändelserna strömmas live till en händelsehubb från en webbapp som ingår i exempelappen.
| TollID | EntryTime | LicensePlate | State | Make | Model | VehicleType | VehicleWeight | Toll | Tag |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 1 |2014-09-10 12:01:00.000 |JNB 7001 |NY |Honda |CRV |1 |0 |7 | |
| 1 |2014-09-10 12:02:00.000 |YXZ 1001 |NY |Toyota |Camry |1 |0 |4 |123456789 |
| 3 |2014-09-10 12:02:00.000 |ABC 1004 |CT |Ford |Taurus |1 |0 |5 |456789123 |
| 2 |2014-09-10 12:03:00.000 |XYZ 1003 |CT |Toyota |Corolla |1 |0 |4 | |
| 1 |2014-09-10 12:03:00.000 |BNJ 1007 |NY |Honda |CRV |1 |0 |5 |789123456 |
| 2 |2014-09-10 12:05:00.000 |CDE 1007 |NJ |Toyota |4x4 |1 |0 |6 |321987654 |
Här är en kort beskrivning av kolumnerna:
Kolumn | beskrivning |
---|---|
TollID | Det avgiftsbelagda monter-ID som unikt identifierar en avgiftsbelagd monter |
EntryTime | Datum och tid för införsel av fordonet till vägtullsbåset i UTC |
LicensePlate | Fordonets registreringsnummer |
Tillstånd | Ett tillstånd i USA |
Tillverka | Tillverkaren av bilen |
Modell | Bilens modellnummer |
VehicleType | Antingen 1 för personbilar eller 2 för nyttofordon |
WeightType | Fordonsvikt i ton; 0 för personbilar |
Toll | Avgiftsvärdet i USD |
Tagg | E-taggen på bilen som automatiserar betalningen; tomt där betalningen gjordes manuellt |
Avsluta dataström
Slutdataströmmen innehåller information om bilar som lämnar vägtullstationen. Utgångsdatahändelserna strömmas live till en händelsehubb från en webbapp som ingår i exempelappen.
TollId | ExitTime | LicensePlate |
---|---|---|
1 | 2014-09-10T12:03:00.0000000Z | JNB 7001 |
1 | 2014-09-10T12:03:00.0000000Z | YXZ 1001 |
3 | 2014-09-10T12:04:00.0000000Z | ABC 1004 |
2 | 2014-09-10T12:07:00.0000000Z | XYZ 1003 |
1 | 2014-09-10T12:08:00.00000000Z | BNJ 1007 |
2 | 2014-09-10T12:07:00.0000000Z | CDE 1007 |
Här är en kort beskrivning av kolumnerna:
Kolumn | beskrivning |
---|---|
TollID | Det avgiftsbelagda monter-ID som unikt identifierar en avgiftsbelagd monter |
ExitTime | Datum och tid för avslut av fordonet från avgiftsbelagd monter i UTC |
LicensePlate | Fordonets registreringsnummer |
Registreringsdata för nyttofordon
Lösningen använder en statisk ögonblicksbild av en registreringsdatabas för kommersiella fordon. Dessa data sparas som en JSON-fil i Azure Blob Storage, som ingår i exemplet.
LicensePlate | RegistrationId | Upphörd |
---|---|---|
SVT 6023 | 285429838 | 1 |
XLZ 3463 | 362715656 | 0 |
BAC 1005 | 876133137 | 1 |
RIV 8632 | 992711956 | 0 |
SNY 7188 | 592133890 | 0 |
ELH 9896 | 678427724 | 1 |
Här är en kort beskrivning av kolumnerna:
Kolumn | beskrivning |
---|---|
LicensePlate | Fordonets registreringsnummer |
RegistrationId | Fordonets registrerings-ID |
Upphörd | Fordonets registreringsstatus: 0 om fordonsregistreringen är aktiv, 1 om registreringen har upphört att gälla |
Konfigurera miljön för Azure Stream Analytics
För att slutföra den här lösningen behöver du en Microsoft Azure-prenumeration. Om du inte har något Azure-konto kan du begära en kostnadsfri utvärderingsversion.
Följ stegen i avsnittet "Rensa ditt Azure-konto" i slutet av den här artikeln så att du kan använda din Azure-kredit på bästa sätt.
Distribuera exemplet
Det finns flera resurser som enkelt kan distribueras i en resursgrupp tillsammans med några få klick. Lösningsdefinitionen finns på GitHub-lagringsplatsen på https://github.com/Azure/azure-stream-analytics/tree/master/Samples/TollApp.
Distribuera TollApp-mallen i Azure Portal
Om du vill distribuera TollApp-miljön till Azure använder du den här länken för att distribuera TollApp Azure-mall.
Logga in på Azure Portal om du uppmanas att göra det.
Välj den prenumeration där de olika resurserna faktureras.
Ange en ny resursgrupp med ett unikt namn, till exempel
MyTollBooth
.Välj en Azure-plats.
Ange ett intervall som ett antal sekunder. Det här värdet används i exempelwebbappen för hur ofta data skickas till en händelsehubb.
Kontrollera om du vill godkänna villkoren.
Välj Fäst på instrumentpanelen så att du enkelt kan hitta resurserna senare.
Välj Köp för att distribuera exempelmallen.
Efter en stund visas ett meddelande som bekräftar att distributionen lyckades.
Granska Azure Stream Analytics TollApp-resurser
Logga in på Azure-portalen.
Leta upp resursgruppen som du namngav i föregående avsnitt.
Kontrollera att följande resurser visas i resursgruppen:
- Ett Azure Cosmos DB-konto
- Ett Azure Stream Analytics-jobb
- Ett Azure Storage-konto
- En Azure-händelsehubb
- Två webbappar
Granska TollApp-exempeljobbet
Från och med resursgruppen i föregående avsnitt väljer du Stream Analytics-strömningsjobbet som börjar med namnet
tollapp
(namnet innehåller slumpmässiga tecken för unikhet).På sidan Översikt för jobbet ser du rutan Fråga för att visa frågesyntaxen.
SELECT TollId, System.Timestamp AS WindowEnd, COUNT(*) AS Count INTO CosmosDB FROM EntryStream TIMESTAMP BY EntryTime GROUP BY TUMBLINGWINDOW(minute, 3), TollId
Om du vill parafrasera syftet med frågan ska vi säga att du måste räkna antalet fordon som anger en avgiftsbelagd monter. Eftersom en vägtullsbås har en kontinuerlig ström av fordon som kommer in, är det entréhändelser analoga med en ström som aldrig stannar. För att kvantifiera strömmen måste du definiera en "tidsperiod" för att mäta över. Låt oss förfina frågan ytterligare, till "Hur många fordon kommer in i en avgiftsbelagd monter var tredje minut?" Detta kallas ofta för rullande antal.
Som du ser använder Azure Stream Analytics ett frågespråk som liknar SQL och lägger till några tillägg för att ange tidsrelaterade aspekter av frågan. Mer information finns i avsnittet om tidshantering och fönsterkonstruktioner som används i frågan.
Granska indata för TollApp-exempeljobbet. Endast EntryStream-indata används i den aktuella frågan.
- EntryStream-indata är en händelsehubbanslutning som köar data som representerar varje gång en bil går in i en vägtull på motorvägen. En webbapp som ingår i exemplet skapar händelserna och dessa data placeras i kö i den här händelsehubben. Observera att indata efterfrågas i FROM-satsen för strömningsfrågan.
- ExitStream-indata är en händelsehubbanslutning som köar data som representerar varje gång en bil lämnar en vägtull på motorvägen. Den här strömmande indata används i senare varianter av frågesyntaxen.
- Registreringsindata är en Azure Blob Storage-anslutning som pekar på en statisk registration.json fil som används för sökningar efter behov. Den här referensdatainmatningen används i senare varianter av frågesyntaxen.
Granska utdata för TollApp-exempeljobbet.
- Azure Cosmos DB-utdata är en Azure Cosmos DB-databascontainer som tar emot utdatamottagarens händelser. Observera att dessa utdata används i INTO-satsen i strömningsfrågan.
Starta TollApp-strömningsjobbet
Följ dessa steg för att starta strömningsjobbet:
På sidan Översikt för jobbet väljer du Start.
I fönstret Starta jobb väljer du Nu.
Efter en liten stund, när jobbet körs, visar du diagrammet Övervakning på sidan Översikt för strömningsjobbet. Diagrammet bör visa flera tusen indatahändelser och tiotals utdatahändelser.
Granska Azure Cosmos DB-utdata
Leta upp resursgruppen som innehåller TollApp-resurserna.
Välj Azure Cosmos DB-kontot med namnmönstret tollapp<random-cosmos>.
Välj rubriken Datautforskaren för att öppna sidan Datautforskaren.
Expandera tollAppDatabase tollAppCollection-dokument.>>
I listan över ID:er visas flera dokument när utdata är tillgängliga.
Välj varje ID för att granska JSON-dokumentet. Observera varje
tollid
,windowend time
ochcount of cars
från det fönstret.Efter ytterligare tre minuter är en annan uppsättning med fyra dokument tillgängliga, ett dokument per
tollid
.
Rapportera total tid för varje bil
Den genomsnittliga tid som krävs för att en bil ska passera vägtullen hjälper till att bedöma effektiviteten i processen och kundupplevelsen.
Om du vill hitta den totala tiden ansluter du EntryTime-strömmen till ExitTime-strömmen. Anslut de två indataströmmarna till kolumnerna TollId och LicensePlate. JOIN-operatorn kräver att du anger tidsmässigt spelrum som beskriver den godkända tidsskillnaden mellan de anslutna händelserna. Använd funktionen DATEDIFF för att ange att händelserna inte ska vara längre än 15 minuter från varandra. Använd också funktionen DATEDIFF för att avsluta och ange tider för att beräkna den faktiska tid som en bil spenderar i vägtullstationen. Observera skillnaden i användningen av DATEDIFF när den används i en SELECT-instruktion i stället för ett JOIN-villkor .
SELECT EntryStream.TollId, EntryStream.EntryTime, ExitStream.ExitTime, EntryStream.LicensePlate, DATEDIFF (minute, EntryStream.EntryTime, ExitStream.ExitTime) AS DurationInMinutes
INTO CosmosDB
FROM EntryStream TIMESTAMP BY EntryTime
JOIN ExitStream TIMESTAMP BY ExitTime
ON (EntryStream.TollId= ExitStream.TollId AND EntryStream.LicensePlate = ExitStream.LicensePlate)
AND DATEDIFF (minute, EntryStream, ExitStream ) BETWEEN 0 AND 15
Så här uppdaterar du frågesyntaxen för TollApp-strömningsjobbet:
På sidan Översikt för jobbet väljer du Stoppa.
Vänta en stund på meddelandet om att jobbet har stoppats.
Under rubriken JOBBTOPOLOGI väljer du <> Fråga
Klistra in den justerade strömmande SQL-frågan.
Spara frågan genom att välja Spara . Bekräfta Ja för att spara ändringarna.
På sidan Översikt för jobbet väljer du Start.
I fönstret Starta jobb väljer du Nu.
Granska den totala tiden i utdata
Upprepa stegen i föregående avsnitt för att granska Azure Cosmos DB-utdata från strömningsjobbet. Granska de senaste JSON-dokumenten.
I det här dokumentet visas till exempel en bil med en viss registreringsskylt, entrytime
fältet och exit time
, och det BERÄKNADE durationinminutes
DATEIFF-fältet som visar varaktigheten för avgiftsbelagda bås som två minuter:
{
"tollid": 4,
"entrytime": "2018-04-05T06:51:39.0491173Z",
"exittime": "2018-04-05T06:53:09.0491173Z",
"licenseplate": "JVR 9425",
"durationinminutes": 2,
"id": "ff52eb25-d580-7566-2879-1f52bba6601e",
"_rid": "+8E4AI1DZgBjAAAAAAAAAA==",
"_self": "dbs/+8E4AA==/colls/+8E4AI1DZgA=/docs/+8E4AI1DZgBjAAAAAAAAAA==/",
"_etag": "\"ad02f6b8-0000-0000-0000-5ac5c8330000\"",
"_attachments": "attachments/",
"_ts": 1522911283
}
Rapportera fordon med förfallen registrering
Azure Stream Analytics kan använda statiska ögonblicksbilder av referensdata för att ansluta till temporala dataströmmar. Använd följande exempelfråga för att demonstrera den här funktionen. Registreringsindata är en statisk blob-json-fil som visar förfallodatum för licenstaggar. Genom att ansluta på registreringsskylten jämförs referensdata med varje fordon som passerar genom vägtullen båda.
Om ett nyttofordon är registrerat hos vägtullföretaget kan det passera genom avgiftsbåset utan att stoppas för inspektion. Använd uppslagstabellen för registrering för att identifiera alla kommersiella fordon som har upphört att registreras.
SELECT EntryStream.EntryTime, EntryStream.LicensePlate, EntryStream.TollId, Registration.RegistrationId
INTO CosmosDB
FROM EntryStream TIMESTAMP BY EntryTime
JOIN Registration
ON EntryStream.LicensePlate = Registration.LicensePlate
WHERE Registration.Expired = '1'
Upprepa stegen i föregående avsnitt för att uppdatera frågesyntaxen för TollApp-strömmande jobb.
Upprepa stegen i föregående avsnitt för att granska Azure Cosmos DB-utdata från strömningsjobbet.
Exempel på utdata>
{
"entrytime": "2018-04-05T08:01:28.0252168Z",
"licenseplate": "GMT 3221",
"tollid": 1,
"registrationid": "763220582",
"id": "47db0535-9716-4eb2-db58-de7886966cbf",
"_rid": "y+F8AJ9QWACSAQAAAAAAAA==",
"_self": "dbs/y+F8AA==/colls/y+F8AJ9QWAA=/docs/y+F8AJ9QWACSAQAAAAAAAA==/",
"_etag": "\"88007d8d-0000-0000-0000-5ac5d7e20000\"",
"_attachments": "attachments/",
"_ts": 1522915298
}
Skala ut jobbet
Azure Stream Analytics är utformat för elastisk skalning så att det kan hantera stora mängder data. Azure Stream Analytics-frågan kan använda en PARTITION BY-sats för att meddela systemet att det här steget skalar ut. PartitionId är en särskild kolumn som systemet lägger till för att matcha partitions-ID för indata (händelsehubb).
Om du vill skala ut frågan till partitioner redigerar du frågesyntaxen till följande kod:
SELECT TollId, System.Timestamp AS WindowEnd, COUNT(*)AS Count
INTO CosmosDB
FROM EntryStream
TIMESTAMP BY EntryTime
PARTITION BY PartitionId
GROUP BY TUMBLINGWINDOW(minute,3), TollId, PartitionId
Så här skalar du upp strömningsjobbet till fler strömningsenheter:
Stoppa det aktuella jobbet.
Uppdatera frågesyntaxen på <> sidan Fråga och spara ändringarna.
Under rubriken KONFIGURERA för direktuppspelningsjobbet väljer du Skala.
Skjut skjutreglaget för strömningsenheter från 1 till 6. Strömningsenheter definierar mängden beräkningskraft som jobbet kan ta emot. Välj Spara.
Starta strömningsjobbet för att demonstrera den ytterligare skalan. Azure Stream Analytics distribuerar arbete över fler beräkningsresurser och uppnår bättre dataflöde och partitionerar arbetet mellan resurser med hjälp av kolumnen som anges i PARTITION BY-satsen.
Övervaka jobbet
Området MONITOR innehåller statistik om det jobb som körs. Första gången konfiguration krävs för att använda lagringskontot i samma region (namntull som resten av det här dokumentet).
Du kan också komma åt aktivitetsloggar från området Inställningar för jobbinstrumentpanelen.
Rensa TollApp-resurserna
Stoppa Stream Analytics-jobbet i Azure Portal.
Leta upp resursgruppen som innehåller åtta resurser som är relaterade till TollApp-mallen.
Välj Ta bort resursgrupp. Ange namnet på resursgruppen för att bekräfta borttagningen.
Slutsats
Den här lösningen introducerade dig för Azure Stream Analytics-tjänsten. Den visade hur du konfigurerar indata och utdata för Stream Analytics-jobbet. Med hjälp av scenariot med avgiftsbelagda data förklarade lösningen vanliga typer av problem som uppstår i utrymmet för data i rörelse och hur de kan lösas med enkla SQL-liknande frågor i Azure Stream Analytics. Lösningen beskrev SQL-tilläggskonstruktioner för att arbeta med temporala data. Den visade hur du ansluter dataströmmar, hur du berikar dataströmmen med statiska referensdata och hur du skalar ut en fråga för att uppnå högre dataflöde.
Även om den här lösningen ger en bra introduktion är den inte komplett på något sätt. Du hittar fler frågemönster med hjälp av SAQL-språket i Frågeexempel för vanliga Stream Analytics-användningsmönster.