你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:使用 Visual Studio Code 创建流分析作业

在本快速入门中,你将在本地计算机上使用用于 Visual Studio Code 的 Azure 流分析 (ASA) 工具扩展创建、运行和提交 ASA 作业。 了解如何生成一个 ASA 作业,该作业从 IoT 中心读取实时流数据,并筛选温度高于 27° 的事件。 输出结果将发送到 Blob 存储中的文件。 在本快速入门中使用的输入数据由 Raspberry Pi 联机模拟器生成。

注意

Visual Studio Code 工具不支持“中国东部”、“中国北部”、“德国中部”和“德国东北部”区域中的作业。

先决条件

安装 Azure 流分析工具扩展

  1. 打开 Visual Studio Code (VS Code)。

  2. 在左窗格上的“扩展”中搜索“流分析”,然后选择“Azure 流分析工具”扩展对应的“安装”。

    该屏幕截图显示了 Visual Studio Code 的“扩展”页,其中包含安装流分析扩展的选项。

  3. 安装后,在活动栏上选择 Azure 图标,并登录到 Azure。

    该屏幕截图显示了如何登录到 Azure。

  4. 登录后,可以在 Azure 帐户下看到订阅。

注意

每次打开 VS Code 时,ASA 工具扩展都会自动登录。 如果你的帐户已启用双重身份验证,则我们建议使用手机身份验证,而不要使用 PIN 码。 若要注销 Azure 帐户,请按 Ctrl + Shift + P 并输入 Azure: Sign Out

运行 IoT 模拟器

  1. 打开 Raspberry Pi Azure IoT 联机模拟器

  2. 将第 15 行的占位符替换为在上一部分保存的 Azure IoT 中心设备连接字符串。

  3. 选择“运行”。 输出会显示传感器数据和发送到 IoT 中心的消息。

    该屏幕截图显示了包含示例查询的“Raspberry Pi Azure IoT 联机模拟器”页。

    重要

    几分钟后选择“重置”以重置连接字符串。

创建 Blob 存储

  1. 从 Azure 门户的左上角选择“创建资源”>“存储”>“存储帐户”

    该屏幕截图显示了“创建存储帐户”菜单。

  2. 在“创建存储帐户”窗格中,输入存储帐户名称、位置和资源组。 选择与创建的 IoT 中心相同的位置和资源组。 然后选择“查看并创建”以创建存储帐户。

    该屏幕截图显示了“创建存储帐户”页。

  3. 在“存储帐户”页上,选择左侧菜单中的“容器”,然后在命令栏上选择“+ 容器”。

    该屏幕截图显示了“容器”页。

  4. 在“新建容器”页中,提供容器的名称,将“公共访问级别”保留为“专用(无匿名访问)”,然后选择“确定”。

    该屏幕截图显示了 blob 容器创建页。

创建流分析项目

  1. 在 Visual Studio Code 中,按 Ctrl+Shift+P 并输入“ASA: 创建新项目”。

    该屏幕截图显示了在命令面板中选择“ASA: 创建新项目”。

  2. 输入项目名称(例如 myASAproj),然后选择项目的文件夹

    该屏幕截图显示了输入 ASA 项目名称。

  3. ASA 项目将添加到你的工作区中。 该项目由以下三个文件夹组成:“输入”、“输出”和“函数”。 它还具有查询脚本 (*.asaql)、JobConfig.json 文件和 asaproj.json 配置文件

    该屏幕截图显示了 Visual Studio Code 中的流分析项目文件。

    asaproj.json 文件包含用于将流分析作业提交到 Azure 的输入、输出和作业配置设置。

    注意

    从命令面板添加输入和输出时,相应路径将自动添加到 asaproj.json 中。 如果直接在磁盘上添加或者删除输入或输出,则需要在 asaproj.json 中手动添加或删除。 可以选择将输入和输出放在一个放置,然后通过在每个 asaproj.json 文件中指定路径,在不同的作业中引用这些输入和输出

定义转换查询

  1. 打开 myASAproj.asaql 文件并添加以下查询:

    SELECT *
    INTO Output
    FROM Input
    WHERE Temperature > 27
    

    该屏幕截图显示了转换查询。

配置作业输入

  1. 右键单击流分析项目中的“输入”文件夹。 然后从上下文菜单中选择“ASA:添加输入”。

    该屏幕截图显示了 Visual Studio Code 中的“ASA: 添加输入”菜单。

    或按 Ctrl+Shift+P 打开命令面板,然后输入“ASA: 添加输入”。

  2. 选择“IoT 中心”作为输入类型。

    该屏幕截图显示了在 VS Code 命令面板中选择 IoT 中心。

  3. 从下拉菜单中选择“从 Azure 订阅中选择”,然后按 ENTER

  4. 在“输入”中输入名称,然后按 ENTER。

  5. 在 “输入”文件夹下,可以看到已创建 IoTHub1.json 文件。

  6. 在 JSON 文件中,确认“输入”中输入的是指定的名称。

  7. 在 Input.json 的 JSON 编辑器中,选择“从订阅中选择”,然后选择具有 IoT 中心的 Azure 订阅。

    显示 JSON 编辑器的屏幕截图,其中显示了“从订阅中选择”链接。

  8. 在 JSON 编辑器中,选择“选择 IoT 中心“,然后选择创建的 IoT 中心。

    显示 JSON 编辑器的屏幕截图,其中显示了“选择 IoT 中心”链接。

  9. 默认情况下,SharedAccessPolicyName 应设置为 iothubowner。 如果没有,请选择“选择共享访问策略名称”链接,然后从下拉列表中选择“iothubowner“。

  10. 应会自动设置 SharedAccessPolicyKey 值。

  11. 选择“预览数据”以查看是否已为作业成功配置输入数据。 此操作将提取 IoT 中心的示例并在预览窗口中显示。

    该屏幕截图显示了 IoT 中心中输入数据的预览版。

配置作业输出

  1. 在资源管理器中右键单击“输出”,然后选择“ASA: 添加输出”。
  2. 在下拉列表中选择“Data Lake Storage Gen2/Blob 存储”作为接收器类型
  3. 选择“从 Azure 订阅选择”
  4. 在“输出”中输入别名的名称,然后按 Enter。 此输出名称用于查询中的 INTO 语句。
  5. 在 Output.json 的 JSON 编辑器中,选择“从订阅中选择”,然后选择具有 Azure 存储帐户的 Azure 订阅
  6. 如果需要更改自动填充的存储帐户,请选择“选择存储帐户”,然后选择 Azure 存储帐户。 如果在同一订阅中创建存储帐户名称,则会自动将其删除。
  7. 如果需要更改容器名称,请选择“选择容器”,然后选择创建的 Blob 容器。

该屏幕截图显示了流分析作业的输出配置。

编译脚本并提交到 Azure

脚本编译检查语法并生成 Azure 资源管理器模板,以便自动部署。

  1. 右键单击资源管理器窗口中的脚本文件,指向“ASA: 编译脚本”,然后选择“ASA: ARM 模板 V2(建议)”。

    该屏幕截图显示了 VS Code 中的流分析资源管理器中的脚本编译选项。

  2. 编译完成后,可以在项目下看到一个 Deploy 文件夹,其中包含两个 Azure 资源管理器模板。 这两个文件用于自动部署。

    该屏幕截图显示了项目文件夹中生成的部署模板。

  3. 在查询编辑器中,选择“提交到 Azure”。

    屏幕截图显示了用于将流分析作业提交到 Azure 的“提交作业”按钮。

  4. 在“提交”窗口中,执行以下步骤:

    1. 选择 Azure 订阅

    2. 选择 Azure 资源组

    3. 为“区域”选择要在其中创建流分析作业的区域

    4. 然后,选择“提交”。

      屏幕截图显示“提交”选项。

  5. 选择“发布到 Azure”,完成相应步骤。 等待它打开新选项卡“云作业视图”,其中显示作业状态。

    屏幕截图显示了 VS Code 中的“发布到 Azure”按钮。

启动流分析作业并检查输出

  1. 在“云作业视图”选项卡上,选择“启动”以在云中运行作业。

    该屏幕截图显示了“云视图”页中的“启动作业”按钮。

  2. 在“启动流式处理作业”窗口中,选择“确定”。 本过程可能需要几分钟才能完成。

  3. 如果作业成功启动,作业状态将更改为“正在运行”。 可以看到显示 ASA 作业运行情况的逻辑图。

    显示 VS Code 中作业运行状态的屏幕截图。

  4. 若要查看输出结果,可以在 Visual Studio Code 扩展或 Azure 门户中打开 Blob 存储。

    该屏幕截图显示了 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"}}
    

清理资源

若不再需要资源组、流分析作业以及所有相关资源,请将其删除。 删除作业可避免对作业使用的流单元进行计费。 如果计划在将来使用该作业,可以先停止它,等到以后需要时再重启它。 如果不打算继续使用该作业,请按照以下步骤删除本快速入门创建的所有资源:

  1. 在 Azure 门户的左侧菜单中选择“资源组”,然后选择已创建资源的名称

  2. 在资源组页上,选择“删除”。 在文本框中输入要删除的资源的名称,然后选择“删除”

后续步骤

若要了解用于 Visual Studio Code 的 ASA 工具扩展,请继续阅读以下文章: