教程:使用 Azure CLI 在 HDInsight 中创建启用 Apache Kafka REST 代理的群集

本教程介绍如何使用 Azure CLI 在 Azure HDInsight 中创建启用 Apache Kafka REST 代理的群集。 Azure HDInsight 是适用于企业的分析服务,具有托管、全面且开源的特点。 Apache Kafka 是开源分布式流式处理平台。 通常用作消息代理,因为它可提供类似于发布-订阅消息队列的功能。 Kafka REST 代理可让你使用 HTTP 通过 REST API 来与 Kafka 群集交互。 Azure CLI 是 Azure 用于管理 Azure 资源的跨平台命令行体验。

仅可通过相同虚拟网络内的资源访问 Apache Kafka API。 可以使用 SSH 直接访问群集。 若要将其他服务、网络或虚拟机连接到 Apache Kafka,则必须首先创建虚拟机,然后才能在网络中创建资源。 有关详细信息,请参阅使用虚拟网络连接到 Apache Kafka

在本教程中,学习以下内容:

  • Kafka REST 代理的先决条件
  • 使用 Azure CLI 创建 Apache Kafka 群集

如果没有 Azure 订阅,请在开始前创建一个试用版订阅

先决条件

  • 已向 Microsoft Entra ID 注册的应用程序。 编写的用来与 Kafka REST 代理交互的客户端应用程序将使用此应用程序的 ID 和机密对 Azure 进行身份验证。 有关详细信息,请参阅将应用程序注册到 Microsoft 标识平台

  • Microsoft Entra 安全组,其中包含已注册的应用程序作为成员。 此安全组将用于控制允许哪些应用程序与 REST 代理交互。 若要详细了解如何创建 Microsoft Entra 组,请参阅使用 Microsoft Entra ID 创建基本组并添加成员

  • Azure CLI。 确保至少安装版本 2.0.79。 请参阅安装 Azure CLI

创建 Apache Kafka 群集

  1. 登录到 Azure 订阅。

    az login
    
    # If you have multiple subscriptions, set the one to use
    # az account set --subscription "SUBSCRIPTIONID"
    
  2. 设置环境变量。 本教程中的变量用法基于 Bash。 在其他环境中需要进行细微的更改。

    变量 说明
    resourceGroupName 将 RESOURCEGROUPNAME 替换为新资源组的名称。
    location 将 LOCATION 替换为要在其中创建群集的区域。 如需有效位置的列表,请使用 az account list-locations 命令
    clusterName 将 CLUSTERNAME 替换为新群集的全局唯一名称。
    storageAccount 将 STORAGEACCOUNTNAME 替换为新存储帐户的名称。
    httpPassword 将 PASSWORD 替换为群集登录名 admin 的密码。
    sshPassword 将 PASSWORD 替换为安全外壳用户名 sshuser 的密码。
    securityGroupName 将 SECURITYGROUPNAME 替换为 Kafka REST 代理的客户端 Microsoft Entra 安全组名称。 变量将传递给 az-hdinsight-create--kafka-client-group-name 参数。
    securityGroupID 将 SECURITYGROUPID 替换为 Kafka REST 代理的客户端 Microsoft Entra 安全组 ID。 变量将传递给 az-hdinsight-create--kafka-client-group-id 参数。
    storageContainer 群集将使用的存储容器,对于本教程请保留现有值。 此变量将设置为群集的名称。
    workernodeCount 群集中的工作器节点数,对于本教程请保留现有值。 为了保证高可用性,Kafka 至少需要 3 个辅助角色节点
    clusterType HDInsight 群集的类型,对于本教程请保留现有值。
    clusterVersion HDInsight 群集版本,对于本教程请保留现有值。 Kafka REST 代理要求至少安装群集版本 4.0。
    componentVersion Kafka 版本,对于本教程请保留现有值。 Kafka REST 代理要求至少安装组件版本 2.1。

    使用所需的值更新变量。 然后,输入 CLI 命令来设置环境变量。

    export resourceGroupName=RESOURCEGROUPNAME
    export location=LOCATION
    export clusterName=CLUSTERNAME
    export storageAccount=STORAGEACCOUNTNAME
    export httpPassword='PASSWORD'
    export sshPassword='PASSWORD'
    export securityGroupName=SECURITYGROUPNAME
    export securityGroupID=SECURITYGROUPID
    
    export storageContainer=$(echo $clusterName | tr "[:upper:]" "[:lower:]")
    export workernodeCount=3
    export clusterType=kafka
    export clusterVersion=4.0
    export componentVersion=kafka=2.1
    
  3. 输入以下命令来创建资源组

     az group create \
        --location $location \
        --name $resourceGroupName
    
  4. 输入以下命令创建 Azure 存储帐户

    # Note: kind BlobStorage is not available as the default storage account.
    az storage account create \
        --name $storageAccount \
        --resource-group $resourceGroupName \
        --https-only true \
        --kind StorageV2 \
        --location $location \
        --sku Standard_LRS
    
  5. 输入以下命令从 Azure 存储帐户中提取主密钥,然后将其存储在某个变量中:

    export storageAccountKey=$(az storage account keys list \
        --account-name $storageAccount \
        --resource-group $resourceGroupName \
        --query [0].value -o tsv)
    
  6. 输入以下命令创建 Azure 存储容器

    az storage container create \
        --name $storageContainer \
        --account-key $storageAccountKey \
        --account-name $storageAccount
    
  7. 创建 HDInsight 群集。 输入该命令之前,请注意以下参数:

    1. Kafka 群集所需的参数:

      参数 说明
      --type 值必须是 Kafka
      --workernode-data-disks-per-node 每个工作器节点要使用的数据磁盘数。 HDInsight Kafka 仅支持数据磁盘。 本教程使用的值为 2
    2. Kafka REST 代理所需的参数:

      参数 说明
      --kafka-management-node-size 节点的大小。 本教程使用的值为 Standard_D4_v2
      --kafka-client-group-id Kafka REST 代理的客户端 Microsoft Entra 安全组 ID。 该值是从变量 $securityGroupID 传递的。
      --kafka-client-group-name Kafka REST 代理的客户端 Microsoft Entra 安全组名称。 该值是从变量 $securityGroupName 传递的。
      --version HDInsight 群集版本必须至少为 4.0。 该值是从变量 $clusterVersion 传递的。
      --component-version Kafka 版本必须至少为 2.1。 该值是从变量 $componentVersion 传递的。

      若要创建不含 REST 代理的群集,请在 az hdinsight create 命令中去除 --kafka-management-node-size--kafka-client-group-id--kafka-client-group-name

    3. 如果有现有的虚拟网络,请添加参数 --vnet-name--subnet 及其值。

    输入以下命令创建群集:

    az hdinsight create \
        --name $clusterName \
        --resource-group $resourceGroupName \
        --type $clusterType \
        --component-version $componentVersion \
        --http-password $httpPassword \
        --http-user admin \
        --location $location \
        --ssh-password $sshPassword \
        --ssh-user sshuser \
        --storage-account $storageAccount \
        --storage-account-key $storageAccountKey \
        --storage-container $storageContainer \
        --version $clusterVersion \
        --workernode-count $workernodeCount \
        --workernode-data-disks-per-node 2 \
        --kafka-management-node-size "Standard_D4_v2" \
        --kafka-client-group-id $securityGroupID \
        --kafka-client-group-name "$securityGroupName"
    

    可能需要几分钟时间才能完成群集创建过程。 通常大约为 15 分钟。

清理资源

完成本文后,可以删除群集。 有了 HDInsight,便可以将数据存储在 Azure 存储中,因此可以在群集不用时安全地删除群集。 此外,还需要为 HDInsight 群集付费,即使不用也是如此。 由于群集费用数倍于存储空间费用,因此在群集不用时删除群集可以节省费用。

输入以下命令中的全部或部分来删除资源:

# Remove cluster
az hdinsight delete \
    --name $clusterName \
    --resource-group $resourceGroupName

# Remove storage container
az storage container delete \
    --account-name $storageAccount  \
    --name $storageContainer

# Remove storage account
az storage account delete \
    --name $storageAccount  \
    --resource-group $resourceGroupName

# Remove resource group
az group delete \
    --name $resourceGroupName

后续步骤

使用 Azure CLI 在 Azure HDInsight 中成功创建启用 Apache Kafka REST 代理的群集后,接下来请使用 Python 代码来与 REST 代理交互: