Terhubung ke Apache Kafka pada HDInsight melalui Azure Virtual Network
Pelajari cara untuk langsung terhubung ke Apache Kafka pada HDInsight melalui Azure Virtual Network. Dokumen ini menyediakan informasi tentang penghubungan ke Kafka menggunakan konfigurasi berikut:
- Dari sumber daya dalam jaringan lokal. Koneksi ini didirikan dengan menggunakan perangkat VPN (perangkat lunak atau perangkat keras) pada jaringan lokal Anda.
- Dari lingkungan pengembangan menggunakan klien perangkat lunak VPN.
Catatan
Sebaiknya Anda menggunakan modul Azure Az PowerShell untuk berinteraksi dengan Azure. Untuk memulai, lihat Menginstal Azure PowerShell. Untuk mempelajari cara bermigrasi ke modul Az PowerShell, lihat Memigrasikan Azure PowerShell dari AzureRM ke Az.
Arsitektur dan perencanaan
HDInsight tidak mengizinkan koneksi langsung ke Kafka melalui internet publik. Sebagai gantinya, klien Kafka (produsen dan konsumen) harus menggunakan salah satu metode koneksi berikut:
Menjalankan klien dalam jaringan virtual yang sama dengan Kafka pada HDInsight. Konfigurasi ini digunakan dalam dokumen Memulai dengan Apache Kafka pada HDInsight. Klien berjalan langsung pada simpul kluster HDInsight atau pada komputer virtual lain di jaringan yang sama.
Hubungkan jaringan privat, seperti jaringan lokal Anda, ke jaringan virtual. Konfigurasi ini memungkinkan klien di jaringan lokal Anda untuk langsung menggunakan Kafka. Untuk mengaktifkan konfigurasi ini, lakukan tugas berikut:
Buat jaringan virtual.
Membuat gateway VPN yang menggunakan konfigurasi situs ke situs. Konfigurasi yang digunakan dalam dokumen ini terhubung ke perangkat gateway VPN di jaringan lokal Anda.
Membuat server DNS di jaringan virtual.
Mengonfigurasi penerusan antara server DNS di setiap jaringan.
Membuat Kafka pada kluster HDInsight di jaringan virtual.
Untuk informasi selengkapnya, lihat bagian Terhubung ke Apache Kafka dari jaringan lokal.
Hubungkan mesin individu ke jaringan virtual menggunakan gateway VPN dan klien VPN. Untuk mengaktifkan konfigurasi ini, lakukan tugas berikut:
Buat jaringan virtual.
Membuat gateway VPN yang menggunakan konfigurasi titik ke situs. Konfigurasi ini dapat digunakan dengan klien Windows dan MacOS.
Membuat Kafka pada kluster HDInsight di jaringan virtual.
Mengonfigurasi Kafka untuk iklan IP. Konfigurasi ini memungkinkan klien untuk terhubung menggunakan alamat IP perantara dan bukan nama domain.
Mengunduh dan menggunakan klien VPN pada sistem pengembangan.
Untuk informasi selengkapnya, lihat bagian Terhubung ke Apache Kafka dengan klien VPN.
Peringatan
Konfigurasi ini hanya direkomendasikan untuk tujuan pengembangan karena keterbatasan berikut:
- Setiap klien harus terhubung menggunakan klien perangkat lunak VPN.
- Klien VPN tidak meneruskan permintaan resolusi nama ke jaringan virtual, jadi Anda harus menggunakan alamat IP untuk berkomunikasi dengan Kafka. Komunikasi IP memerlukan konfigurasi tambahan pada kluster Kafka.
Untuk informasi selengkapnya tentang penggunaan HDInsight di jaringan virtual, lihat dokumen Merencanakan jaringan virtual untuk kluster Azure HDInsight.
Menyambungkan ke Apache Kafka dari jaringan lokal
Untuk membuat kluster Kafka yang berkomunikasi dengan jaringan lokal Anda, ikuti langkah-langkah dalam dokumen Menghubungkan HDInsight ke jaringan lokal Anda.
Penting
Saat membuat kluster HDInsight, pilih jenis kluster Kafka.
Langkah-langkah ini membuat konfigurasi berikut:
- Microsoft Azure Virtual Network
- Gateway VPN situs ke situs
- Akun Azure Storage (digunakan oleh HDInsight)
- Kafka pada HDInsight
Untuk memverifikasi klien Kafka dapat terhubung ke kluster dari lokal, gunakan langkah-langkah di bagian Contoh: klien Python.
Menyambungkan ke Apache Kafka dengan klien VPN
Gunakan langkah-langkah di bagian ini untuk membuat konfigurasi berikut:
- Microsoft Azure Virtual Network
- Gateway VPN titik ke situs
- Akun Azure Storage (digunakan oleh HDInsight)
- Kafka pada HDInsight
Ikuti langkah-langkah dalam dokumen Menggunakan sertifikat yang ditandatangani sendiri untuk koneksi Titik ke situs. Dokumen ini membuat sertifikat yang diperlukan untuk gateway.
Buka perintah PowerShell dan gunakan kode berikut ini untuk masuk ke langganan Azure Anda:
Connect-AzAccount # If you have multiple subscriptions, uncomment to set the subscription #Select-AzSubscription -SubscriptionName "name of your subscription"
Gunakan kode berikut untuk membuat variabel yang berisi informasi konfigurasi:
# 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"
Gunakan kode berikut untuk membuat grup sumber daya Azure dan jaringan virtual:
# 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
Peringatan
Dibutuhkan waktu beberapa menit agar proses ini selesai.
Gunakan kode berikut untuk membuat Akun Azure Storage dan kontainer blob:
# 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
Gunakan kode berikut untuk membuat kluster HDInsight:
# 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
Peringatan
Prosedur ini membutuhkan waktu sekitar 15 menit untuk selesai.
Mengonfigurasi Kafka untuk iklan IP
Secara default, Apache Zookeeper menampilkan nama domain broker Kafka kepada klien. Konfigurasi ini tidak berfungsi dengan klien perangkat lunak VPN, karena tidak dapat menggunakan resolusi nama untuk entitas di jaringan virtual. Gunakan langkah-langkah berikut untuk mengonfigurasi Kafka untuk mengiklankan alamat IP dan bukan nama domain:
Menggunakan browser web, buka
https://CLUSTERNAME.azurehdinsight.net
. GantiCLUSTERNAME
dengan nama Kafka pada kluster HDInsight.Ketika diminta, gunakan nama pengguna dan sandi HTTPS untuk kluster. Ambari Web UI untuk kluster ditampilkan.
Untuk melihat informasi tentang Kafka, pilih Kafka dari daftar di sebelah kiri.
Untuk melihat konfigurasi Kafka, pilih Konfigurasi dari tengah atas.
Untuk menemukan konfigurasi kafka-env, masukkan
kafka-env
di bidang Filter di kanan atas.Untuk mengonfigurasi Kafka guna mengiklankan alamat IP, tambahkan teks berikut ke bagian bawah bidang templat kafka-env:
# 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
Untuk mengonfigurasi antarmuka yang dipatuhi Kafka, masukkan
listeners
di bidang Filter pada kanan atas.Untuk mengonfigurasi Kafka untuk mematuhi semua antarmuka jaringan, ubah nilai di bidang listener menjadi
PLAINTEXT://0.0.0.0:9092
.Untuk menyimpan perubahan konfigurasi, gunakan tombol ​Simpan. Masukkan pesan teks yang menjelaskan perubahan. Pilih OK setelah perubahan disimpan.
Untuk mencegah kesalahan saat menghidupkan ulang Kafka, gunakan tombol Tindakan Layanan dan pilih Aktifkan Mode Pemeliharaan. Pilih OK untuk menyelesaikan operasi ini.
Untuk menghidupkan ulang Kafka, gunakan tombol Hidupkan Ulang dan pilih Hidupkan ulang Semua yang Terpengaruh. Konfirmasikan hidupkan ulang, lalu gunakan tombol OK setelah operasi selesai.
Untuk menonaktifkan mode pemeliharaan, gunakan tombol Tindakan Layanan dan pilih Mematikan Mode Pemeliharaan. Pilih OK untuk menyelesaikan operasi ini.
Terhubung ke gateway VPN
Untuk terhubung ke gateway VPN, gunakan bagian Terhubung ke Azure dari dokumen Mengonfigurasi koneksi Titik ke Situs.
Contoh: Klien Python
Untuk memvalidasi konektivitas ke Kafka, gunakan langkah-langkah berikut untuk membuat dan menjalankan produsen dan konsumen Python:
Gunakan salah satu metode berikut untuk mengambil nama domain yang sepenuhnya memenuhi syarat (FQDN) dan alamat IP simpul di kluster Kafka:
$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}"
Skrip ini mengasumsikan bahwa
$resourceGroupName
adalah nama grup sumber daya Azure yang berisi jaringan virtual.Simpan informasi yang ditampilkan untuk digunakan di langkah berikutnya.
Gunakan berikut ini untuk menginstal klien kafka-python:
pip install kafka-python
Untuk mengirim data ke Kafka, gunakan kode Python berikut:
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')
Ganti entri
'kafka_broker'
dengan alamat yang ditampilkan dari langkah 1 di bagian ini:Jika Anda menggunakan klien VPN perangkat lunak, ganti entri
kafka_broker
dengan alamat IP simpul pekerja Anda.Jika Anda telah mengaktifkan resolusi nama melalui server DNS kustom, ganti entri
kafka_broker
dengan FQDN simpul pekerja.Catatan
Kode ini mengirimkan string
test message
ke topiktesttopic
. Konfigurasi default Kafka di HDInsight adalah tidak membuat topik jika tidak ada. Lihat Cara mengonfigurasi Apache Kafka di HDInsight untuk membuat topik secara otomatis. Atau, Anda dapat membuat topik secara manual sebelum membuat pesan.
Untuk mengambil pesan dari Kafka, gunakan kode Python berikut:
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)
Ganti entri
'kafka_broker'
dengan alamat yang ditampilkan dari langkah 1 di bagian ini:Jika Anda menggunakan klien VPN perangkat lunak, ganti entri
kafka_broker
dengan alamat IP simpul pekerja Anda.Jika Anda telah mengaktifkan resolusi nama melalui server DNS kustom, ganti entri
kafka_broker
dengan FQDN simpul pekerja.
Langkah berikutnya
Untuk informasi selengkapnya tentang penggunaan HDInsight dengan jaringan virtual, lihat dokumen Merencanakan penyebaran jaringan virtual untuk kluster Azure HDInsight.
Untuk informasi selengkapnya tentang pembuatan Azure Virtual Network dengan gateway VPN Titik ke Situs, lihat dokumen berikut ini:
Mengonfigurasi koneksi Titik ke Situs menggunakan portal Microsoft Azure
Mengonfigurasi koneksi Titik ke Situs menggunakan Azure PowerShell
Untuk informasi selengkapnya tentang penggunaan Apache Kafka pada HDInsight, lihat dokumen berikut ini: