你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
在本快速入门中,你将在本地计算机上使用适用于 Visual Studio Code 的 ASA 工具扩展创建、运行和提交 Azure 流分析(ASA)作业。 了解如何生成一个 ASA 作业,该作业从 IoT 中心读取实时流数据,并筛选温度高于 27° 的事件。 输出结果将发送到 Blob 存储中的文件。 在本快速入门中使用的输入数据由 Raspberry Pi 联机模拟器生成。
注意
Visual Studio Code 工具不支持中国东部、中国北部、德国中部和德国东北部地区的作业。
先决条件
- Azure 订阅。 如果还没有 Azure 订阅,可以创建一个免费帐户。
- Visual Studio Code。
安装 Azure 流分析工具扩展
打开 Visual Studio Code (VS Code)。
在左侧窗格的“扩展”中搜索“流分析工具”,然后在“Azure Stream Analytics Tools”扩展上选择“安装”。
安装后,在活动栏上选择 Azure 图标,并登录到 Azure。
登录后,可以在 Azure 帐户下看到订阅。
注意
每次打开 VS Code 时,ASA 工具扩展都会自动登录。 如果帐户具有双重身份验证,请使用电话身份验证,而不是使用 PIN。 若要注销 Azure 帐户,请按 Ctrl + Shift + P 并输入 Azure: Sign Out。
对输入数据进行准备
在定义流分析作业之前,请准备输入数据。 该解决方案将实时传感器数据引入 IoT 中心,稍后将其配置为作业输入。 若要对作业所需的输入数据进行准备,请完成以下步骤:
登录到 Azure 门户。
选择“ 创建资源”。 在“创建资源”页中,选择“物联网”“IoT 中心”。
在“IoT 中心”页中,执行以下步骤:
- 对于“订阅”,请选择你所使用的 Azure 订阅。
- 对于“资源组”,选择现有资源组或创建新的资源组。
- 对于“IoT 中心名称”,输入你的 IoT 中心的名称。
- 对于“区域”,选择离你最近的区域。
- 对于“层”,如果你的订阅上仍可用,请选择“免费”。 有关详细信息,请参阅 IoT 中心定价。
- 对于“每日消息数量限制”,保留默认值。
- 在页面底部选择下一步:网络。
选择“查看 + 创建”。 查看 IoT 中心信息,然后选择“ 创建”。 创建 IoT 中心可能需要几分钟时间。 可以在 “通知 ”窗格中监视进度。
创建资源(IoT 中心)后,选择“ 转到资源 ”以转到“IoT 中心”页。
在“IoT 中心”页中,选择左侧菜单中的“设备”,然后选择“+ 添加设备”。
输入设备 ID,然后选择“保存”。
创建设备后,会在 IoT 设备 列表中看到设备。 如果未看到,请选择页面上的“刷新”按钮。
从列表中选择自己的设备。
在“设备”页面上,选择“主连接字符串”旁边的复制按钮,并将其保存到记事本以供稍后使用。
运行 IoT 模拟器
将第 15 行中的占位符替换为在上一部分中保存的 Azure IoT 中心设备连接字符串。
选择“运行”。 输出显示发送到 IoT 中心的传感器数据和消息。
重要
选择重置以在几分钟后重置连接字符串。
创建 Blob 存储
从 Azure 门户的左上角选择“创建资源”“存储”>“存储帐户”>。
在“创建存储帐户”窗格中,输入存储帐户名称、位置和资源组。 选择与创建的 IoT 中心相同的位置和资源组。 然后选择“查看并创建”以创建存储帐户。
在“存储帐户”页上,选择左侧菜单中的“容器”,然后在命令栏上选择“+ 容器”。
在“新建容器”页中,提供容器的名称,将“公共访问级别”保留为“专用(无匿名访问)”,然后选择“确定”。
创建流分析项目
在 Visual Studio Code 中,选择 “查看>命令面板”,然后输入 ASA:创建新项目。
输入项目名称(例如 myASAproj),然后选择项目的文件夹。
Visual Studio Code 将 ASA 项目添加到工作区。 该项目由以下三个文件夹组成:“输入”、“输出”和“函数”。 它还具有查询脚本 (*.asaql)、JobConfig.json 文件和 asaproj.json 配置文件。
asaproj.json 文件包含用于将流分析作业提交到 Azure 的输入、输出和作业配置设置。
注意
从命令面板添加输入和输出时,会自动将相应的路径添加到 asaproj.json 。 如果直接在磁盘上添加或者删除输入或输出,则需要在 asaproj.json 中手动添加或删除。 可以通过在每个 asaproj.json 文件中指定路径,将输入和输出放在一个位置,然后在不同的作业中引用它们。
定义转换查询
配置作业输入
右键单击流分析项目中的“输入”文件夹。 然后从上下文菜单中选择“ASA:添加输入”。
或按 Ctrl+Shift+P 打开命令面板,然后输入“ASA: 添加输入”。
选择“IoT 中心”作为输入类型。
从下拉菜单中选择“从 Azure 订阅中选择”,然后按 ENTER。
在“输入”中输入名称,然后按 ENTER。
在 “输入 ”文件夹下,将看到 已创建Input.json 文件。
在 JSON 文件中,确认 Input 被指定为 Name。
在 Input.json 的 JSON 编辑器中,选择“从订阅中选择”,然后选择具有 IoT 中心的 Azure 订阅。
在 JSON 编辑器中,选择“选择 IoT 中心“,然后选择创建的 IoT 中心。
默认情况下,
SharedAccessPolicyName应设置为iothubowner。 如果没有,请选择“选择共享访问策略名称”链接,然后从下拉列表中选择“iothubowner“。应该自动设置
SharedAccessPolicyKey值。选择“预览数据”以查看是否已为作业成功配置输入数据。 此操作将提取 IoT 中心的示例并在预览窗口中显示。
配置作业输出
- 在资源管理器中右键单击输出,然后选择ASA: 添加输出。
- 在下拉列表中选择“Data Lake Storage Gen2/Blob Storage”作为接收端类型。
- 请从 Azure 订阅中进行选择。
- 在“输出”中输入别名的名称,然后按 Enter。 此输出名称用于查询的INTO语句。
- 在 Output.json 的 JSON 编辑器中,选择“从您的订阅中选择”,然后选择包含 Azure 存储帐户的 Azure 订阅。
- 如果需要更改自动填充的存储帐户,请选择“选择存储帐户”,然后选择 Azure 存储帐户。 如果在同一订阅中创建存储帐户名称,则会自动将其删除。
- 如果需要更改容器名称,请选择“选择容器”,然后选择创建的 Blob 容器。
编译脚本并将其提交到 Azure
脚本编译检查语法并生成 Azure 资源管理器模板,以便自动部署。
右键单击资源管理器窗口中的脚本文件,指向“ASA: 编译脚本”,然后选择“ASA: ARM 模板 V2(建议)”。
编译完成后,可以在项目下看到一个 Deploy 文件夹,其中包含两个 Azure 资源管理器模板。 这两个文件用于自动部署。
在查询编辑器中,选择“提交到 Azure”。
在“提交”窗口中,执行以下步骤:
选择 Azure 订阅。
选择 Azure 资源组。
选择要创建流分析作业的区域。
然后,选择“提交”。
选择“发布到 Azure”,完成相应步骤。 等待它打开新选项卡“云作业视图”,其中显示作业状态。
启动流分析作业并检查输出
在“云作业视图”选项卡上,选择“启动”以在云中运行作业。
在启动流式处理作业窗口中,选择确定。 本过程可能需要几分钟才能完成。
如果作业成功启动,作业状态将更改为 “正在运行”。 你会看到一个逻辑关系图,其中显示了 ASA 作业的运行方式。
若要查看输出结果,请在 Visual Studio Code 扩展或 Azure 门户中打开 Blob 存储。
下载并打开该文件以查看输出。
{"messageId":11,"deviceId":"Raspberry Pi Web Client","temperature":28.165519323167562,"humidity":76.875393581654379,"EventProcessedUtcTime":"2022-09-01T22:53:58.1015921Z","PartitionId":3,"EventEnqueuedUtcTime":"2022-09-01T22:52:57.6250000Z","IoTHub":{"MessageId":null,"CorrelationId":null,"ConnectionDeviceId":"MyASAIoTDevice","ConnectionDeviceGenerationId":"637976642928634103","EnqueuedTime":"2022-09-01T22:52:57.6290000Z"}} {"messageId":14,"deviceId":"Raspberry Pi Web Client","temperature":29.014941877871451,"humidity":64.93477299527828,"EventProcessedUtcTime":"2022-09-01T22:53:58.2421545Z","PartitionId":3,"EventEnqueuedUtcTime":"2022-09-01T22:53:03.6100000Z","IoTHub":{"MessageId":null,"CorrelationId":null,"ConnectionDeviceId":"MyASAIoTDevice","ConnectionDeviceGenerationId":"637976642928634103","EnqueuedTime":"2022-09-01T22:53:03.6140000Z"}} {"messageId":17,"deviceId":"Raspberry Pi Web Client","temperature":28.032846241745975,"humidity":66.146114343897338,"EventProcessedUtcTime":"2022-09-01T22:53:58.2421545Z","PartitionId":3,"EventEnqueuedUtcTime":"2022-09-01T22:53:19.5960000Z","IoTHub":{"MessageId":null,"CorrelationId":null,"ConnectionDeviceId":"MyASAIoTDevice","ConnectionDeviceGenerationId":"637976642928634103","EnqueuedTime":"2022-09-01T22:53:19.5830000Z"}} {"messageId":18,"deviceId":"Raspberry Pi Web Client","temperature":30.176185593576143,"humidity":72.697359909427419,"EventProcessedUtcTime":"2022-09-01T22:53:58.2421545Z","PartitionId":3,"EventEnqueuedUtcTime":"2022-09-01T22:53:21.6120000Z","IoTHub":{"MessageId":null,"CorrelationId":null,"ConnectionDeviceId":"MyASAIoTDevice","ConnectionDeviceGenerationId":"637976642928634103","EnqueuedTime":"2022-09-01T22:53:21.6140000Z"}} {"messageId":20,"deviceId":"Raspberry Pi Web Client","temperature":27.851894248213021,"humidity":71.610229530268214,"EventProcessedUtcTime":"2022-09-01T22:53:58.2421545Z","PartitionId":3,"EventEnqueuedUtcTime":"2022-09-01T22:53:25.6270000Z","IoTHub":{"MessageId":null,"CorrelationId":null,"ConnectionDeviceId":"MyASAIoTDevice","ConnectionDeviceGenerationId":"637976642928634103","EnqueuedTime":"2022-09-01T22:53:25.6140000Z"}} {"messageId":21,"deviceId":"Raspberry Pi Web Client","temperature":27.718624694772238,"humidity":66.540445035685153,"EventProcessedUtcTime":"2022-09-01T22:53:58.2421545Z","PartitionId":3,"EventEnqueuedUtcTime":"2022-09-01T22:53:48.0820000Z","IoTHub":{"MessageId":null,"CorrelationId":null,"ConnectionDeviceId":"MyASAIoTDevice","ConnectionDeviceGenerationId":"637976642928634103","EnqueuedTime":"2022-09-01T22:53:48.0830000Z"}} {"messageId":22,"deviceId":"Raspberry Pi Web Client","temperature":27.7849054424326,"humidity":74.300662748167085,"EventProcessedUtcTime":"2022-09-01T22:54:09.3393532Z","PartitionId":3,"EventEnqueuedUtcTime":"2022-09-01T22:54:09.2390000Z","IoTHub":{"MessageId":null,"CorrelationId":null,"ConnectionDeviceId":"MyASAIoTDevice","ConnectionDeviceGenerationId":"637976642928634103","EnqueuedTime":"2022-09-01T22:54:09.2400000Z"}} {"messageId":28,"deviceId":"Raspberry Pi Web Client","temperature":30.839892925680324,"humidity":76.237611741451786,"EventProcessedUtcTime":"2022-09-01T22:54:47.8053253Z","PartitionId":3,"EventEnqueuedUtcTime":"2022-09-01T22:54:47.6180000Z","IoTHub":{"MessageId":null,"CorrelationId":null,"ConnectionDeviceId":"MyASAIoTDevice","ConnectionDeviceGenerationId":"637976642928634103","EnqueuedTime":"2022-09-01T22:54:47.6150000Z"}} {"messageId":29,"deviceId":"Raspberry Pi Web Client","temperature":30.561040300759053,"humidity":78.3845172058103,"EventProcessedUtcTime":"2022-09-01T22:54:49.8070489Z","PartitionId":3,"EventEnqueuedUtcTime":"2022-09-01T22:54:49.6030000Z","IoTHub":{"MessageId":null,"CorrelationId":null,"ConnectionDeviceId":"MyASAIoTDevice","ConnectionDeviceGenerationId":"637976642928634103","EnqueuedTime":"2022-09-01T22:54:49.5990000Z"}} {"messageId":31,"deviceId":"Raspberry Pi Web Client","temperature":28.163585438418679,"humidity":60.0511571297096,"EventProcessedUtcTime":"2022-09-01T22:55:25.1528729Z","PartitionId":3,"EventEnqueuedUtcTime":"2022-09-01T22:55:24.9050000Z","IoTHub":{"MessageId":null,"CorrelationId":null,"ConnectionDeviceId":"MyASAIoTDevice","ConnectionDeviceGenerationId":"637976642928634103","EnqueuedTime":"2022-09-01T22:55:24.9120000Z"}} {"messageId":32,"deviceId":"Raspberry Pi Web Client","temperature":31.00503387156985,"humidity":78.68821066044552,"EventProcessedUtcTime":"2022-09-01T22:55:43.2652127Z","PartitionId":3,"EventEnqueuedUtcTime":"2022-09-01T22:55:43.0480000Z","IoTHub":{"MessageId":null,"CorrelationId":null,"ConnectionDeviceId":"MyASAIoTDevice","ConnectionDeviceGenerationId":"637976642928634103","EnqueuedTime":"2022-09-01T22:55:43.0520000Z"}}
清理资源
不再需要资源时,请删除资源组、流分析作业和所有相关资源。 删除作业将停止对作业消耗的流处理单元计费。 如果计划在将来使用该作业,可以在需要时停止该作业,并在以后重新启动它。 如果不打算继续使用该作业,请按照以下步骤删除本快速入门创建的所有资源:
在 Azure 门户的左侧菜单中选择“资源组”,然后选择已创建资源的名称。
在资源组页上,选择“删除”。 在文本框中输入要删除的资源的名称,然后选择“删除”。
后续步骤
若要详细了解适用于 Visual Studio Code 的 ASA 工具扩展,请参阅以下文章: