Azure-数据工程权威指南-四-

255 阅读57分钟

Azure 数据工程权威指南(四)

原文:The Definitive Guide to Azure Data Engineering

协议:CC BY-NC-SA 4.0

十九、部署数据工厂更改

使用 Azure DevOps 持续集成和部署流程的最佳实践将 Azure Data Factory 从一个环境部署到另一个环境的迫切需求为成功完成部署流程带来了许多复杂性。在本章中,我将介绍如何利用 PowerShell 脚本和 Azure 资源组部署任务来启动/停止 ADF 触发器,并通过 Azure DevOps 的 Azure 数据工厂 CI/CD 更改的端到端部署来更改 ADF 环境连接配置属性。

先决条件

要继续这个练习,你需要一些必备的 Azure 资源。本节展示了在构建端到端 CI/CD 流程之前必须创建和运行的内容。

图 19-1 显示了一个包含一些 Azure 资源的 DEV 资源组的图像。类似地,图 19-2 显示了一个 QA 资源组的图像,它包含与 DEV 资源组相同的 Azure 资源。在本练习中,您将重点关注通过自动化的 DevOps CI/CD 管道将 ADF 变更从一个环境部署到另一个环境。对于这个练习,您需要手动创建 QA 数据工厂。您还需要一个 DEV 和 QA 密钥库,它将存储本章中用到的相关凭证和秘密。另请注意,还创建了 SQL Server、SQL 数据库和 ADLS Gen2 帐户,主要是为了显示较低环境(DEV)中的资源与较高环境(QA)中的资源的一致性,并将这些资源用作 DEV 资源组的 ADF 中的链接服务连接,该 ADF 将部署到 QA ADF。

创建如图 19-1 所示的开发资源组。该资源组将包含下层环境(DEV) Azure 数据工厂、ADLS Gen2 和 SQL 数据库,其更改将作为 DevOps CI/CD 管道的一部分持续部署到上层环境(QA)。

img/511918_1_En_19_Fig1_HTML.jpg

图 19-1

Azure 门户开发资源组

然后创建如图 19-2 所示的 QA 资源组。该资源组将包含上层环境(QA) Azure 数据工厂、ADLS Gen2 和 SQL 数据库。

img/511918_1_En_19_Fig2_HTML.jpg

图 19-2

Azure 门户 QA 资源组

在图 19-3 所示的 DEV 资源组和图 19-4 所示的 QA 资源组中创建以下密钥库帐户机密。请注意,出于部署目的,DEV 和 QA 帐户中的机密名称必须相同。然而,实际的秘密在开发和 QA 之间是独特的:

  • ls-adls2-akv :这将包含 DEV 和 QA ADLS Gen2 账户的访问密钥,可在各自的 DEV 和 QA 数据湖存储账户的访问密钥部分找到。

  • ls-sql-akv :这将包含用于验证目的的开发和 QA Azure SQL 服务器和数据库的管理员密码。

图 19-3 显示了您在 DEV 资源组中创建并启用的秘密。

img/511918_1_En_19_Fig3_HTML.jpg

图 19-3

Azure 门户开发密钥保管库机密

类似地,图 19-4 显示了您在 QA 资源组中创建和启用的秘密。

img/511918_1_En_19_Fig4_HTML.jpg

图 19-4

Azure 门户 QA 密钥库机密

在 DEV 密钥库内,记住通过添加密钥库访问策略来授予 DEV 数据工厂对密钥库的 get 和 list 权限访问,如图 19-5 所示。

img/511918_1_En_19_Fig5_HTML.jpg

图 19-5

Azure 门户开发密钥库访问策略

类似地,在 QA 密钥库中,记得通过添加密钥库访问策略来授予 QA 数据工厂对密钥库的 get 和 list 权限,如图 19-6 所示。

img/511918_1_En_19_Fig6_HTML.jpg

图 19-6

Azure 门户 QA 密钥库访问策略

出于测试目的,在开发数据工厂中创建以下链接服务,如图 19-7 所示。

img/511918_1_En_19_Fig7_HTML.jpg

图 19-7

开发数据工厂中的链接服务

以下是 Azure 数据湖存储链接服务连接的 JSON 脚本:

{
    "name": "LS_AzureDataLakeStorage",
    "properties": {
        "annotations": [],
        "type": "AzureBlobFS",
        "typeProperties": {
            "url": "https://adls2dev.dfs.core.windows.net",
            "accountKey": {
                "type": "AzureKeyVaultSecret",
                "store": {
                    "referenceName": "LS_AzureKeyVault",
                    "type": "LinkedServiceReference"
                },
                "secretName": "ls-adls2-akv",
                "secretVersion": ""
            }
        }
    }
}

以下是 Azure Key Vault 链接服务连接的 JSON 脚本:

{
    "name": "LS_AzureKeyVault",
    "properties": {
        "annotations": [],
        "type": "AzureKeyVault",
        "typeProperties": {
            "baseUrl": "https://rl-kv-001-dev.vault.azure.net/"
        }
    }
}

以下是 Azure SQL 数据库链接服务连接的 JSON 脚本:

{
    "name": "LS_AzureSqlDatabase",
    "type": "Microsoft.DataFactory/factories/linkedservices",
    "properties": {
        "annotations": [],
        "type": "AzureSqlDatabase",
        "typeProperties": {
            "connectionString": "Integrated Security=False;Encrypt=True;Connection Timeout=30;Data Source=rl-sqlserver-001-dev.database.windows.net;Initial Catalog=rl-sql-001-dev;User ID=devadmin",
            "password": {
                "type": "AzureKeyVaultSecret",
                "store": {
                    "referenceName": "LS_AzureKeyVault",
                    "type": "LinkedServiceReference"
                },
                "secretName": "ls-sql-akv"
            }
        }
    }
}

图 19-8 显示了您将需要在开发数据工厂中启动的触发器,用于测试目的并演示触发器如何影响从一个环境到另一个环境的 ADF 变更的部署,例如,它将需要由 Azure DevOps CI/CD 管道停止并重新启动。图 19-8 将帮助你理解这个触发器将存在于何处。

img/511918_1_En_19_Fig8_HTML.jpg

图 19-8

开发数据工厂中的触发器

一旦添加了链接的服务连接和触发器,发布 DEV 数据工厂以将更改提交到 adf_publish 分支,并为 DevOps CI/CD 流程做准备。请注意,这个方法将使用 adf_publish 分支,而不是 CI/CD 部署流程的主分支。请确认数据工厂的添加和变更已经发布到 GitHub repo 中的 adf_publish 分支,如图 19-9 所示。

img/511918_1_En_19_Fig9_HTML.jpg

图 19-9

发布到 adf_publish 分支的更改

最后,添加示例预部署和后部署脚本,它包含在 ADF ( https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment#script )中微软关于持续集成和交付的文章的底部。还要确保将文件添加到与图 19-10 所示的 DEV ADF 资源相同的文件夹中,并将其命名为 cicd。ps1 。这个文件的详细内容也可以在我的 GitHub repo ( https://github.com/ronlesteve/demo-dev-adf/blob/adf_publish/rl-adf-001-dev/cicd.ps1 )中找到。

img/511918_1_En_19_Fig10_HTML.jpg

图 19-10

部署前和部署后脚本示例

创建 DevOps 持续集成构建管道

在创建所有必要的先决条件后,您可以通过在 Azure DevOps pipelines 中单击“新建管道”来开始创建 Azure DevOps 持续集成构建管道,如图 19-11 所示。

img/511918_1_En_19_Fig11_HTML.jpg

图 19-11

新构建管道

选择图 19-12 所示用户界面底部的“使用经典编辑器”链接,以避免使用 YAML 代码创建管道。作为参考,YAML 是一种人类可读的数据序列化语言,通常用于配置文件和存储或传输数据的应用中。

img/511918_1_En_19_Fig12_HTML.jpg

图 19-12

使用经典编辑器

选择 GitHub,因为那是保存代码报告的地方。同时选择回购名称和 adf_publish 分支,如图 19-13 所示。

img/511918_1_En_19_Fig13_HTML.jpg

图 19-13

选择 GitHub 源和回购详细信息

从一个空的作业模板开始,如图 19-14 所示。

img/511918_1_En_19_Fig14_HTML.jpg

图 19-14

从一个空的作业模板开始

单击代理作业上的+图标添加新任务。还要添加发布构建工件任务,这可以在图 19-15 中看到。

img/511918_1_En_19_Fig15_HTML.jpg

图 19-15

添加发布构建工件任务

配置发布构建工件任务,如图 19-16 所示,然后点击保存&队列,启动运行管道的过程。

img/511918_1_En_19_Fig16_HTML.jpg

图 19-16

配置发布构建工件任务

验证图 19-17 中的运行管线细节,并点击运行开始手动运行管线。

img/511918_1_En_19_Fig17_HTML.jpg

图 19-17

运行管道

一旦作业成功完成运行,验证工件是否已经发布,如图 19-18 所示。

img/511918_1_En_19_Fig18_HTML.jpg

图 19-18

验证已发布的工件

正如所料,图 19-19 所示的文件夹似乎包含了创建和配置发布管道所需的所有工件。

img/511918_1_En_19_Fig19_HTML.jpg

图 19-19

Azure DevOps 中发布的工件

创建 DevOps 持续部署发布渠道

既然已经成功完成并验证了持续集成(CI)构建管道,那么是时候创建新的持续部署(CD)发布管道了。如图 19-20 所示,点击新建发布管道开始此过程。

img/511918_1_En_19_Fig20_HTML.jpg

图 19-20

新发布管道

点击添加工件,如图 19-21 所示。请注意,在图表中,您还可以在必要时设置自动运行计划。工件可能由项目源代码、依赖项、二进制文件或资源组成。对于这个场景,工件将直接来自您在构建阶段创建的输出。

img/511918_1_En_19_Fig21_HTML.jpg

图 19-21

添加工件

选择“构建”作为来源类型。另外,选择在上一节中创建的构建管道,并填充额外的必需细节,如图 19-22 所示。最后,单击添加完成这一步。

img/511918_1_En_19_Fig22_HTML.jpg

图 19-22

添加构建工件详细信息

接下来,添加一个阶段,如图 19-23 所示。阶段由作业和任务组成,您可以将管道中的部署作业组织成阶段,这些阶段是发布管道中的主要部分。

img/511918_1_En_19_Fig23_HTML.png

图 19-23

添加一个阶段

从图 19-24 所示的空作业模板开始。作业是作为一个单元按顺序运行的一系列步骤,每个管道必须至少有一个作业。

img/511918_1_En_19_Fig24_HTML.jpg

图 19-24

从一个空的作业模板开始

接下来,点击链接添加任务,如图 19-25 所示。任务是定义管道中自动化的构建块。任务只是一个打包的脚本或过程,已经用一组输入进行了抽象。

img/511918_1_En_19_Fig25_HTML.png

图 19-25

添加任务的链接

首先添加一个 Azure PowerShell 脚本任务,如图 19-26 所示。这将用于停止数据工厂触发器。

img/511918_1_En_19_Fig26_HTML.jpg

图 19-26

Azure PowerShell 脚本任务

另外增加一个 ARM 模板部署任务,如图 19-27 所示。这将用于将数据工厂工件和参数部署到期望的环境中。

img/511918_1_En_19_Fig27_HTML.jpg

图 19-27

ARM 模板部署任务

最后,还要添加另一个 Azure PowerShell 任务,如图 19-28 。这将用于重新启动数据工厂触发器。

img/511918_1_En_19_Fig28_HTML.jpg

图 19-28

Azure PowerShell 任务重新启动 ADF 触发器

在配置之前,确保所有三个任务按照图 19-29 所示的顺序组织。第一个 PowerShell 脚本任务将停止您在 DEV ADF 中创建的 ADF 触发器。第二个 ARM 模板部署任务将 ADF 更改从开发环境部署到 QA 环境,第三个 PowerShell 脚本任务将重新启动触发器。

img/511918_1_En_19_Fig29_HTML.jpg

图 19-29

组织代理作业任务

Azure PowerShell 任务停止触发器

开始配置 Azure PowerShell 脚本,停止 QA 环境中的数据工厂触发器,如图 19-30 所示。确保脚本路径指向您在先决条件步骤中添加到 GitHub repo 的 cicd.ps1 文件。

img/511918_1_En_19_Fig30_HTML.png

图 19-30

配置 Azure PowerShell 脚本以停止 ADF 触发器

请确保添加脚本路径和参数。以下是您在图 19-30 中看到的数值:

预部署脚本路径:应为全限定路径或相对于默认工作目录,如以下代码所示:

$(System.DefaultWorkingDirectory)/_ADF-Demo-Project-CI1/dev/cicd.ps1

预部署脚本参数:传递给 PowerShell 的附加参数,可以是序号参数,也可以是命名参数,如以下代码所示:

-armTemplate "$(System.DefaultWorkingDirectory)/_ADF-Demo-Project-CI1/dev/ARMTemplateForFactory.json" -ResourceGroupName rl-rg-001-dev -DataFactoryName rl-adf-001-dev -predeployment $true -deleteDeployment $false

ARM 模板部署任务

这个发布管道任务将使用您从构建管道发布到 DevOps 工件的开发数据工厂的模板和模板参数来增量更新 QA 资源组。这些工件在开发数据工厂中发布,并提交到 adf_publish 分支 GitHub repo。务必选择合适的armtemplateforfactory . JSONarmtemplateparametersforfactory . JSON文件,如图 19-31 所示。

img/511918_1_En_19_Fig31_HTML.png

图 19-31

创建或更新资源组的任务

一旦图 19-31 中的所有其他 Azure 细节配置完成,通过点击…图标选择覆盖模板参数,如图 19-32 所示。

img/511918_1_En_19_Fig32_HTML.jpg

图 19-32

覆盖模板参数

部署任务中定义了以下模板和参数,如图 19-31 和 19-32 所示:

部署模板:指定指向 Azure 资源管理器模板的路径或模式。有关模板的更多信息,请访问以下网址( https://aka.ms/azuretemplates ),),要开始使用示例模板,请访问以下网址: https://aka.ms/sampletemplate

$(System.DefaultWorkingDirectory)/_ADF-Demo-Project-CI1/dev/ARMTemplateForFactory.json.

模板参数:确保选择指向 Azure 资源管理器模板参数文件的路径或模式:

$(System.DefaultWorkingDirectory)/_ADF-Demo-Project-CI1/dev/ARMTemplateParametersForFactory.json

覆盖模板参数:覆盖模板参数文本框旁边的“…”将显示模板参数。您还可以在文本框中键入要覆盖的模板参数,例如,–storageName fabrikam –adminUsername $(vmusername) -adminPassword $(password) –azureKeyVaultName $(fabrikamFibre).如果您将使用的参数值有多个单词,请确保用引号将它们括起来,即使您使用变量传递它们,例如,-name " parameter value "-name 2 " $(var)"。要覆盖对象类型参数,请使用字符串化的 JSON 对象,例如,-options[" option 1 "]-map { " key 1 ":" value 1 " }。

-factoryName "rl-adf-001-qa" -LS_AzureSqlDatabase_connectionString "Integrated Security=False;Encrypt=True;Connection Timeout=30;Data Source=rl-sqlserver-001-qa.database.windows.net;Initial Catalog=rl-sql-001-qa;User ID=qaadmin" -LS_AzureDataLakeStorage_properties_typeProperties_url "https://adls2qa.dfs.core.windows.net" -LS_AzureKeyVault_properties_typeProperties_baseUrl "https://rl-kv-001-qa.vault.azure.net/"

将覆盖模板参数更改为图 19-33 所示的 QA 资源和连接属性,并点击确定保存配置设置。

img/511918_1_En_19_Fig33_HTML.jpg

图 19-33

将覆盖模板参数更改为 QA

Azure PowerShell 任务启动触发器

最后,配置 Azure PowerShell 脚本以在 QA 环境中启动数据工厂触发器。确保脚本路径指向您在先决条件步骤中添加到 GitHub repo 的 cicd.ps1 文件。如图 19-34 所示。

img/511918_1_En_19_Fig34_HTML.png

图 19-34

重新启动 ADF 触发器的 PowerShell 任务

另外,将以下部署后脚本路径添加到任务配置中,如图 19-34 所示:

$(System.DefaultWorkingDirectory)/_ADF-Demo-Project-CI1/dev/cicd.ps1

您还需要将以下部署后脚本参数添加到任务配置中,如图 19-34 所示:

-armTemplate "$(System.DefaultWorkingDirectory)/_ADF-Demo-Project-CI1/dev/ARMTemplateForFactory.json" -ResourceGroupName rl-rg-001-dev -DataFactoryName rl-adf-001-dev -predeployment $false -deleteDeployment $true

运行发布管道

添加和配置如图 19-35 所示的持续部署(CD)发布管道任务后,运行发布管道。

img/511918_1_En_19_Fig35_HTML.jpg

图 19-35

运行发布管道

不出所料,图 19-36 显示释放成功。

img/511918_1_En_19_Fig36_HTML.jpg

图 19-36

发布成功

导航到图 19-37 所示的日志后,验证发布管道中的所有步骤都已成功完成。

img/511918_1_En_19_Fig37_HTML.jpg

图 19-37

代理作业部署流程成功

验证部署的数据工厂资源

作为确保 QA 数据工厂更改已正确部署的最后一项检查,导航到 QA 数据工厂并检查链接的服务连接。正如所料,请注意图 19-38 中所示的三个链接的服务连接。

img/511918_1_En_19_Fig38_HTML.jpg

图 19-38

ADF QA 链接的服务连接

此外,还添加并启动了一个触发器。这是在增量 DevOps CI/CD 过程中将要停止和重新启动的触发器,如图 19-39 所示。

img/511918_1_En_19_Fig39_HTML.jpg

图 19-39

处于“已启动”状态的 ADF QA 触发器

进一步深入,注意数据湖的连接字符串已经改变,并且连接已经成功测试,如图 19-40 所示。

img/511918_1_En_19_Fig40_HTML.jpg

图 19-40

ADF QA 与 ADLS Gen2 的连接

图 19-41 显示密钥库连接也被更改为 QA 并已成功测试。

img/511918_1_En_19_Fig41_HTML.jpg

图 19-41

更新了与密钥库的 ADF QA 连接

最后,请注意,SQL Server 和数据库连接也被更改为 QA,并且测试连接已被成功验证,如图 19-42 所示。

img/511918_1_En_19_Fig42_HTML.jpg

图 19-42

到 SQL Server 和数据库的 ADF QA 连接已更新

摘要

在本章中,我演示了如何使用 PowerShell 脚本和 Azure 资源组部署任务来启动/停止 ADF 触发器,并通过 Azure DevOps 的 Azure 数据工厂 CI/CD 更改的端到端部署来更改 ADF 环境连接配置属性。有关本练习的更多信息,特别是要找到本章涉及的示例,请访问以下 URL 查看我的 GitHub repo:https://github.com/ronlesteve/demo-dev-adf/tree/adf_publish。对于为 ADF 管道部署 JSON 的替代方法,除了 ARM 模板部署,探索发布 ADF 任务( https://marketplace.visualstudio.com/items?itemName=SQLPlayer.DataFactoryTools ),该任务可以在 Visual Studio marketplace 中找到,并且可以作为任务添加到 Azure DevOps CI/CD 管道中。

二十、部署 SQL 数据库

开发和测试应用的 DevTest 环境与生产环境之间的基础结构差异和不一致性是 IT 专业人员和软件开发人员可能会遇到的常见情况。尽管应用最初是以正确的方式部署的,但是对生产环境所做的配置更改可能会导致差异。客户经常会问,是否有一种无缝的方式来自动创建 Azure 资源,同时确保跨多个环境的一致性。

基础设施即代码是创建模板的过程,该模板定义并随应用一起部署环境,以确保一致性。Azure 资源管理器(ARM)是 Azure 的部署和管理服务。它提供了一致的管理层,使您能够创建、更新和删除 Azure 订阅中的资源。部署后,您可以使用其访问控制、审计和标记功能来保护和组织您的资源。

通过使用 ARM 模板,您可以通过声明性模板而不是脚本来管理您的基础架构,并作为一个组来部署、管理和监控您的解决方案的所有资源,而不是单独处理这些资源。此外,您可以在整个开发生命周期中重复部署您的解决方案,并且确信您的资源以一致的状态部署。

Visual Studio 中有几个源代码管理选项。GitHub 是这些源代码控制选项之一,它提供了许多好处,包括高级安全选项。集成多个应用,如 Visual Studio、GitHub、Azure DevOps 和 Azure SQL 数据库,以实现无缝 CI/CD 流程,这是许多企业在实现数据和基础架构平台现代化的过程中日益增长的需求。在本章中,我将展示图 20-1 所示架构流程的端到端解决方案,通过 GitHub 存储库将 AdventureWorksLT2019 数据库从 Visual Studio 部署到 Azure SQL 数据库,然后通过 Azure DevOps 构建(CI)和发布(CD)管道进行部署。

img/511918_1_En_20_Fig1_HTML.jpg

图 20-1

使用 GitHub repo 和 Visual Studio Azure SQL 数据库项目的 Azure DevOps CI/CD

先决条件

在您开始图 20-1 所示的架构模式的开发和部署过程之前,您需要创建以下先决资源:

  1. SSDT 版 Visual Studio 2019:您将使用 Visual Studio 2019 和 SSDT 版 Visual Studio 来部署这个数据库项目解决方案。你可以从这个网址下载最新版本的 Visual Studio:https://visualstudio.microsoft.com/downloads/。此外,您可以从以下网址下载 SQL Server Data Tools(SSDT)for Visual Studio:https://docs.microsoft.com/en-us/sql/ssdt/download-sql-server-data-tools-ssdt?view=sql-server-ver15

  2. GitHub 帐户和回购:由于您将把您的 Visual Studio 项目与 GitHub 源代码控制帐户相关联,因此您可以使用该 URL 来了解更多有关如何在 GitHub ( www.wikihow.com/Create-an-Account-on-GitHub )中创建帐户的信息。此外,您可以从这个 URL: https://docs.github.com/en/enterprise/2.16/user/github/getting-started-with-github/create-a-repo 了解更多关于如何创建 GitHub repo 的信息。

  3. Azure DevOps 帐户和项目:最后,您将需要一个 Azure DevOps 帐户和项目,用于构建 CI/CD 流程。您可以使用以下 URL 作为参考来创建组织和项目: https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/create-organization?view=azure-devops

创建 Visual Studio SQL 数据库项目

首先在 Visual Studio 2019 中创建新的 SQL 数据库项目,如图 20-2 所示。在项目中,您将导入示例 AdventureWorks 数据库。

img/511918_1_En_20_Fig2_HTML.jpg

图 20-2

创建 VS 项目的步骤

接下来,图 20-3 显示了您应该如何通过输入项目名称、位置和解决方案来配置和创建新的 SQL 数据库项目。

img/511918_1_En_20_Fig3_HTML.jpg

图 20-3

配置项目的步骤

安装 Visual Studio GitHub 扩展

由于这个 Visual Studio 解决方案将链接到 GitHub 源代码控制库,您将需要安装如图 20-4 所示的 GitHub 扩展,这将把 GitHub 流引入 Visual Studio。

img/511918_1_En_20_Fig4_HTML.jpg

图 20-4

安装 GitHub 扩展的步骤

此时,您应该关闭 Visual Studio 以完成 GitHub 扩展安装,这将启动如图 20-5 所示的安装。

img/511918_1_En_20_Fig5_HTML.jpg

图 20-5

显示扩展安装程序的图像

导入 AdventureWorks 数据库

重新打开 Visual Studio 项目,导入 AdventureWorksLT2019 Dacpac 文件,如图 20-6 所示。您可以从以下 URL 下载 AdventureWorks 示例数据库,用于导入过程: https://docs.microsoft.com/en-us/sql/samples/adventureworks-install-configure?view=sql-server-ver15&tabs=ssms

img/511918_1_En_20_Fig6_HTML.jpg

图 20-6

导入数据层的步骤

点击数据层应用选项后,会出现如图 20-7 所示的导入数据层应用文件界面,您需要选择合适的 Dacpac 文件并点击开始。

img/511918_1_En_20_Fig7_HTML.jpg

图 20-7

步骤 2 导入数据层 Dacpac

点击完成继续导入过程,如图 20-8 所示。请注意,状态和导入步骤显示在这个摘要 UI 中。

img/511918_1_En_20_Fig8_HTML.jpg

图 20-8

摘要导入进度的图像

一旦导入了数据层应用,模式将作为文件夹列在 SQL Server 数据库项目中,如图 20-9 所示。

img/511918_1_En_20_Fig9_HTML.jpg

图 20-9

AdventureWorks 解决方案项目的图像

确保从图 20-10 中的数据库项目属性 GUI 将数据库项目目标平台设置为 Microsoft Azure SQL Database。

img/511918_1_En_20_Fig10_HTML.jpg

图 20-10

项目属性和目标平台的图像

连接到 GitHub Repo 源代码控制

现在项目已经被导入并配置好了,将解决方案添加到 GitHub 源代码控制中,如图 20-11 所示。开始连接过程时,会要求您登录 GitHub。

img/511918_1_En_20_Fig11_HTML.jpg

图 20-11

向源代码管理添加解决方案的步骤

此时,继续从 Visual Studio GUI 提示符连接到 GitHub,如图 20-12 所示,使用您的 GitHub 凭证登录。

img/511918_1_En_20_Fig12_HTML.jpg

图 20-12

登录 GitHub 的步骤

会出现一个提示,授权 Visual Studio 和 GitHub 集成在一起。查看配置设置,然后点击授权 github,如图 20-13 所示。

img/511918_1_En_20_Fig13_HTML.png

图 20-13

授权 Visual Studio 的步骤

将 Visual Studio 解决方案签入 GitHub Repo

现在,解决方案已经添加到 GitHub 存储库中,单击 home,然后单击 sync,将解决方案签入并同步到 GitHub 存储库中,如图 20-14 所示。

img/511918_1_En_20_Fig14_HTML.jpg

图 20-14

同步到回购的步骤

此时,验证同步细节并点击发布,如图 20-15 所示,将解决方案同步到所需的 GitHub repo。

img/511918_1_En_20_Fig15_HTML.jpg

图 20-15

发布到回购的步骤

成功发布同步设置后,验证 Visual Studio 解决方案是否已签入选定的 GitHub repo 和分支。在图 20-16 中,注意解决方案和数据库已经被登记到存储库中。

img/511918_1_En_20_Fig16_HTML.jpg

图 20-16

GitHub repo 的图像

从 GitHub 安装 Azure 管道

既然已经将 Azure GitHub 与 Visual Studio 集成在一起,那么是时候从 GitHub Marketplace 安装 Azure Pipelines 来将 GitHub 与 Azure DevOps 集成在一起了。前往市场,搜索并点击 Azure Pipelines,如图 20-17 所示,这将导航到 Azure Pipelines 设置页面。

img/511918_1_En_20_Fig17_HTML.jpg

图 20-17

添加 Azure 管道

Azure Pipelines 自动构建和测试代码项目,以使它们对其他人可用。它几乎适用于任何语言或项目类型。Azure Pipelines 结合了持续集成(CI)和持续交付(CD ),以持续一致地测试和构建您的代码,并将其发送到任何目标。通过点击图 20-18 所示的设置计划来设置 Azure Pipelines 计划。

img/511918_1_En_20_Fig18_HTML.jpg

图 20-18

建立 Azure 管道计划

查看定价详情( https://azure.microsoft.com/en-us/pricing/details/devops/azure-devops-services/ )了解更多关于 Azure DevOps 管道的详情。我通常建议从免费层开始,并根据需要进行扩展。在这个练习中,您可以选择免费帐户,它有许多免费的好处。点击免费安装,如图 20-19 所示,开始 Azure 管道安装过程。

img/511918_1_En_20_Fig19_HTML.jpg

图 20-19

安装 Azure 管道计划的步骤

您将被要求检查您的订单,然后完成订单以开始安装。请注意图 20-20 中的内容,使用免费计划,您将不会按月支付任何费用。

img/511918_1_En_20_Fig20_HTML.jpg

图 20-20

完成 Azure 管道安装计划的步骤

此时,选择是将 Azure Pipelines 安装到所有还是选定的存储库,点击安装,如图 20-21 所示。请注意,读写访问权限显示在安装页面上。

img/511918_1_En_20_Fig21_HTML.jpg

图 20-21

安装 Azure 管道的步骤

出现提示时,选择您的 Azure DevOps 管道项目和组织,点击继续,如图 20-22 所示。

img/511918_1_En_20_Fig22_HTML.png

图 20-22

设置 Azure 管道项目

出现提示时,授权 Azure Pipelines 和 GitHub 之间的集成,如图 20-23 所示。

img/511918_1_En_20_Fig23_HTML.jpg

图 20-23

授权 Azure 管道的步骤

从 GitHub Repo 构建 CI 管道

现在,您已经准备好从 GitHub repo 构建一个持续集成(CI)管道了。点击使用经典编辑器,如图 20-24 所示,创建没有 YAML 的构建管道。

img/511918_1_En_20_Fig24_HTML.jpg

图 20-24

选择代码位置的步骤

请注意,还有一个选项是创建需要 YAML 代码的 YAML 管道。想了解更多关于 YAML 的信息,我推荐阅读这篇文章,在 www.cloudbees.com/blog/yaml-tutorial-everything-you-need-get-started/ 几分钟内开始了解 YAML。图 20-25 展示了一个 YAML 代码块的示例,以及你如何编写和配置它作为一个新的管道选项运行。在本练习中,使用经典编辑器创建管道。

img/511918_1_En_20_Fig25_HTML.jpg

图 20-25

显示 YAML 代码选项的图像

对于不使用 YAML 的经典选项,从空工单开始,如图 20-26 所示。

img/511918_1_En_20_Fig26_HTML.jpg

图 20-26

选择一个空作业模板

接下来,选择 GitHub 作为源。请注意图 20-27 中有许多可用的信号源选项可供选择。此外,选择所需的回购和分支。

还有一些额外的可用设置,通常设置为图 20-27 中列出的默认值。这些选项包括以下内容:

img/511918_1_En_20_Fig27_HTML.jpg

图 20-27

选择 GitHub 源

  • Clean :允许您在构建运行之前对私有代理的工作目录进行各种清理。

  • 标记源代码:允许您在构建完成后标记源代码文件,以识别每个文件的哪个版本包含在完成的构建中。

  • 报告构建状态:在源存储库上显示一个标记,指示构建是成功还是失败。

  • 签出子模块:签出您的 Git 子模块,如果它们在同一个存储库中或者在一个公共存储库中。

  • 从 LFS 检出文件:配置本地工作目录,但跳过同步源。

  • 不同步源:限制从每个远程分支历史的尖端获取指定数量的提交,并允许您在获取深度选项中指定提交数量。

搜索并添加 MSBuild 任务到管道中,如图 20-28 所示。此任务将生成 Visual Studio 解决方案。

img/511918_1_En_20_Fig29_HTML.jpg

图 20-29

MSBuildConfig 的图像

img/511918_1_En_20_Fig28_HTML.jpg

图 20-28

添加 MSBuild 任务

验证图 20-29 中所示的 MSBuild 配置。**/*的相对通配符路径。sln 足以识别解决方案文件。

另外,添加如图 20-30 所示的复制文件任务,该任务将文件复制到工件暂存目录。空的源文件夹指定了存储库的根目录。在 Contents 中,*复制指定源文件夹中的所有文件,*复制指定源文件夹中的所有文件以及所有子文件夹中的所有文件, * *从任何 bin 文件夹中递归复制所有文件。最后,使用变量构建目标文件夹。

img/511918_1_En_20_Fig30_HTML.jpg

图 20-30

添加复制文件任务

在复制文件任务中,验证图 20-31 所示的可用配置选项。

img/511918_1_En_20_Fig31_HTML.jpg

图 20-31

拷贝文件配置的图像

最后,添加如图 20-32 所示的发布构建工件任务,将暂存目录工件发布到 Azure 管道。

img/511918_1_En_20_Fig32_HTML.jpg

图 20-32

添加发布构建工件的步骤

验证图 20-33 中所示的发布构建工件配置。注意,要发布的路径是由一个变量指定的。

img/511918_1_En_20_Fig33_HTML.jpg

图 20-33

显示发布构建工件配置的步骤

验证构建管道任务的顺序是否正确,如图 20-34 所示。点击&保存队列。

img/511918_1_En_20_Fig34_HTML.jpg

图 20-34

构建任务摘要

验证图 20-35 所示的运行管线参数,点击保存并运行。

img/511918_1_En_20_Fig35_HTML.jpg

图 20-35

运行管道任务配置的图像

注意图 20-36 中的构建管道摘要,它包含了工作的细节和状态。

img/511918_1_En_20_Fig36_HTML.jpg

图 20-36

构建管道摘要

代理作业完成运行后,您将能够确认成功的作业状态。图 20-37 中的绿色复选框表示工作中所有任务步骤的成功完成。

img/511918_1_En_20_Fig37_HTML.jpg

图 20-37

构建作业摘要的图像

从 DevOps 项目报告中释放 CD 管道

既然已经创建并成功部署了构建管道,那么是时候创建发布管道了。首先添加一个发布管道工件,如图 20-38 所示。

img/511918_1_En_20_Fig38_HTML.jpg

图 20-38

添加发布工件的步骤

选择构建工件作为源类型,如图 20-39 所示。请注意其他可用的来源选项,其中包括各种来源回购。完成其他必需详细信息的配置,然后单击添加。

img/511918_1_En_20_Fig39_HTML.jpg

图 20-39

将构建工件添加到发布中

当提示选择模板时,为该阶段添加一个空作业。这可以通过点击表示空工单的蓝色链接找到,如图 20-40 所示。

img/511918_1_En_20_Fig40_HTML.jpg

图 20-40

选择空作业模板

验证图 20-41 所示的载物台属性。

img/511918_1_En_20_Fig41_HTML.jpg

图 20-41

验证阶段属性

在阶段内增加一个任务,如图 20-42 所示。

img/511918_1_En_20_Fig42_HTML.png

图 20-42

添加阶段任务

验证新发布管道中的代理作业详细信息,如图 20-43 所示。

img/511918_1_En_20_Fig43_HTML.jpg

图 20-43

发布代理配置的图像

首先添加一个 Azure Key Vault 任务,作为存储您的 SQL 数据库凭证的安全方式,这些凭证包括您的用户名和密码,它们作为秘密存储在 Azure Key Vault 中,如图 20-44 所示。

img/511918_1_En_20_Fig44_HTML.jpg

图 20-44

添加 Azure Key Vault 任务

实现这一点所需的步骤如图 20-45 所示,首先通过点击管理添加你的 Azure 订阅,然后登录到你的 Azure 帐户,从你的 Azure 订阅中选择你的密钥库帐户,最后选择秘密,在这种情况下将是登录密码登录用户

img/511918_1_En_20_Fig45_HTML.jpg

图 20-45

配置 Azure 密钥库任务

接下来,您需要添加一个 Azure SQL 数据库部署任务,如图 20-46 所示,该任务将使用 Dacpac 文件部署 Azure SQL 数据库。

img/511918_1_En_20_Fig46_HTML.jpg

图 20-46

添加 Azure SQL 数据库部署任务

填充必要的 Azure SQL 数据库部署参数,如图 20-47 所示。

img/511918_1_En_20_Fig47_HTML.jpg

图 20-47

填充必要的 Azure SQL 数据库部署参数

此外,在 Azure SQL Dacpac 任务中,选择 AdventureWorksLT2019 Dacpac 文件,该文件是从以前的构建管道中构建并存储在工件放置目录中的,如图 20-48 所示,然后单击确定。

img/511918_1_En_20_Fig48_HTML.jpg

图 20-48

选择 Dacpac 文件

继续创建新的发布管道,点击创建,如图 20-49 所示。

img/511918_1_En_20_Fig49_HTML.jpg

图 20-49

创建新版本

验证释放管道已经成功,如图 20-50 的阶段部分所示。

img/511918_1_En_20_Fig50_HTML.jpg

图 20-50

显示发布管道运行状态的图像

此外,验证代理作业初始化作业、下载工件、部署 Azure SQL Dacpac 任务以及成功完成作业的步骤。这些成功完成的代理作业步骤可以在图 20-51 中看到。

img/511918_1_En_20_Fig51_HTML.png

图 20-51

该图显示了发布代理作业摘要

验证部署的 Azure SQL AdventureWorks 数据库

在该过程的最后一步中,通过 SSMS 登录到 Azure SQL 数据库,以验证 AdventureWorksLT2019 数据库是否存在于指定的部署位置。请注意图 20-52 中的所有数据库对象都已成功部署到 Azure SQL 数据库。

img/511918_1_En_20_Fig52_HTML.jpg

图 20-52

通过 SSMS 验证 Azure SQL 数据库是否存在

摘要

在本章中,我演示了如何在 Visual Studio 中使用数据库 Dacpac 文件设计和实现一个端到端的解决方案来部署 AdventureWorksLT2019 数据库更改。该 Visual Studio 解决方案连接到 GitHub 库进行源代码控制,并链接到 Azure DevOps 管道。练习最后向您展示了如何使用 Azure DevOps 构建(CI)和发布(CD)管道,通过持续集成和部署方法将此 AdventureWorksLT2019 数据库部署到 Azure SQL 数据库。

二十一、将 Apache Spark 的 GraphFrame API 用于图形分析

图形技术使用户能够以图形的形式存储、管理和查询数据,其中实体被称为顶点或节点,实体之间的关系被称为边。图形分析支持通过查询和算法分析深度关系的能力。

Apache Spark 的 GraphFrame API 是一个 Apache Spark 包,它通过 Java、Python 和 Scala 中的高级 API 提供基于数据帧的图形,并包括用于主题查找、基于数据帧的序列化和高度表达的图形查询的扩展功能。使用 GraphFrames,您可以轻松地在图形中搜索模式,找到重要的顶点,等等。

图是一组点,称为节点或顶点,它们通过一组称为的线相互连接,如图 21-1 所示。

img/511918_1_En_21_Fig1_HTML.jpg

图 21-1

描绘边和顶点

有向图有带方向的边。这些边表示一种单向关系,即每条边只能在一个方向上遍历,如图 21-2 所示。常见的有向图是家谱树,它映射了父母和子女之间的关系。

无向图有没有方向的边,如图 21-2 。这些边表示双向关系,因为每个边都可以在两个方向上遍历。一个常见的无向图是计算机网络中的连接拓扑。该图是无向的,因为我们可以假设,如果一个设备连接到另一个设备,那么第二个设备也连接到第一个设备。值得一提的是,孤立顶点是指不是任何边的端点的顶点。

img/511918_1_En_21_Fig2_HTML.jpg

图 21-2

定向与非定向

在本章中,您将通过实现以下内容来了解使用 GraphFrame API 的实际示例:

  1. 安装 JAR 库

  2. 加载新数据表

  3. 将数据加载到数据块笔记本的数据框中

  4. 使用 GraphFrame API 运行查询和算法

安装 JAR 库

现在您已经对图形有了基本的了解,让我们开始使用 Apache Spark GraphFrame API 进行图形分析的练习。

在本章的练习中,我选择利用 Databricks 笔记本来运行图表分析。然而,您可以通过在 Synapse Analytics(https://docs.microsoft.com/en-us/azure/synapse-analytics/spark/apache-spark-job-definitions)中添加和配置 Apache Spark 作业定义,并将 GraphFrame API JAR 文件添加到 Spark 定义中,来轻松使用 Synapse Workspace 笔记本。

兼容 GraphFrame 版本的完整列表可以在这里 : https://spark-packages.org/package/graphframes/graphframes 找到。在本练习中,使用 0.8.1-spark2.4-s_2.12 版本的 JAR 文件,并将其安装在标准数据块集群的库中,如图 21-3 所示。

img/511918_1_En_21_Fig3_HTML.jpg

图 21-3

安装 JAR 库的步骤

一旦安装完成,请注意图 21-4 中的 JAR 已安装在集群上,它将用于运行后续部分中的笔记本代码。

img/511918_1_En_21_Fig4_HTML.jpg

图 21-4

带库 JAR 的集群

加载新数据表

因为 GraphFrame API JAR 和集群已经准备好了,所以通过 DBFS 上传一些数据。在本练习中,使用了 CTA 站数据和行程数据。网上有很多免费的数据集可以利用。Kaggle 是一个允许用户查找和发布数据集的网站,这里有 CTA 站数据可用: www.kaggle.com/chicago/chicago-transit-authority-cta-data .首先使用图 21-5 所示的 UI 创建 station_data 表。您也可以在我的 GitHub 存储库 GraphAnalyticsSampleFiles 中找到这些示例文件,可以从以下 URL 获得: https://github.com/ronlesteve/GraphAnalyticsSampleFiles .

img/511918_1_En_21_Fig5_HTML.jpg

图 21-5

创建站数据表

验证模式,确保选中“第一行是标题”,然后点击“创建表格”,如图 21-6 所示。

img/511918_1_En_21_Fig6_HTML.jpg

图 21-6

查看表格属性

图 21-7 显示了如何对 trip_data 执行相同的过程,并使用创建新表 UI 创建表。

img/511918_1_En_21_Fig7_HTML.jpg

图 21-7

创建行程数据表

一旦表格被创建,它们都将出现在表格部分,如图 21-8 所示。

img/511918_1_En_21_Fig8_HTML.jpg

图 21-8

验证是否创建了表

将数据加载到数据块笔记本中

现在您已经创建了数据表,运行如图 21-9 所示的 Python 代码将数据加载到两个数据框中。

img/511918_1_En_21_Fig9_HTML.jpg

图 21-9

将数据加载到数据框中

以下是您将需要在 Databricks 笔记本中运行的 Python 代码,如图 21-9 所示:

stationData = spark.sql("select * from station_data")
tripData = spark.sql("select * from trip_data")

用顶点和边构建一个图

既然数据已加载到数据框中,那么是时候定义边和折点了。由于您将创建一个有向图,图 21-10 中显示的代码定义了行程的开始和结束位置。

img/511918_1_En_21_Fig10_HTML.jpg

图 21-10

为顶点和边创建数据框

以下是您将需要在 Databricks 笔记本中运行的 Python 代码,如图 21-10 所示:

stationVertices = stationData.withColumnRenamed("station_name", "station_id").distinct()
tripEdges = tripData\
.withColumnRenamed("Start Location", "src")\
.withColumnRenamed("End Location", "dst")

接下来,您需要构建一个 GraphFrame 对象,它将使用前面定义的边和顶点数据框来表示您的图形。此外,您应该缓存数据以便以后更快地访问。图 21-11 显示了你需要运行的 Python 代码块。

img/511918_1_En_21_Fig11_HTML.jpg

图 21-11

构建图表框架

以下是您将需要在 Databricks 笔记本中运行的 Python 代码,如图 21-11 所示:

from graphframes import GraphFrame
stationGraph = GraphFrame(stationVertices, tripEdges)
stationGraph.cache()

查询图表

既然您已经上传了将要处理的数据,并且定义了您的边和顶点,那么是时候运行图 21-12 中所示的基本计数查询来了解您将要处理的数据量了。这些查询将让您了解车站总数、图表中的行程以及原始数据中的行程。从图 21-12 中的执行结果消息中注意到,大约有 354K 次行程跨越 71 个车站。

img/511918_1_En_21_Fig12_HTML.jpg

图 21-12

查询图表

以下是您将需要在 Databricks 笔记本中运行的 Python 代码,如图 21-12 所示:

print ("Total Number of Stations:" + str(stationGraph.vertices.count()))
print ("Total Number of Trips in Graph:" + str(stationGraph.edges.count()))
print ("Total Number of Trips in Original Data:" + str(tripData.count()))

为了确定哪个出发地和目的地的旅行次数最多,运行图 21-13 中所示的查询。

img/511918_1_En_21_Fig13_HTML.jpg

图 21-13

运行图表查询

以下是您将需要在 Databricks 笔记本中运行的 Python 代码,如图 21-13 所示:

from pyspark.sql.functions import desc
stationGraph.edges.groupBy("src", "dst").count().orderBy(desc("count")).show(10)

类似地,也运行图 21-14 中所示的以下查询来查找进出特定车站的车次。

img/511918_1_En_21_Fig14_HTML.jpg

图 21-14

运行更多图表查询

以下是您将需要在 Databricks 笔记本中运行的 Python 代码,如图 21-14 所示:

stationGraph.edges\
.where("src = 'Cicero-Forest Park' OR dst = 'Cicero-Forest Park'")\
.groupBy("src", "dst").count()\
.orderBy(desc("count"))\
.show(10)

寻找有图案的图案

在对图形数据运行了一些基本查询之后,下一步让我们更深入一点,通过寻找具有所谓主题的模式,这是一种在图形中表达结构模式的方式,并查询数据中的模式而不是实际数据。例如,如果您对查找数据集中在三个站点之间形成三角形的所有行程感兴趣,您可以使用以下内容:"(a)-[ab]->(b);(b)-[BC]->(c);(c)-[ca]->(a)。”基本上(a)、(b)、(c)代表你的顶点,[ab]、[bc]、[ca]代表你的被排除在查询之外的边以下面的运算符为例:(a)-[ab]->(b),如图 21-15 。

img/511918_1_En_21_Fig15_HTML.jpg

图 21-15

带图案的样品图案

可以使用自定义模式运行 motif 查询,如图 21-16 所示的代码块。

img/511918_1_En_21_Fig16_HTML.jpg

图 21-16

模体的模式算法

以下是您将需要在 Databricks 笔记本中运行的 Python 代码,如图 21-16 所示:

motifs = stationGraph.find("(a)-[ab]->(b); (b)-[bc]->(c); (c)-[ca]->(a)")
motifs.show()

一旦将主题添加到数据帧中,就可以在以下查询中使用该主题,例如,通过利用时间戳找到从站(a)到(b)到(c)再回到(a)的最短时间:

from pyspark.sql.functions import expr
motifs.selectExpr("*",
"to_timestamp(ab.`Start Date`, 'MM/dd/yyyy HH:mm') as abStart",
"to_timestamp(bc.`Start Date`, 'MM/dd/yyyy HH:mm') as bcStart",
"to_timestamp(ca.`Start Date`, 'MM/dd/yyyy HH:mm') as caStart")\
.where("ca.`Station_Name` = bc.`Station_Name`").where("ab.`Station_Name` = bc.`Station_Name`")\
.where("a.id != b.id").where("b.id != c.id")\
.where("abStart < bcStart").where("bcStart < caStart")\
.orderBy(expr("cast(caStart as long) - cast(abStart as long)"))\
.selectExpr("a.id", "b.id", "c.id", "ab.`Start Date`", "ca.`End Date`")
.limit(1).show(1, False)

用 PageRank 发现重要性

GraphFrames API 还利用图论和算法来分析数据。 PageRank 就是这样一种图形算法,它通过计算一个页面链接的数量和质量来确定一个网站重要性的粗略估计,如图 21-17 所示。潜在的假设是,更重要的网站可能会从其他网站收到更多的链接。

img/511918_1_En_21_Fig17_HTML.jpg

图 21-17

PageRank 示例图像

PageRank 的概念可应用于您的数据,以了解接收大量自行车流量的火车站。在图 21-18 所示的例子中,重要的站点将被赋予较大的 PageRank 值。

img/511918_1_En_21_Fig18_HTML.jpg

图 21-18

PageRank 代码

以下是您将需要在 Databricks 笔记本中运行的 Python 代码,如图 21-18 所示:

from pyspark.sql.functions import desc
ranks = stationGraph.pageRank(resetProbability=0.15, maxIter=10)
ranks.vertices.orderBy(desc("pagerank")).select("station_id", "pagerank").show(10)

探索入度和出度度量

测量和计算进出车站的行程可能是一项必要的任务,您可以使用称为入度和出度的度量来完成这项任务。这可能更适用于社交网络的情况,在社交网络中,我们可以找到拥有更多关注者(内度)的人,而不是他们关注的人(度外)。图 21-19 中说明了这种入度和出度的概念。

img/511918_1_En_21_Fig19_HTML.jpg

图 21-19

入和出度图像

使用 GraphFrames,您可以运行图 21-20 中所示的查询来查找 in-degrees。

img/511918_1_En_21_Fig20_HTML.jpg

图 21-20

入学位代码

以下是您将需要在 Databricks 笔记本中运行的 Python 代码,如图 21-20 所示:

inDeg = stationGraph.inDegrees
inDeg.orderBy(desc("inDegree")).show(5, False)

类似地,运行图 21-21 所示的代码块,找出出度并注意结果。

img/511918_1_En_21_Fig21_HTML.jpg

图 21-21

外向度代码

以下是您将需要在 Databricks 笔记本中运行的 Python 代码,如图 21-21 所示:

outDeg = stationGraph.outDegrees
outDeg.orderBy(desc("outDegree")).show(5, False)

最后,运行图 21-22 所示的代码,找出入度和出度之间的比率。较高的比率值将指示许多行程结束的位置(但很少开始),而较低的值告诉我们行程经常开始的位置(但很少结束)。

img/511918_1_En_21_Fig22_HTML.jpg

图 21-22

入度和出度比率

以下是您将需要在 Databricks 笔记本中运行的 Python 代码,如图 21-22 所示:

degreeRatio = inDeg.join(outDeg, "id")\
.selectExpr("id", "double(inDegree)/double(outDegree) as degreeRatio")
degreeRatio.orderBy(desc("degreeRatio")).show(10, False)
degreeRatio.orderBy("degreeRatio").show(10, False)

进行广度优先搜索

广度优先搜索可用于连接两组节点,根据图中的边找到通往不同站点的最短路径。使用 maxPathLength ,您可以指定要连接的最大边数,并指定一个 edgeFilter 来过滤掉不符合特定要求的边。运行图 21-23 所示的代码,完成广度优先搜索。

img/511918_1_En_21_Fig23_HTML.jpg

图 21-23

广度优先搜索代码

以下是您将需要在 Databricks 笔记本中运行的 Python 代码,如图 21-23 所示:

stationGraph.bfs(fromExpr="station_id = 'Belmont-North Main'",
toExpr="station_id = 'Cicero-Forest Park'", maxPathLength=2).show(10)

查找连接的组件

连通分量定义了一个(无向)子图,该子图与自身有连接,但不与更大的图连接。

如图 21-24 所示的两个子图所示,如果一个图中的每对顶点之间都包含一条路径,则该图是强连通的,如果任意两对顶点之间不存在任何路径,则该图是弱连通的

img/511918_1_En_21_Fig24_HTML.jpg

图 21-24

强连接组件与弱连接组件

图 21-25 所示的代码将生成连接的组件。注意结果。

img/511918_1_En_21_Fig25_HTML.jpg

图 21-25

查找连接组件时要运行的代码

以下是您将需要在 Databricks 笔记本中运行的 Python 代码,如图 21-25 所示:

spark.sparkContext.setCheckpointDir("/tmp/checkpoints")

minGraph = GraphFrame(stationVertices, tripEdges.sample(False, 0.1))
cc = minGraph.connectedComponents()

cc.where("component != 0").show()

此外,图 21-26 中所示的基本代码可用于寻找强连接组件。

img/511918_1_En_21_Fig26_HTML.jpg

图 21-26

寻找强连通分量的代码

以下是您将需要在 Databricks 笔记本中运行的 Python 代码,如图 21-26 所示:

scc = minGraph.stronglyConnectedComponents(maxIter=3)
scc.groupBy("component").count().show()

摘要

在这一章中,我演示了几个实际例子,说明如何使用 Databricks GraphFrame API 轻松地搜索图形和顶点中的模式,然后查询它们以获得对数据的洞察。在 Azure 中,图形数据库服务可以通过 Cosmos DB Gremlin API 获得。Cosmos DB 是一个多模型、全球分布的 NoSQL 数据库,它的 Gremlin API 支持由顶点和边组成的结构。SQL Server 等其他微软技术也增加了对图形数据库的支持,以处理包含复杂实体关系的数据。所有这些不同的图形技术都显示了对超大型图形数据集(如使用 Apache Spark 的社交媒体提要)进行分析的价值。

二十二、Synapse 分析工作区

微软 Azure 数据平台的众多新增功能已经围绕许多类似的产品及其在现代 Azure 数据平台中的用途产生了兴奋和困惑。Azure Synapse Analytics work spaces 就是这样一种产品,不要与 Azure Synapse Analytics DW 混淆,后者传统上是下一代 Azure 数据仓库,现已更名为 Synapse Analytics 专用 SQL 池(Synapse Analytics DW)。Azure Synapse Analytics work spaces 是统一的现代数据和分析平台的发展,它将各种 Azure 服务集中到一个集中的位置。

azure Synapse Analytics work spaces 是一种 web 原生体验,它为数据工程师统一了端到端分析解决方案,使他们能够通过利用 SQL 或 Spark 池的单一体验来获取、浏览、准备、编排和可视化他们的数据。此外,它还带来了调试、性能优化、数据治理以及与 CI/CD 集成的能力。在本章中,我将通过利用 Synapse Analytics workspaces 知识中心提供的一些实际示例、代码和用例,介绍如何开始使用 Synapse Analytics Workspaces。

创建 Synapse 分析工作区

首先创建一个新的 Azure Synapse 分析工作区,如图 22-1 所示。

img/511918_1_En_22_Fig1_HTML.jpg

图 22-1

Synapse Analytics 工作区创建

接下来,配置并完成“创建 Synapse 工作区”部分。请注意,您将需要在工作区创建过程中创建和使用 Azure Data Lake Storage Gen2,如图 22-2 所示。

img/511918_1_En_22_Fig2_HTML.jpg

图 22-2

查看并创建 Synapse 工作区

一旦创建了工作空间,它将在 Azure Portal 中的所选资源组中可用,并如图 22-3 所示。无服务器 SQL 将在提供工作空间后立即可用,并将包括按查询付费的计费模式。

img/511918_1_En_22_Fig3_HTML.jpg

图 22-3

门户中部署的 Synapse 工作区

既然已经创建了工作区,请注意添加新的专用 SQL 池和新的 Apache Spark 池的选项。SQL 专用池(以前称为 SQL DW)是指 Azure Synapse Analytics 中提供的企业数据仓库功能,代表使用 Synapse SQL 时配置的分析资源的集合。专用 SQL 池(以前称为 SQL DW)的大小由数据仓库单元(DWU)决定。在 Synapse Analytics 工作区中,您可以创建和配置一个无服务器的 Apache Spark 池来处理 Azure 中的数据。继续点击图 22-4 所示的“打开 Synapse Studio”。

img/511918_1_En_22_Fig4_HTML.jpg

图 22-4

从门户启动 Synapse Studio

Synapse Analytics Studio 工作区启动后,导航到知识中心并单击“立即使用样本”,如图 22-5 所示,立即浏览自动为您提供的脚本、笔记本、数据集和池。

img/511918_1_En_22_Fig5_HTML.jpg

图 22-5

使用知识中心的示例

使用 Spark 探索样本数据

知识中心有三个样本可供即时探索,如图 22-6 所示。第一个用 Spark 探索样本数据,包括样本脚本,甚至为您创建一个新的 Spark 池,或者您也可以自己创建。

img/511918_1_En_22_Fig6_HTML.jpg

图 22-6

使用 Spark 探索样本数据

选择第一个样本,然后单击“使用样本”将创建一个笔记本,其中包含许多包含来自 Azure ML OpenDatasets 包 ( https://docs.microsoft.com/en-us/python/api/azureml-opendatasets )的数据的脚本。具体来说,本笔记本使用纽约市黄色出租车数据集。点击“Run all”执行笔记本,并从图 22-7 中的已完成执行结果中注意到,该作业使用了两个 Spark 执行器和八个内核来接收数据。

img/511918_1_En_22_Fig7_HTML.jpg

图 22-7

纽约市出租车数据样本笔记本

以下是在图 22-7 所示的笔记本插图中执行的代码:

# Read NYC yellow cab data from Azure Open Datasets
from azureml.opendatasets import NycTlcYellow

from datetime import datetime
from dateutil import parser

end_date = parser.parse('2018-05-08 00:00:00')
start_date = parser.parse('2018-05-01 00:00:00')

nyc_tlc = NycTlcYellow(start_date=start_date, end_date=end_date)
nyc_tlc_df = nyc_tlc.to_spark_dataframe()

该过程的下一步演示了如何将数据复制到关联的 Azure Data Lake Store Gen2 帐户。笔记本中的脚本,如图 22-8 所示,将通过用复制的数据创建一个火花表、一个 CSV 和一个拼花文件来完成这个复制数据任务。你可以只使用数据框;但是,此步骤将演示如何集成 ADLS Gen2 并持久存储数据。

img/511918_1_En_22_Fig8_HTML.png

图 22-8

使用 Spark pool 复制数据示例

以下是在图 22-8 所示的笔记本插图中执行的代码:

nyc_tlc_df.createOrReplaceTempView('nyc_tlc_df')
nyc_tlc_df.write.csv('nyc_tlc_df_csv', mode='overwrite')
nyc_tlc_df.write.parquet('nyc_tlc_df_parquet', mode='overwrite')

作业运行完成后,导航到 Azure Data Lake Storage Gen2 帐户,验证 CSV 和 parquet 文件是否都已创建。请注意图 22-9 中显示的两个包含纽约出租车数据集的新文件夹。

img/511918_1_En_22_Fig9_HTML.jpg

图 22-9

在 ADLS Gen2 中创建的文件夹和文件

打开拼花文件夹,注意如图 22-10 所示的压缩拼花文件的数量。

img/511918_1_En_22_Fig10_HTML.jpg

图 22-10

在 ADLS 创建的拼花文件 Gen2

接下来,导航回 Azure Synapse Studio 工作区并运行图 22-11 中所示的 select 语句,以确保数据也被摄取到 Spark 表中。

img/511918_1_En_22_Fig11_HTML.jpg

图 22-11

选择笔记本中的所有数据

以下是在图 22-11 所示的笔记本插图中执行的代码:

%%sql
SELECT * FROM myc_tlc_df

从这里开始,您可以通过开始聚合数据来获得更高级的数据探索,如图 22-12 所示。

img/511918_1_En_22_Fig12_HTML.jpg

图 22-12

汇总笔记本中的数据

以下是在图 22-12 所示的笔记本插图中执行的代码:

from pyspark.sql import functions as F
df_nyc = nyc_tlc_df.groupBy("passengerCount").agg(F.avg('tripDistance').alias('AvgTripDistance'), F.sum('tripDistance').alias('SumTripDistance'))
display(df_nyc)

此时,您可以使用 matplotlib 和 seaborn 等流行的库来渲染折线图,从而使您的分析更加高级,如图 22-13 所示。

img/511918_1_En_22_Fig13_HTML.jpg

图 22-13

使用 Spark 和笔记本电脑定制数据可视化

以下是在图 22-13 所示的笔记本插图中执行的代码:

import matplotlib.pyplot
import seaborn

seaborn.set(style = "whitegrid")
pdf_nyc = df_nyc.toPandas()
seaborn.lineplot(x="passengerCount", y="SumTripDistance" , data = pdf_nyc)
seaborn.lineplot(x="passengerCount", y="AvgTripDistance" , data = pdf_nyc)
matplotlib.pyplot.show()

最后,通过结束连接的会话来清理资源,以确保 Spark 实例被关闭。注意,当达到 Apache Spark 池中指定的空闲时间时,这个池就会关闭。您也可以从笔记本底部的状态栏中选择结束会话。

用 SQL 查询数据

接下来,让我们继续第二个示例,它包括一个示例脚本和一个 SQL 随需应变池来使用 SQL 查询数据,如图 22-14 所示。无服务器 SQL 池是对数据湖中数据的查询服务,它使用按查询付费的模式。它使您能够通过 T-SQL 语法访问您的数据,并针对查询和分析 ADLS Gen2 中的大数据进行了优化。因为它是无服务器的,所以不需要维护基础架构或集群。数据工程师、数据科学家、数据分析师和 BI 专业人员可以使用它在湖中的原始数据或不同数据上执行基本的数据探索、转换和数据抽象。

img/511918_1_En_22_Fig14_HTML.jpg

图 22-14

Synapse Studio 中使用 SQL 查询数据的示例

与第一个示例类似,创建了一个新的 SQL 脚本,演示如何通过使用标准 SQL 命令和 OPENROWSET 函数来查询 Azure Data Lake Storage Gen2 帐户,如图 22-15 所示。OPENROWSET 是一个 T-SQL 函数,允许从许多来源读取数据,包括使用 SQL Server 的大容量导入功能。代码中的格式参数允许拼花地板和 CSV 类型。

img/511918_1_En_22_Fig15_HTML.jpg

图 22-15

样本查询数据湖

以下是在图 22-15 所示的笔记本插图中执行的代码:

SELECT TOP 100 * FROM
    OPENROWSET(
        BULK 'https://azureopendatastorage.blob.core.windows.net/nyctlc/yellow/puYear=2019/puMonth=*/*.parquet',
        FORMAT='PARQUET'
    ) AS [nyc];

下一个查询,如图 22-16 所示,通过添加额外的过滤器和子句增加了更多的复杂性,并且在展示 Synapse Studio 工作区的功能方面做得很好,可以从熟悉的 SQL 体验中直接查询 Azure Data Lake Storage Gen2 帐户。使用 SQL on demand 分析 Azure 开放数据集,并在 Azure Synapse Studio 中可视化结果。您可以在以下 URL 中找到更多代码示例: https://docs.microsoft.com/en-us/azure/synapse-analytics/sql/tutorial-data-analyst

img/511918_1_En_22_Fig16_HTML.jpg

图 22-16

更复杂的数据湖查询

以下是在图 22-16 所示的笔记本插图中执行的代码:

SELECT
    YEAR(tpepPickupDateTime) AS current_year,
    COUNT(*) AS rides_per_year
FROM
    OPENROWSET(
        BULK 'https://azureopendatastorage.blob.core.windows.net/nyctlc/yellow/puYear=*/puMonth=*/*.parquet',
        FORMAT='PARQUET'
    ) AS [nyc]
WHERE nyc.filepath(1) >= '2014' AND nyc.filepath(1) <= '2019'
GROUP BY YEAR(tpepPickupDateTime)
ORDER BY 1 ASC;

用 SQL 创建外部表

本章的最后一个练习包括使用 SQL 创建和查询外部表,如图 22-17 所示。与前面的示例类似,将在工作区中为您创建一个示例脚本和表。

img/511918_1_En_22_Fig17_HTML.jpg

图 22-17

在 Synapse Studio 中创建外部表的示例

图 22-18 所示的 SQL 代码块(包含在示例中)将演示如何创建外部表。

img/511918_1_En_22_Fig18_HTML.png

图 22-18

创建外部表的示例脚本

以下是您需要在图 22-18 所示的笔记本插图中运行的代码:

/* Note: this script is filtered on a specific month. You can modify the location to read the entire dataset. */
IF NOT EXISTS (SELECT * FROM sys.external_file_formats WHERE name = 'SynapseParquetFormat')
    CREATE EXTERNAL FILE FORMAT [SynapseParquetFormat]
    WITH ( FORMAT_TYPE = PARQUET)
GO

IF NOT EXISTS (SELECT * FROM sys.external_data_sources WHERE name = 'nyctlc_azureopendatastorage_blob_core_windows_net')
    CREATE EXTERNAL DATA SOURCE [nyctlc_azureopendatastorage_blob_core_windows_net]
    WITH (
        LOCATION = 'wasbs://nyctlc@azureopendatastorage.blob.core.windows.net',
        TYPE     = HADOOP
    )
GO

CREATE EXTERNAL TABLE nyc_tlc_yellow_trip_ext (
    [vendorID] varchar(8000),
    [tpepPickupDateTime] datetime2(7),
    [tpepDropoffDateTime] datetime2(7),
    [passengerCount] int,
    [tripDistance] float,
    [puLocationId] varchar(8000),
    [doLocationId] varchar(8000),
    [startLon] float,
    [startLat] float,
    [endLon] float,
    [endLat] float,
    [rateCodeId] int,
    [storeAndFwdFlag] varchar(8000),
    [paymentType] varchar(8000),
    [fareAmount] float,
    [extra] float,
    [mtaTax] float,
    [improvementSurcharge] varchar(8000),
    [tipAmount] float,
    [tollsAmount] float,
    [totalAmount] float
    )
    WITH (
    LOCATION = 'yellow/puYear=2014/puMonth=3/',
    -- LOCATION = 'yellow'
    DATA_SOURCE = [nyctlc_azureopendatastorage_blob_core_windows_net],
    FILE_FORMAT = [SynapseParquetFormat],
    REJECT_TYPE = VALUE,
    REJECT_VALUE = 0
    )
GO

SELECT TOP 100 * FROM nyc_tlc_yellow_trip_ext
GO

创建表后,运行一个简单的 SQL select 语句,如图 22-19 所示,查询新创建的外部表。请注意,还有一个“查询计划”按钮可用。

img/511918_1_En_22_Fig19_HTML.jpg

图 22-19

查询外部表的示例

以下是您需要在图 22-19 所示的笔记本插图中执行的代码:

SELECT TOP 100 * FROM nyc_tlc_yellow_trip_ext
GO

可以下载查询计划并在 SQL Server Management Studio (SSMS)中打开它,如图 22-20 所示,与使用 SSMS 在传统 SQL Server 体验中分析查询计划相比,这是一项非常有用的功能。

img/511918_1_En_22_Fig20_HTML.jpg

图 22-20

查询计划功能

请注意,在图 22-21 中,作为这些练习的一部分,已经创建了一个专用的 SQL 池和 Apache Spark 池。记得删除任何未使用的资源和 Spark/ SQL 池,以防止任何额外的成本。

img/511918_1_En_22_Fig21_HTML.jpg

图 22-21

示例演示中在 Azure 门户中创建的 SQL 和 Spark 池的图像

摘要

在本章中,我演示了如何创建新的 Azure Synapse Analytics Studio 工作区,然后向您展示了如何从知识中心创建三个示例来实现以下目标:

  1. 使用 Spark 探索数据。

  2. 用 SQL 查询数据。

  3. 用 SQL 创建一个外部表。

Azure Synapse workspace 还有许多我们在本章中没有探讨的其他优势,例如连接到 Power BI 帐户以可视化和构建交互式报告的能力;创建、调度和监控 ETL 作业,就像您在 Azure 数据工厂体验中所做的那样;并通过与微软的新数据治理产品 Azure without 集成来搜索您的数据资产。有了图 22-22 所示的所有可用资源和易于使用的导航 UI,开始 Azure Synapse Analytics 之旅再简单不过了。Azure Synapse 分析工作区确实有潜力成为各种业务和技术专业人员的统一现代数据和分析平台。

img/511918_1_En_22_Fig22_HTML.jpg

图 22-22

Azure Synapse 分析主页

二十三、数据块中的机器学习

寻求利用机器学习(ML)和人工智能能力的组织和开发人员花费大量时间构建 ML 模型,并寻求一种方法来简化他们的机器学习开发生命周期,以跟踪实验,将代码打包成可重复运行的代码,以及构建、共享和部署 ML 模型。

MLflow 是一个管理端到端机器学习生命周期的开源平台,如图 23-1 所示。它处理四个主要功能:

  1. 跟踪实验以比较和记录参数和结果

  2. 打包 ML 代码以与其他数据科学家共享或转移到生产中。

  3. 使用各种可用的库管理和部署 ML 模型

  4. 注册模型以便于模型管理,并提供模型作为 REST 端点

在本章中,我将介绍如何使用 Azure Databricks 开始使用 MLflow。Databricks 为跟踪和保护 ML 模型培训运行以及运行 ML 项目提供了集成的 MLflow 体验。除了提供 MLflow 的全面管理版本,Databricks 还集成了企业安全功能、高可用性、实验和运行管理以及笔记本版本捕获。

img/511918_1_En_23_Fig1_HTML.jpg

图 23-1

描述 MLflow 功能的图像

创建 MLflow 实验

让我们从在 Azure Databricks 中创建一个 MLflow 实验开始。首先导航至主页菜单并选择“新 MLflow 实验”,如图 23-2 所示。

img/511918_1_En_23_Fig2_HTML.jpg

图 23-2

从主页菜单创建新的 MLflow 实验

选择“新建 MLflow 实验”打开一个新的“创建 MLflow 实验”界面。填充实验名称,然后创建实验,如图 23-3 所示。

img/511918_1_En_23_Fig3_HTML.jpg

图 23-3

为 MLflow 创建实验

一旦实验被创建,它将有一个与之相关联的实验 ID,当您配置包含 ML 模型代码的笔记本时,您将需要这个 ID。注意图 23-4 所示的实验用户界面包含比较多个模型、按模型状态过滤、按标准搜索和下载 CSV 细节的选项。

img/511918_1_En_23_Fig4_HTML.jpg

图 23-4

实验用户界面的示例图像

安装 MLflow 库

创建 MLflow 实验后,创建一个新的集群,并在其上安装 MLflow PyPI 库。如果您正在运行用于机器学习的 Databricks 运行时,则 MLflow 已经安装,不需要任何设置。如果您正在运行 Databricks 运行时,请按照图 23-5 中所示的步骤安装 MLflow 库。

img/511918_1_En_23_Fig5_HTML.jpg

图 23-5

安装 MLflow PyPI 库

一旦库成功安装,可以在集群的库上看到 installed 状态,如图 23-6 所示。

img/511918_1_En_23_Fig6_HTML.jpg

图 23-6

已安装的 MLflow 库

创建笔记本

在安装了一个实验、一个集群和 MLflow 库之后,您需要创建一个新的笔记本来构建 ML 模型,然后将它与 MLflow 实验相关联。请注意,如果开始运行时没有活动的实验,Databricks 会自动创建一个笔记本实验。

使用以下代码开始运行。因为您有一个实验 ID,所以使用

mlflow.start_run().
mlflow.start_run(experiment_id=1027351307587712)

或者,您可以如下定义实验名称,这将简单地使用实验名称而不是 ID:

experiment_name = "/Demo/MLFlowDemo/"
mlflow.set_experiment(experiment_name)

选择性测井

从日志的角度来看,可以选择自动记录特定于模型的指标、参数和工件。或者,可以根据需要通过向笔记本代码添加以下命令来定义这些指标、参数或模型:

数字度量:mlflow.log_metric("accuracy", 0.9)

训练参数:mlflow.log_param("learning_rate", 0.001)

型号:mlflow.sklearn.log_model(model, "myModel")

其他工件(文件):mlflow.log_artifact("/tmp/my-file", "myArtifactPath")

下面的代码从 scikit-learn 导入一个数据集,并创建训练和测试数据集。这段代码旨在演示一个 ML 模型示例。将此添加到 Databricks 笔记本中的代码块:

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_diabetes

db = load_diabetes()
X = db.data
y = db.target
X_train, X_test, y_train, y_test = train_test_split(X, y)

下一个代码块将导入 MLflow 和 sklearn,开始实验,并记录执行运行的详细信息。只需将此代码添加到您的 Databricks 笔记本中并运行它:

import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error

# In this run, neither the experiment_id nor the experiment_name parameter is provided. MLflow automatically creates a notebook experiment and logs runs to it.
# Access these runs using the Experiment sidebar. Click Experiment at the upper right of this screen.
with mlflow.start_run(experiment_id=1027351307587712):
  n_estimators = 100
  max_depth = 6
  max_features = 3
  # Create and train model
  rf = RandomForestRegressor(n_estimators = n_estimators, max_depth = max_depth, max_features = max_features)
  rf.fit(X_train, y_train)
  # Make predictions
  predictions = rf.predict(X_test)

  # Log parameters
  mlflow.log_param("num_trees", n_estimators)
  mlflow.log_param("maxdepth", max_depth)
  mlflow.log_param("max_feat", max_features)

  # Log model
  mlflow.sklearn.log_model(rf, "random-forest-model")

  # Create metrics
  mse = mean_squared_error(y_test, predictions)

  # Log metrics
  mlflow.log_metric("mse", mse)

图 23-7 显示了需要记录的已定义参数、指标和模型。

img/511918_1_En_23_Fig7_HTML.jpg

图 23-7

代码中定义的参数

点击图 23-8 中高亮显示的图标,查看实验运行详情。另外,点击底部的实验界面打开界面。如果没有创建实验,将为您创建一个新的随机实验,这将特别有用。

img/511918_1_En_23_Fig8_HTML.jpg

图 23-8

单击打开用户界面

由于之前已经创建了一个 MLflow 实验,点击 MLFlowDemo 打开它,如图 23-9 所示。

img/511918_1_En_23_Fig9_HTML.jpg

图 23-9

打开 MLflow 实验

请注意,该实验运行了两次,并注意与之相关的参数和指标。此外,现在可以选择比较两次运行,如图 23-10 所示。

img/511918_1_En_23_Fig10_HTML.jpg

图 23-10

比较多次运行

点击比较,注意两次运行之间的所有相关细节,如图 23-11 所示。

img/511918_1_En_23_Fig11_HTML.jpg

图 23-11

比较两次模型运行的参数

此外,您可以通过图 23-12 所示的散点图、等高线图或平行坐标图来可视化比较。要查看绘图,只需在各种绘图选项卡之间切换。这个特殊的图显示了平行坐标。

img/511918_1_En_23_Fig12_HTML.jpg

图 23-12

样本地块 1

自动记录

在测试了定义的日志选项之后,还要测试自动日志。您可以使用图 23-13 中所示的代码的以下变体来实现,它基本上用对mlflow.sklearn.autolog()的调用来替换所有已定义的度量、参数等等。

img/511918_1_En_23_Fig13_HTML.jpg

图 23-13

自动登录代码示例

以下是您需要在 Databricks 笔记本中运行的代码,如图 23-13 所示:

import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error

mlflow.sklearn.autolog()

# In this run, neither the experiment_id nor the experiment_name parameter is provided. MLflow automatically creates a notebook experiment and logs runs to it.
# Access these runs using the Experiment sidebar. Click Experiment at the upper right of this screen.
with mlflow.start_run():
  n_estimators = 100
  max_depth = 6
  max_features = 3
  # Create and train model
  rf = RandomForestRegressor(n_estimators = n_estimators, max_depth = max_depth, max_features = max_features)
  rf.fit(X_train, y_train)
  # Make predictions
  predictions = rf.predict(X_test)

在运行这个新模型两次并导航回 MLflow 实验后,请注意实验 UI 中记录的新运行,这一次在捕获的指标中有一些差异,正如预期的那样,如图 23-14 所示。

img/511918_1_En_23_Fig14_HTML.jpg

图 23-14

实验 UI 2

点击其中一个运行,查看各种细节,包括图,如图 23-15 所示。

img/511918_1_En_23_Fig15_HTML.jpg

图 23-15

样地 2

注册一个模型

在创建、记录和比较模型之后,您可以通过点击想要记录的模型并向下滚动到运行细节中的工件来注册模型,如图 23-16 所示。

img/511918_1_En_23_Fig16_HTML.jpg

图 23-16

从实验界面选择模型

选择型号,点击【注册型号】,如图 23-17 所示。

img/511918_1_En_23_Fig17_HTML.jpg

图 23-17

单击从工件注册模型

在图 23-18 所示的注册模型界面中,新建一个模型,命名并注册模型。

img/511918_1_En_23_Fig18_HTML.jpg

图 23-18

注册模型的步骤

一旦注册,Details 选项卡将包含与版本、注册时间戳、模型创建者和阶段相关的所有细节,如图 23-19 所示。

img/511918_1_En_23_Fig19_HTML.jpg

图 23-19

显示“详细信息”选项卡的图像

图 23-20 显示了各种版本以及每个阶段的其他细节。

img/511918_1_En_23_Fig20_HTML.jpg

图 23-20

显示版本详细信息的图像

图 23-21 显示了如何将阶段从暂存过渡到生产再到存档。

img/511918_1_En_23_Fig21_HTML.jpg

图 23-21

从一个阶段到另一个阶段的步骤

启用模型服务时,Databricks 会自动为模型创建一个唯一的单节点集群,并在该集群上部署模型的所有非归档版本。点击图 23-22 所示的启用上菜开始。

img/511918_1_En_23_Fig22_HTML.jpg

图 23-22

启用上菜的步骤

此时,您会看到服务和详细信息标签,如图 23-23 所示。MLflow 模型服务允许托管注册的 ML 模型作为 REST 端点,这些端点根据模型版本的可用性及其阶段自动更新。

img/511918_1_En_23_Fig23_HTML.jpg

图 23-23

该图显示了新的“服务”选项卡属性

样本服务页面可能如图 23-24 所示。

img/511918_1_En_23_Fig24_HTML.jpg

图 23-24

上菜标签的示例图像

最后,当一个模型被注册后,您可以通过导航到 Databricks UI 中的 Models 选项卡来找到它,如图 23-25 所示。

img/511918_1_En_23_Fig25_HTML.jpg

图 23-25

“模型”选项卡图标的图像

摘要

在本章中,我演示了如何创建 MLflow 实验、安装 MLflow 库以及创建 MLflow 笔记本。我还向您展示了选择性和自动日志记录的实际例子,最后向您展示了如何注册一个模型。随着 MLflow 通过 Databricks 体验的集成,您现在有能力管理 ML 生命周期,包括实验、再现性、部署和中央模型注册。