Verbinding maken met Apache Kafka in HDInsight via een virtueel Azure-netwerk

Meer informatie over hoe u rechtstreeks verbinding maakt met Apache Kafka in HDInsight via een virtueel Azure-netwerk. Dit document bevat informatie over het maken van verbinding met Kafka met behulp van de volgende configuraties:

  • Van resources in een on-premises netwerk. Deze verbinding wordt tot stand gebracht met behulp van een VPN-apparaat (software of hardware) in uw lokale netwerk.
  • Vanuit een ontwikkelomgeving met behulp van een VPN-softwareclient.

Notitie

Het wordt aanbevolen de Azure Az PowerShell-module te gebruiken om te communiceren met Azure. Zie Azure PowerShell installeren om aan de slag te gaan. Raadpleeg Azure PowerShell migreren van AzureRM naar Az om te leren hoe u naar de Azure PowerShell-module migreert.

Architectuur en planning

HDInsight staat geen directe verbinding met Kafka toe via het openbare internet. In plaats daarvan moeten Kafka-clients (producenten en consumenten) een van de volgende verbindingsmethoden gebruiken:

  • Voer de client uit in hetzelfde virtuele netwerk als Kafka in HDInsight. Deze configuratie wordt gebruikt in het Document Starten met Apache Kafka in HDInsight . De client wordt rechtstreeks uitgevoerd op de HDInsight-clusterknooppunten of op een andere virtuele machine in hetzelfde netwerk.

  • Verbinding maken een particulier netwerk, zoals uw on-premises netwerk, naar het virtuele netwerk. Met deze configuratie kunnen clients in uw on-premises netwerk rechtstreeks met Kafka werken. Voer de volgende taken uit om deze configuratie in te schakelen:

    1. Maak een virtueel netwerk.

    2. Maak een VPN-gateway die gebruikmaakt van een site-naar-site-configuratie. De configuratie die in dit document wordt gebruikt, maakt verbinding met een VPN-gatewayapparaat in uw on-premises netwerk.

    3. Maak een DNS-server in het virtuele netwerk.

    4. Configureer doorsturen tussen de DNS-server in elk netwerk.

    5. Maak een Kafka-cluster in HDInsight in het virtuele netwerk.

      Zie de Verbinding maken naar Apache Kafka vanuit een on-premises netwerksectie voor meer informatie.

  • Verbinding maken afzonderlijke machines naar het virtuele netwerk met behulp van een VPN-gateway en VPN-client. Voer de volgende taken uit om deze configuratie in te schakelen:

    1. Maak een virtueel netwerk.

    2. Maak een VPN-gateway die gebruikmaakt van een punt-naar-site-configuratie. Deze configuratie kan worden gebruikt met zowel Windows- als MacOS-clients.

    3. Maak een Kafka-cluster in HDInsight in het virtuele netwerk.

    4. Kafka configureren voor IP-reclame. Met deze configuratie kan de client verbinding maken met behulp van broker-IP-adressen in plaats van domeinnamen.

    5. Download en gebruik de VPN-client op het ontwikkelsysteem.

      Zie de Verbinding maken naar Apache Kafka met een VPN-clientsectie voor meer informatie.

      Waarschuwing

      Deze configuratie wordt alleen aanbevolen voor ontwikkelingsdoeleinden vanwege de volgende beperkingen:

      • Elke client moet verbinding maken met behulp van een VPN-softwareclient.
      • De VPN-client geeft geen aanvragen voor naamomzetting door aan het virtuele netwerk, dus u moet IP-adressering gebruiken om te communiceren met Kafka. IP-communicatie vereist aanvullende configuratie in het Kafka-cluster.

Zie Een virtueel netwerk plannen voor Azure HDInsight-clusters voor meer informatie over het gebruik van HDInsight in een virtueel netwerk.

Verbinding maken naar Apache Kafka vanuit een on-premises netwerk

Als u een Kafka-cluster wilt maken dat communiceert met uw on-premises netwerk, volgt u de stappen in de Verbinding maken HDInsight naar uw on-premises netwerkdocument.

Belangrijk

Wanneer u het HDInsight-cluster maakt, selecteert u het Kafka-clustertype .

Met deze stappen maakt u de volgende configuratie:

  • Azure Virtual Network
  • Site-naar-site-VPN-gateway
  • Azure Storage-account (gebruikt door HDInsight)
  • Kafka op HDInsight

Als u wilt controleren of een Kafka-client vanaf on-premises verbinding kan maken met het cluster, gebruikt u de stappen in de sectie Voorbeeld: Python-client .

Verbinding maken naar Apache Kafka met een VPN-client

Gebruik de stappen in deze sectie om de volgende configuratie te maken:

  • Azure Virtual Network
  • Punt-naar-site-VPN-gateway
  • Azure Storage-account (gebruikt door HDInsight)
  • Kafka op HDInsight
  1. Volg de stappen in het document Werken met zelfondertekende certificaten voor punt-naar-site-verbindingen . In dit document worden de certificaten gemaakt die nodig zijn voor de gateway.

  2. Open een PowerShell-prompt en gebruik de volgende code om u aan te melden bij uw Azure-abonnement:

    Connect-AzAccount
    # If you have multiple subscriptions, uncomment to set the subscription
    #Select-AzSubscription -SubscriptionName "name of your subscription"
    
  3. Gebruik de volgende code om variabelen te maken die configuratiegegevens bevatten:

    # Prompt for generic information
    $resourceGroupName = Read-Host "What is the resource group name?"
    $baseName = Read-Host "What is the base name? It is used to create names for resources, such as 'net-basename' and 'kafka-basename':"
    $location = Read-Host "What Azure Region do you want to create the resources in?"
    $rootCert = Read-Host "What is the file path to the root certificate? It is used to secure the VPN gateway."
    
    # Prompt for HDInsight credentials
    $adminCreds = Get-Credential -Message "Enter the HTTPS user name and password for the HDInsight cluster" -UserName "admin"
    $sshCreds = Get-Credential -Message "Enter the SSH user name and password for the HDInsight cluster" -UserName "sshuser"
    
    # Names for Azure resources
    $networkName = "net-$baseName"
    $clusterName = "kafka-$baseName"
    $storageName = "store$baseName" # Can't use dashes in storage names
    $defaultContainerName = $clusterName
    $defaultSubnetName = "default"
    $gatewaySubnetName = "GatewaySubnet"
    $gatewayPublicIpName = "GatewayIp"
    $gatewayIpConfigName = "GatewayConfig"
    $vpnRootCertName = "rootcert"
    $vpnName = "VPNGateway"
    
    # Network settings
    $networkAddressPrefix = "10.0.0.0/16"
    $defaultSubnetPrefix = "10.0.0.0/24"
    $gatewaySubnetPrefix = "10.0.1.0/24"
    $vpnClientAddressPool = "172.16.201.0/24"
    
    # HDInsight settings
    $hdiWorkerNodes = 4
    $hdiVersion = "3.6"
    $hdiType = "Kafka"
    
  4. Gebruik de volgende code om de Azure-resourcegroep en het virtuele netwerk te maken:

    # Create the resource group that contains everything
    New-AzResourceGroup -Name $resourceGroupName -Location $location
    
    # Create the subnet configuration
    $defaultSubnetConfig = New-AzVirtualNetworkSubnetConfig -Name $defaultSubnetName `
        -AddressPrefix $defaultSubnetPrefix
    $gatewaySubnetConfig = New-AzVirtualNetworkSubnetConfig -Name $gatewaySubnetName `
        -AddressPrefix $gatewaySubnetPrefix
    
    # Create the subnet
    New-AzVirtualNetwork -Name $networkName `
        -ResourceGroupName $resourceGroupName `
        -Location $location `
        -AddressPrefix $networkAddressPrefix `
        -Subnet $defaultSubnetConfig, $gatewaySubnetConfig
    
    # Get the network & subnet that were created
    $network = Get-AzVirtualNetwork -Name $networkName `
        -ResourceGroupName $resourceGroupName
    $gatewaySubnet = Get-AzVirtualNetworkSubnetConfig -Name $gatewaySubnetName `
        -VirtualNetwork $network
    $defaultSubnet = Get-AzVirtualNetworkSubnetConfig -Name $defaultSubnetName `
        -VirtualNetwork $network
    
    # Set a dynamic public IP address for the gateway subnet
    $gatewayPublicIp = New-AzPublicIpAddress -Name $gatewayPublicIpName `
        -ResourceGroupName $resourceGroupName `
        -Location $location `
        -AllocationMethod Dynamic
    $gatewayIpConfig = New-AzVirtualNetworkGatewayIpConfig -Name $gatewayIpConfigName `
        -Subnet $gatewaySubnet `
        -PublicIpAddress $gatewayPublicIp
    
    # Get the certificate info
    # Get the full path in case a relative path was passed
    $rootCertFile = Get-ChildItem $rootCert
    $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($rootCertFile)
    $certBase64 = [System.Convert]::ToBase64String($cert.RawData)
    $p2sRootCert = New-AzVpnClientRootCertificate -Name $vpnRootCertName `
        -PublicCertData $certBase64
    
    # Create the VPN gateway
    New-AzVirtualNetworkGateway -Name $vpnName `
        -ResourceGroupName $resourceGroupName `
        -Location $location `
        -IpConfigurations $gatewayIpConfig `
        -GatewayType Vpn `
        -VpnType RouteBased `
        -EnableBgp $false `
        -GatewaySku Standard `
        -VpnClientAddressPool $vpnClientAddressPool `
        -VpnClientRootCertificates $p2sRootCert
    

    Waarschuwing

    Het kan enkele minuten duren voordat dit proces is voltooid.

  5. Gebruik de volgende code om het Azure Storage-account en de blobcontainer te maken:

    # Create the storage account
    New-AzStorageAccount `
        -ResourceGroupName $resourceGroupName `
        -Name $storageName `
        -SkuName Standard_GRS `
        -Location $location `
        -Kind StorageV2 `
        -EnableHttpsTrafficOnly 1
    
    # Get the storage account keys and create a context
    $defaultStorageKey = (Get-AzStorageAccountKey -ResourceGroupName $resourceGroupName `
        -Name $storageName)[0].Value
    $storageContext = New-AzStorageContext -StorageAccountName $storageName `
        -StorageAccountKey $defaultStorageKey
    
    # Create the default storage container
    New-AzStorageContainer -Name $defaultContainerName `
        -Context $storageContext
    
  6. Gebruik de volgende code om het HDInsight-cluster te maken:

    # Create the HDInsight cluster
    New-AzHDInsightCluster `
        -ResourceGroupName $resourceGroupName `
        -ClusterName $clusterName `
        -Location $location `
        -ClusterSizeInNodes $hdiWorkerNodes `
        -ClusterType $hdiType `
        -OSType Linux `
        -Version $hdiVersion `
        -HttpCredential $adminCreds `
        -SshCredential $sshCreds `
        -DefaultStorageAccountName "$storageName.blob.core.windows.net" `
        -DefaultStorageAccountKey $defaultStorageKey `
        -DefaultStorageContainer $defaultContainerName `
        -DisksPerWorkerNode 2 `
        -VirtualNetworkId $network.Id `
        -SubnetName $defaultSubnet.Id
    

    Waarschuwing

    Dit proces duurt ongeveer 15 minuten.

Kafka configureren voor IP-reclame

Apache Zookeeper retourneert standaard de domeinnaam van de Kafka-brokers aan clients. Deze configuratie werkt niet met de VPN-softwareclient, omdat deze geen naamomzetting kan gebruiken voor entiteiten in het virtuele netwerk. Voor deze configuratie gebruikt u de volgende stappen om Kafka te configureren voor het adverteren van IP-adressen in plaats van domeinnamen:

  1. Ga in een webbrowser naar https://CLUSTERNAME.azurehdinsight.net. Vervang door CLUSTERNAME de naam van het Kafka-cluster in HDInsight.

    Wanneer u hierom wordt gevraagd, gebruikt u de HTTPS-gebruikersnaam en het wachtwoord voor het cluster. De Ambari-webinterface voor het cluster wordt weergegeven.

  2. Als u informatie over Kafka wilt weergeven, selecteert u Kafka in de lijst aan de linkerkant.

    Service list with Kafka highlighted.

  3. Als u de Kafka-configuratie wilt weergeven, selecteert u Configuraties in het midden bovenaan.

    Apache Ambari services configuration.

  4. Als u de kafka-env-configuratie wilt vinden, voert u kafka-env in het filterveld rechtsboven in.

    Kafka configuration, for kafka-env.

  5. Als u Kafka wilt configureren voor het adverteren van IP-adressen, voegt u de volgende tekst toe aan de onderkant van het veld kafka-env-template :

    # Configure Kafka to advertise IP addresses instead of FQDN
    IP_ADDRESS=$(hostname -i)
    echo advertised.listeners=$IP_ADDRESS
    sed -i.bak -e '/advertised/{/advertised@/!d;}' /usr/hdp/current/kafka-broker/conf/server.properties
    echo "advertised.listeners=PLAINTEXT://$IP_ADDRESS:9092" >> /usr/hdp/current/kafka-broker/conf/server.properties
    
  6. Als u de interface wilt configureren waarop Kafka luistert, voert listeners u het filterveld in de rechterbovenhoek in.

  7. Als u Kafka wilt configureren om te luisteren op alle netwerkinterfaces, wijzigt u de waarde in het listenersveld in PLAINTEXT://0.0.0.0:9092.

  8. Gebruik de knop Opslaan om de configuratiewijzigingen op te slaan. Voer een tekstbericht in waarin de wijzigingen worden beschreven. Selecteer OK zodra de wijzigingen zijn opgeslagen.

    Apache Ambari save configuration.

  9. Als u fouten wilt voorkomen bij het opnieuw opstarten van Kafka, gebruikt u de knop Serviceacties en selecteert u Onderhoudsmodus inschakelen. Selecteer OK om deze bewerking te voltooien.

    Service actions, with turn on maintenance highlighted.

  10. Als u Kafka opnieuw wilt starten, gebruikt u de knop Opnieuw opstarten en selecteert u Alles opnieuw opstarten. Bevestig het opnieuw opstarten en gebruik vervolgens de knop OK nadat de bewerking is voltooid.

    Restart button with restart all affected highlighted.

  11. Als u de onderhoudsmodus wilt uitschakelen, gebruikt u de knop Serviceacties en selecteert u Onderhoudsmodus uitschakelen. Selecteer OK om deze bewerking te voltooien.

Verbinding maken naar de VPN-gateway

Als u verbinding wilt maken met de VPN-gateway, gebruikt u de Verbinding maken naar Azure van het document Een punt-naar-site-verbinding configureren.

Voorbeeld: Python-client

Als u connectiviteit met Kafka wilt valideren, gebruikt u de volgende stappen om een Python-producent en -consument te maken en uit te voeren:

  1. Gebruik een van de volgende methoden om de FQDN (Fully Qualified Domain Name) en IP-adressen van de knooppunten in het Kafka-cluster op te halen:

    $resourceGroupName = "The resource group that contains the virtual network used with HDInsight"
    
    $clusterNICs = Get-AzNetworkInterface -ResourceGroupName $resourceGroupName | where-object {$_.Name -like "*node*"}
    
    $nodes = @()
    foreach($nic in $clusterNICs) {
        $node = new-object System.Object
        $node | add-member -MemberType NoteProperty -name "Type" -value $nic.Name.Split('-')[1]
        $node | add-member -MemberType NoteProperty -name "InternalIP" -value $nic.IpConfigurations.PrivateIpAddress
        $node | add-member -MemberType NoteProperty -name "InternalFQDN" -value $nic.DnsSettings.InternalFqdn
        $nodes += $node
    }
    $nodes | sort-object Type
    
    az network nic list --resource-group <resourcegroupname> --output table --query "[?contains(name,'node')].{NICname:name,InternalIP:ipConfigurations[0].privateIpAddress,InternalFQDN:dnsSettings.internalFqdn}"
    

    In dit script wordt ervan uitgegaan dat dit $resourceGroupName de naam is van de Azure-resourcegroep die het virtuele netwerk bevat.

    Sla de geretourneerde gegevens op voor gebruik in de volgende stappen.

  2. Gebruik het volgende om de kafka-python-client te installeren:

    pip install kafka-python
    
  3. Gebruik de volgende Python-code om gegevens naar Kafka te verzenden:

    from kafka import KafkaProducer
    # Replace the `ip_address` entries with the IP address of your worker nodes
    # NOTE: you don't need the full list of worker nodes, just one or two.
    producer = KafkaProducer(bootstrap_servers=['kafka_broker_1','kafka_broker_2'])
    for _ in range(50):
       producer.send('testtopic', b'test message')
    

    Vervang de 'kafka_broker' vermeldingen door de adressen die zijn geretourneerd uit stap 1 in deze sectie:

    • Als u een Software VPN-client gebruikt, vervangt u de kafka_broker vermeldingen door het IP-adres van uw werkknooppunten.

    • Als u naamomzetting via een aangepaste DNS-server hebt ingeschakeld, vervangt u de kafka_broker vermeldingen door de FQDN van de werkknooppunten.

      Notitie

      Met deze code wordt de tekenreeks naar het onderwerp testtopicverzondentest message. De standaardconfiguratie van Kafka in HDInsight is om het onderwerp niet te maken als het niet bestaat. Zie Hoe u Apache Kafka in HDInsight configureert om automatisch onderwerpen te maken. U kunt ook onderwerpen handmatig maken voordat u berichten produceert.

  4. Gebruik de volgende Python-code om de berichten op te halen uit Kafka:

    from kafka import KafkaConsumer
    # Replace the `ip_address` entries with the IP address of your worker nodes
    # Again, you only need one or two, not the full list.
    # Note: auto_offset_reset='earliest' resets the starting offset to the beginning
    #       of the topic
    consumer = KafkaConsumer(bootstrap_servers=['kafka_broker_1','kafka_broker_2'],auto_offset_reset='earliest')
    consumer.subscribe(['testtopic'])
    for msg in consumer:
      print (msg)
    

    Vervang de 'kafka_broker' vermeldingen door de adressen die zijn geretourneerd uit stap 1 in deze sectie:

    • Als u een Software VPN-client gebruikt, vervangt u de kafka_broker vermeldingen door het IP-adres van uw werkknooppunten.

    • Als u naamomzetting via een aangepaste DNS-server hebt ingeschakeld, vervangt u de kafka_broker vermeldingen door de FQDN van de werkknooppunten.

Volgende stappen

Zie het document Een virtueel netwerk plannen voor Azure HDInsight-clusters voor meer informatie over het gebruik van HDInsight met een virtueel netwerk.

Zie de volgende documenten voor meer informatie over het maken van een virtueel Azure-netwerk met punt-naar-site-VPN-gateway:

Zie de volgende documenten voor meer informatie over het werken met Apache Kafka in HDInsight: