典型的物联网架构中,有实时数据分析的需求,在Azure中,流分析(stream analytics)就是这样的服务,它可以存在云中或者部署到边缘设备上。

流分析的基本概念:

https://v.qq.com/x/page/o3034qra1zz.html

实战案例:

对物联网传感器数据进行实时分析,每30秒监视一次传感器上报的平均温度,高于100度时报警,报警的方式是将报警的传感器及其温度值直接写入到Sql DB。

实战内容:

https://v.qq.com/x/page/g3034ntojf8.html

云中的实时流式处理

•为物联网解决方案执行实时分析

•每秒对数百万事件进行流式处理

•获得关键任务的可靠性和性能预测结果

•利用设备和应用程序的数据,创建实时仪表板和警报

•跨多个数据流进行关联

•使用常见的基于 SQL 的语言,以实现快速开发

比如我们要使用流分析完成如下的需求:

每30秒监视一次传感器上报的平均温度,高于100度时报警。通常情况下,我们将流分析部署于云端,在IoT Hub之后,从IoT Hub接收设备数据进行在线分析。

在这个场景中,如果我们的传感器有成千上万,每个传感器上传的数据大部分又都是低于100°C的,这些数据实际上对我们来说,没有意义,所以我们还会期待,在设备侧直接进行分析,然后讲分析过滤后的数据,上传到IoT Hub,一来降低数据传输的成本,二来对数据进行过滤,保证数据质量,这也就是流分析的第二种部署方式:部署到边缘

下面介绍流分析的几个重要概念:

1.输入:目前支持Azure EventHub事件中心,Azure IoT Hub, Azure Blob 存储三个源。

输入分两种类型:

将数据推送到数据源后,流分析作业就可使用该数据并对其进行实时处理。 输入分为两种类型:流输入(stream inputs)和引用输入(referenceinputs)。

  • 流输入是指:数据流是一段时间内不受限制的事件序列。 流分析作业必须至少包含一个数据流输入。 事件中心、IoT 中心和 Blob 存储均可作为数据流输入源。

  • 引用输入是指:引用数据是完全静态的或更改缓慢。 它通常用于执行关联和查找。 例如,可以将数据流输入中的数据联接到引用数据中的数据,就像执行SQL 联接以查找静态值一样。 当前支持将Azure Blob 存储和 Azure SQL 数据库作为参考数据的输入源。

2.输出:

SQL Database,Blob Storage, Event Hub, Table Storage, Service Bus Queues, Service Bus Topics,Cosmos DB等等。

具体请参见 :

https://docs.azure.cn/zh-cn/stream-analytics/stream-analytics-define-outputs

3. 查询:

查询是使用类似SQL的语法进行数据过滤和计算。支持4种窗口函数:

翻转开窗函数用于将数据流划分成不同的时间段并对其执行某个函数,如以下示例所示。 翻转窗口的主要差异在于它们会重复,不重叠,并且一个事件不能属于多个翻转窗口。

跳跃开窗函数在一段固定的时间内向前跳跃。 人们往往将此类窗口视为可以重叠的翻转窗口,因此一个事件可以属于多个跳跃窗口结果集。 要使跳跃窗口与翻转窗口相同,需将跃点大小指定为与窗口大小相同。

不同于翻转或跳跃窗口,滑动开窗函数只在事件发生时生成输出。 每个窗口至少有一个事件,并且窗口持续根据€ (epsilon) 向前移动。 与跳跃窗口一样,事件可以属于多个滑动窗口。

会话窗口函数对差不多同时到达的事件进行分组,筛选出没有数据的时间段。 它具有三个主要参数:超时、最长持续时间和分区键(可选)。

实战内容:请参照本文开头的视频。

实战中用到的修改后的代码:

import random
import time
import sys

# Using the Python Device SDK for IoT Hub:
# https://github.com/Azure/azure-iot-sdk-python
# The sample connects to a device-specific MQTT endpoint on your IoT Hub.
import iothub_client
# pylint: disable=E0611
from iothub_client import IoTHubClient, IoTHubClientError, IoTHubTransportProvider, IoTHubClientResult
from iothub_client import IoTHubMessage, IoTHubMessageDispositionResult, IoTHubError, DeviceMethodReturnValue

# The device connection string to authenticate the device with your IoT hub.
# Using the Azure CLI:
# az iot hub device-identity show-connection-string --hub-name {YourIoTHubName} --device-id MyNodeDevice --output table
CONNECTION_STRING = "HostName=iothubforsatest.azure-devices.cn;DeviceId=test0002;SharedAccessKey=vnYkfQ4znJqVow9ZeBsooyj5kYeJs96etpcUoQI/FwQ="

# Using the MQTT protocol.
PROTOCOL = IoTHubTransportProvider.MQTT
MESSAGE_TIMEOUT = 10000

# Define the JSON message to send to IoT Hub.
TEMPERATURE = 0.0
HUMIDITY = 60
MSG_TXT = "{\"temperature\": %.2f,\"humidity\": %.2f,\"deviceid\": 'test0002'}"

def send_confirmation_callback(message, result, user_context):
print ( "IoT Hub responded to message with status: %s" % (result) )

def iothub_client_init():
# Create an IoT Hub client
client = IoTHubClient(CONNECTION_STRING, PROTOCOL)
return client

def iothub_client_telemetry_sample_run():

try:
client = iothub_client_init()
print ( "IoT Hub device sending periodic messages, press Ctrl-C to exit" )

while True:
# Build the message with simulated telemetry values.
temperature = TEMPERATURE + (random.random() * 15)
humidity = HUMIDITY + (random.random() * 20)
msg_txt_formatted = MSG_TXT % (temperature, humidity)
message = IoTHubMessage(msg_txt_formatted)

# Add a custom application property to the message.
# An IoT hub can filter on these properties without access to the message body.
prop_map = message.properties()
if temperature > 30:
prop_map.add("temperatureAlert", "true")
else:
prop_map.add("temperatureAlert", "false")

# Send the message.
print( "Sending message: %s" % message.get_string() )
client.send_event_async(message, send_confirmation_callback, None)
time.sleep(3)

except IoTHubError as iothub_error:
print ( "Unexpected error %s from IoTHub" % iothub_error )
return
except KeyboardInterrupt:
print ( "IoTHubClient sample stopped" )

if __name__ == '__main__':
print ( "IoT Hub Quickstart #1 - Simulated device" )
print ( "Press Ctrl-C to exit" )
iothub_client_telemetry_sample_run()
 

示例的查询:

select System.Timestamp AS OutPutTime, deviceid AS DeviceName,Avg(temperature) AS temp into windowoutput from inputiot TIMESTAMP BY EventProcessedUtcTime GROUP BY SlidingWindow(second,30), deviceid HAVING Avg(temperature)>30;

本实战基本流程为:

1.创建 IoTHub和模拟设备

2.创建流分析服务

3.创建SqlDatabase(作为输出)

3.配置流分析的输入

4.配置流分析的输出

5.设计Query

6.检查实时分析结果

注意事项:

输出至SQL DB时,表必须提前创建好;

表中必须涵盖所有输出字段。

流分析 Stream Analytics-实时数据流式处理,可处理来自数百万台 IoT 设备的数据的更多相关文章

  1. Cuda Stream流分析

    Cuda Stream流分析 Stream 一般来说,cuda c并行性表现在下面两个层面上: Kernel level Grid level Stream和event简介 Cuda stream是指 ...

  2. 为 Azure IoT Edge 设备部署 Azure Stream Analytics 服务

    在前面的两篇文章<Azure IoT Edge on Windows 10 IoT Core>和<Azure IoT Edge on Raspberry Pi 3 with Rasp ...

  3. 使用Oracle Stream Analytics 21步搭建大数据实时流分析平台

    概要: Oracle Stream Analytics(OSA)是企业级大数据流实时分析计算平台.它可以通过使用复杂的关联模式,扩充和机器学习算法来自动处理和分析大规模实时信息.流式传输的大数据可以源 ...

  4. 精通Web Analytics 2.0 (5) 第三章:点击流分析的奇妙世界:指标

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第三章:点击流分析的奇妙世界:指标 新的Web Analytics 2.0心态:搞定它.新的闪亮系列工具:是的.准备好了吗?当然 ...

  5. 精通Web Analytics 2.0 (6) 第四章:点击流分析的奇妙世界:实际的解决方案

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第四章:点击流分析的奇妙世界:实际的解决方案 到开始实际工作的时候了.哦耶! 在本章中,您将了解到一些最重要的网络分析报告,我将 ...

  6. Azure IOT (EventHub + Stream Analytics + Table Storage)的使用

    最近研究利用Azure的 Event hub ,Stream Analytics和TableStorage来实现IOT的一个方案, 利用Event hub来采集传感器设备数据值,然后输入到Stream ...

  7. 使用Power BI API 向流数据集推送实时数据并在仪表板可视化

    使用Power BI 实现实时数据的可视化是大家比较关心的一个话题,在仪表盘上实现推送数据的展示,可以在诸如指挥大屏等场景下使用. 本视频实战内容如下: https://v.qq.com/x/page ...

  8. Storm实战:在云上搭建大规模实时数据流处理系统(Storm+Kafka)

    在大数据时代,数据规模变得越来越大.由于数据的增长速度和非结构化的特性,常用的软硬件工具已无法在用户可容忍的时间内对数据进行采集.管理和处理.本文主要介绍如何在阿里云上使用Kafka和Storm搭建大 ...

  9. h264码流分析及其工具

    总的来说H264的码流的打包方式有两种,一种为annex-b byte stream format的格式,这个是绝大部分编码器的默认输出格式,就是每个帧的开头的3~4个字节是H264的start_co ...

随机推荐

  1. mysql8.0.13安装、使用教程图解

    mysql8.0.13安装.使用教程图解 MySQL是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Manageme ...

  2. python3之递归实例

    一.利用递归求: 1+2+3+4+5...+n的前n项和 def recursion_sum_1(n): #当n = 1:和为1 #否则,n的和等同于 n + (n -1) if n == 1: re ...

  3. 2019-9-10:渗透测试,基础学习,nmap扫描命令,php基本语法学习,笔记

    nmap参数-sT,使用tcp全连接的方式 ,扫描过程需要三次握手,建立链接,则说明端口开放,扫描速度慢-sS,使用syn的数据包去检测,接收到ACK说明端口开放-sN,null扫描,发出去的数据包不 ...

  4. Lab4\5:进程和线程

    进程的定义 进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程 源代码在经过编译链接之后生成了可执行文件,再由操作系统进行加载并且进行一些堆栈的分配才是进程 进程控制块 操作系统管理 ...

  5. Anaconda中启动Python时的错误:UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 553

    今天,在Anaconda prompt启动python遇到了如下错误: UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xaf in positi ...

  6. centos 7 MysSQL 5.6.39 二进制安装

    MySQL 5.6.39 二进制安装 CentOS 7 将默认数据库MySQL替换成了Mariadb. 这里会从系统的环境准备开始一步一步安装. 环境准备 系统版本 内核版本 IP地址 Centos ...

  7. warning: rpmts_HdrFromFdno: Header V4 DSA/SHA1 Signature, key ID XXXXXX: NOKEY

    我在使用Centos时,会出现这种错误: 本人实践有效的办法是: 加上"--nogpgcheck"参数 就是在你要执行的语句后面加上该参数就行了! 我当时是为了安装jenkins时 ...

  8. 深入 .NET Core 基础 - 2:共享框架

    深入 .NET Core 基础 - 2:共享框架 原文地址:https://natemcmaster.com/blog/2018/08/29/netcore-primitives-2/ 共享框架从 . ...

  9. gulp+webpack+angular1的一点小经验(第一部分gulp与webpack的整合)

    时间匆匆如流水继上周熟悉了gulp的初步安装与环境配置以后,我的项目又进入了新的阶段! 这篇文章将把我这一周遇到的一些问题,以及解决的方式做一个小小的总结,不一定记的完整,但都是个人的一点经验,分享给 ...

  10. 带着canvas去流浪系列之九 粒子动画

    [摘要] canvas实现粒子动画 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 粒子特效 粒子特效一般指密集点阵效果,它并不是canvas独有 ...