使用 Azure 数据工厂、DevOps 和机器学习生成数据管道

Azure DevOps Services

开始生成包含数据引入、数据转换和模型训练的数据管道。

了解如何从 CSV(逗号分隔值)文件中获取数据并将数据保存到 Azure Blob 存储。 转换数据并将其保存到暂存区域。 然后使用转换后的数据训练机器学习模型。 将模型作为 Python pickle 文件写入 blob 存储。

先决条件

开始前,需要具备:

预配 Azure 资源

  1. 登录 Azure 门户

  2. 从菜单中选择“Cloud Shell”按钮。 出现提示时,选择 Bash 体验。

    Screenshot showing where to select Cloud Shell from the menu.

    注意

    你需要一个 Azure 存储资源来保存你在 Azure Cloud Shell 中创建的任何文件。 首次打开 Cloud Shell 时,系统将提示你创建资源组、存储帐户和 Azure 文件共享。 此设置会自动用于所有未来的 Cloud Shell 会话。

选择 Azure 区域

区域是地理位置内的一个或多个 Azure 数据中心。 例如美国东部、美国西部和北欧等区域。 每种 Azure 资源(包括应用服务实例)都会分配一个区域。

要使命令更容易运行,请先选择一个默认区域。 指定默认区域后,除非指定其他区域,否别后面的命令会使用该区域。

  1. 在 Cloud Shell 中运行以下 az account list-locations 命令,列出 Azure 订阅提供的区域。

    az account list-locations \
      --query "[].{Name: name, DisplayName: displayName}" \
      --output table
    
  2. 从输出的 Name 列中,选择靠近你的区域。 例如,选择 asiapacificwestus2

  3. 运行 az config 以设置默认区域。 在以下示例中,将 <REGION> 替换为所选区域的名称。

    az config set defaults.location=<REGION>
    

    下面的示例将 westus2 设置为默认区域。

    az config set defaults.location=westus2
    

创建 Bash 变量

  1. 在 Cloud Shell 中生成一个随机数。 在下一步中,你将使用此数字为某些服务创建全局唯一名称。

    resourceSuffix=$RANDOM
    
  2. 为存储帐户和密钥保管库创建全局唯一名称。 以下命令使用双引号,指示 Bash 使用内联语法插入变量。

    storageName="datacicd${resourceSuffix}"
    keyVault="keyvault${resourceSuffix}"
    
  3. 再创建一个 Bash 变量来存储资源组的名称和区域。 在以下示例中,将 <REGION> 替换为你针对默认区域选择的区域。

    rgName='data-pipeline-cicd-rg'
    region='<REGION>'
    
  4. 为 Azure 数据工厂和 Azure Databricks 实例创建变量名称。

    datafactorydev='data-factory-cicd-dev'
    datafactorytest='data-factory-cicd-test'
    databricksname='databricks-cicd-ws'
    

创建 Azure 资源

  1. 运行以下 az group create 命令以使用 rgName 创建资源组。

    az group create --name $rgName
    
  2. 运行以下 az storage account create 命令以创建新的存储帐户。

    az storage account create \
        --name $storageName \
        --resource-group $rgName \
        --sku Standard_RAGRS \
        --kind StorageV2
    
  3. 运行以下 az storage container create 命令来创建两个容器:rawdataprepareddata

    az storage container create -n rawdata --account-name $storageName 
    az storage container create -n prepareddata --account-name $storageName 
    
  4. 运行以下 az keyvault create 命令来创建新的密钥保管库。

    az keyvault create \
        --name $keyVault \
        --resource-group $rgName
    
  5. 使用门户 UI 或 Azure CLI 创建新的数据工厂

    • 名称:data-factory-cicd-dev
    • 版本:V2
    • 资源组:data-pipeline-cicd-rg
    • 位置:距离你最近的位置
    • 清除“启用 Git”选项。
    1. 添加 Azure 数据工厂扩展

      az extension add --name datafactory
      
    2. 运行以下 az datafactory create 命令创建新的数据工厂。

       az datafactory create \
           --name data-factory-cicd-dev \
           --resource-group $rgName
      
    3. 复制该订阅 ID。 数据工厂稍后将使用此 ID。

  6. 使用门户 UI 或 Azure CLI 创建第二个数据工厂。 你将使用此数据工厂进行测试。

    • 名称:data-factory-cicd-test
    • 版本:V2
    • 资源组:data-pipeline-cicd-rg
    • 位置:距离你最近的位置
    • 清除“启用 Git”选项。
    1. 运行以下 az datafactory create 命令创建新的数据工厂以进行测试。

       az datafactory create \
           --name data-factory-cicd-test \
           --resource-group $rgName
      
    2. 复制该订阅 ID。 数据工厂稍后将使用此 ID。

  7. 添加新的 Azure Databricks 服务

    • 资源组:data-pipeline-cicd-rg
    • 工作区名称:databricks-cicd-ws
    • 位置:距离你最近的位置
    1. 添加 Azure Databricks 扩展(如果尚未安装)。

       az extension add --name databricks
      
    2. 运行以下 az databricks workspace create 命令以创建新工作区。

      az databricks workspace create \
          --resource-group $rgName \
          --name databricks-cicd-ws  \
          --location eastus2  \
          --sku trial
      
    3. 复制该订阅 ID。 Databricks 服务稍后将使用此 ID。

将数据上载到存储容器

  1. 在 Azure 门户中,在 data-pipeline-cicd-rg 资源组中打开存储帐户。
  2. 转到“Blob 服务”>“容器”。
  3. 打开 prepareddata 容器。
  4. 上传 sample.csv 文件。

设置密钥保管库

你将使用 Azure 密钥保管库存储 Azure 服务的所有连接信息。

创建 Databricks 个人访问令牌

  1. 在 Azure 门户,转到 Databricks,然后打开工作区。
  2. 在 Azure Databricks UI 中,创建和复制个人访问令牌

复制存储帐户的帐户密钥和连接字符串

  1. 转到存储帐户。
  2. 打开“访问密钥”。
  3. 复制第一个密钥和连接字符串。

将值保存到密钥保管库

  1. 创建三个机密:

    • databricks-token:your-databricks-pat
    • StorageKey:your-storage-key
    • StorageConnectString:your-storage-connection
  2. 运行以下 az keyvault secret set 命令以将机密添加到密钥保管库。

    az keyvault secret set --vault-name "$keyVault" --name "databricks-token" --value "your-databricks-pat"
    az keyvault secret set --vault-name "$keyVault" --name "StorageKey" --value "your-storage-key"
    az keyvault secret set --vault-name "$keyVault" --name "StorageConnectString" --value "your-storage-connection"
    

导入数据管道解决方案

  1. 登录到你的 Azure DevOps 组织,然后转到你的项目。
  2. 转到“存储库”,然后导入 GitHub 存储库的分支版本。 有关详细信息,请参阅将 Git 存储库导入项目

添加 Azure 资源管理器服务连接

  1. 创建 Azure 资源管理器服务连接
  2. 选择“服务主体(自动)”。
  3. 选择 data-pipeline-cicd-rg 资源组。
  4. 将服务连接命名为 azure_rm_connection
  5. 选择“授予对所有管道的访问权限”。 需要具有服务连接管理员角色才能选择此选项。

添加管道变量

  1. 创建名为 datapipeline-vg 的新变量组

  2. 添加 Azure DevOps 扩展(如果尚未安装)。

    az extension add --name azure-devops 
    
  3. 登录到你的 Azure DevOps 组织

    az devops login --org https://dev.azure.com/<yourorganizationname>
    
    az pipelines variable-group create --name datapipeline-vg -p <yourazuredevopsprojectname> --variables \
                                        "LOCATION=$region" \
                                        "RESOURCE_GROUP=$rgName" \
                                        "DATA_FACTORY_NAME=$datafactorydev" \
                                        "DATA_FACTORY_DEV_NAME=$datafactorydev" \
                                        "DATA_FACTORY_TEST_NAME=$datafactorytest" \
                                        "ADF_PIPELINE_NAME=DataPipeline" \
                                        "DATABRICKS_NAME=$databricksname" \
                                        "AZURE_RM_CONNECTION=azure_rm_connection" \
                                        "DATABRICKS_URL=<URL copied from Databricks in Azure portal>" \
                                        "STORAGE_ACCOUNT_NAME=$storageName" \
                                        "STORAGE_CONTAINER_NAME=rawdata"
    
  4. 创建名为 keys-vg 的第二个变量组。 此组将从密钥保管库拉取数据变量。

  5. 选择“链接 Azure Key Vault 中的机密作为变量”。 有关详细信息,请参阅从 Azure 密钥保管库链接机密

  6. 授权 Azure 订阅。

  7. 选择要添加为变量的所有可用机密(databricks-tokenStorageConnectStringStorageKey)。

配置 Azure Databricks 和 Azure 数据工厂

按照后续部分中的步骤设置 Azure Databricks 和 Azure 数据工厂。

在 Azure Databricks 中创建测试范围

  1. 在 Azure 门户中,转到“密钥保管库”>“属性”。
  2. 复制 DNS 名称和资源 ID。
  3. 在 Azure Databricks 工作区中,创建名为 testscope 的机密范围

在 Azure Databricks 中添加新群集

  1. 在 Azure Databricks 工作区中,转到“群集”。
  2. 选择“创建群集”。
  3. 命名并保存新群集。
  4. 选择你的群集名称。
  5. 在 URL 字符串中,复制 /clusters//configuration之间的内容。 例如,在字符串 clusters/0306-152107-daft561/configuration中,需要复制 0306-152107-daft561
  6. 保存此字符串以备后用。

在 Azure 数据工厂中设置代码存储库

  1. 在 Azure 数据工厂中,转到“创作和监视”。 有关详细信息,请参阅创建数据工厂
  2. 选择“设置代码存储库”,然后连接存储库。
    • 存储库类型:Azure DevOps Git
    • Azure DevOps 组织:有效帐户
    • 项目名称:Azure DevOps 数据管道项目
    • Git 存储库名称:使用现有的。
      • 选择 main 分支进行协作。
      • 将 /azure-data-pipeline/factorydata 设置为根文件夹。
    • 将资源导入到的分支:选择“使用现有”和“main”。
  1. 在 Azure 门户 UI 中,打开密钥保管库。
  2. 选择“访问策略”。
  3. 选择“添加访问策略”。
  4. 对于“根据模板配置”,请选择“密钥和机密管理”
  5. 在 “选择主体”中,搜索开发数据工厂的名称并将其添加。
  6. 选择“添加”以添加访问策略。
  7. 重复这些步骤,为测试数据工厂添加访问策略。

更新 Azure 数据工厂中的密钥保管库链接服务

  1. 转到“管理”>“链接服务”。
  2. 更新 Azure 密钥保管库以连接到订阅。

更新 Azure 数据工厂中的存储链接服务

  1. 转到“管理”>“链接服务”。
  2. 更新 Azure Blob 存储值以连接到订阅。

更新 Azure 数据工厂中的 Azure Databricks 链接服务

  1. 转到“管理”>“链接服务”。
  2. 更新 Azure Databricks 值以连接到订阅。
  3. 对于“现有群集 ID”,输入之前保存的群集值。

测试和发布数据工厂

  1. 在 Azure 数据工厂中,转到“编辑”。
  2. 打开 DataPipeline
  3. 选择“变量”。
  4. 验证 storage_account_name 是否在 Azure 门户中引用存储帐户。 如有必要,请更新默认值。 保存所做更改。
  5. 选择“验证”以验证 DataPipeline
  6. 选择“发布”,将 data-factory 资产发布到存储库的 adf_publish 分支。

运行 CI/CD 管道

按照以下步骤运行持续集成和持续交付 (CI/CD) 管道:

  1. 导航到“管道”页。 然后选择“操作”以创建新的管道。
  2. 选择“Azure Repos Git”作为源代码的位置。
  3. 显示存储库列表时,选择你的存储库。
  4. 设置管道时,选择“现有 Azure Pipelines YAML 文件”。 选择 YAML 文件:/azure-data-pipeline/data_pipeline_ci_cd.yml。
  5. 运行管道。 如果管道以前未运行过,则可能需要在运行期间授予访问资源的权限。

清理资源

如果不打算继续使用此应用程序,请按照以下步骤删除数据管道:

  1. 删除 data-pipeline-cicd-rg 资源组。
  2. 删除 Azure DevOps 项目。

后续步骤