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.
Verbind een particulier netwerk, zoals uw on-premises netwerk, met 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:
Maak een virtueel netwerk.
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.
Maak een DNS-server in het virtuele netwerk.
Configureer doorsturen tussen de DNS-server in elk netwerk.
Maak een Kafka-cluster in HDInsight in het virtuele netwerk.
Zie de sectie Verbinding maken met Apache Kafka vanuit een on-premises netwerk voor meer informatie.
Afzonderlijke machines verbinden met het virtuele netwerk met behulp van een VPN-gateway en VPN-client. Voer de volgende taken uit om deze configuratie in te schakelen:
Maak een virtueel netwerk.
Maak een VPN-gateway die gebruikmaakt van een punt-naar-site-configuratie. Deze configuratie kan worden gebruikt met zowel Windows- als MacOS-clients.
Maak een Kafka-cluster in HDInsight in het virtuele netwerk.
Kafka configureren voor IP-reclame. Met deze configuratie kan de client verbinding maken met behulp van broker-IP-adressen in plaats van domeinnamen.
Download en gebruik de VPN-client op het ontwikkelsysteem.
Zie de sectie Verbinding maken met Apache Kafka met een VPN-client 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 met 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 hdInsight verbinden met 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 met 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
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.
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"
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"
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.
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
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:
Ga in een webbrowser naar
https://CLUSTERNAME.azurehdinsight.net
. Vervang doorCLUSTERNAME
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.
Als u informatie over Kafka wilt weergeven, selecteert u Kafka in de lijst aan de linkerkant.
Als u de Kafka-configuratie wilt weergeven, selecteert u Configuraties in het midden bovenaan.
Als u de kafka-env-configuratie wilt vinden, voert u
kafka-env
in het filterveld rechtsboven in.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
Als u de interface wilt configureren waarop Kafka luistert, voert
listeners
u het filterveld in de rechterbovenhoek in.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
.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.
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.
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.
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 met de VPN-gateway
Als u verbinding wilt maken met de VPN-gateway, gebruikt u de sectie Verbinding maken met 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:
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.
Gebruik het volgende om de kafka-python-client te installeren:
pip install kafka-python
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
testtopic
verzondentest 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.
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:
Een punt-naar-site-verbinding configureren met behulp van Azure Portal
Een punt-naar-site-verbinding configureren met behulp van Azure PowerShell
Zie de volgende documenten voor meer informatie over het werken met Apache Kafka in HDInsight: