将 HDInsight Kafka 群集与不同 VNet 中的客户端 VM 连接

本文介绍设置驻留在两个不同虚拟网络 (VNet) 中的虚拟机 (VM) 与 HDInsight Kafka 群集之间的连接的步骤。

将 HDInsight Kafka 群集与不同 VNet 中的客户端 VM 连接

  1. 创建两个不同的虚拟网络,分别托管 HDInsight Kafka 群集和 VM。 有关详细信息,请参阅使用 Azure 门户创建虚拟网络

  2. 将这两个虚拟网络对等互连,以便其子网的 IP 地址不会相互重叠。 有关详细信息,请参阅通过 Azure 门户使用虚拟网络对等互连连接虚拟网络

  3. 确保对等互连状态显示为“已连接”。

    Screenshot showing VNet peering.

  4. 在第一个 VNet hdi-primary-vnet 中创建 HDInsight Kafka 群集。 有关详细信息,请参阅创建 HDInsight Kafka 群集

  5. 在第二个 VNet hilo-secondary-vnet 中创建虚拟机 (VM)。 创建 VM 时,请指定必须部署此虚拟机的第二个 VNet 的名称。 有关详细信息,请参阅在 Azure 门户中创建 Linux 虚拟机

    注意

    如果群集中存在 VM,则 Kafka VM 的 IP 永远不会更改。 仅当手动替换群集中的 VM 时,该 IP 才会更改。 可以从 Ambari 门户检查最新的 IP。

从客户端 VM 连接到 HDInsight Kafka 群集的方法

  1. 为 Kafka 配置 IP 播发:使用 Kafka IP advertising 填充不同 vnet 中的 Kafka 工作器节点专用 IP。 完成 IP 播发后,使用专用 DNS 设置对工作器节点 FQDN 进行 DNS 解析。
  2. 更新客户端计算机中的 /etc/hosts 文件:使用 Kafka 头/工作器节点的 /etc/hosts 文件更新客户端计算机中的 /etc/hosts 文件。

注意

  • IP 播发后,专用 DNS 的设置是可选的。 仅当你想要将 Kafka 工作器节点的 FQDN 与专用 DNS 域名(而不是专用 IP)结合使用时,才需要这样做。
  • 如果群集中存在 VM,则 Kafka VM 的 IP 永远不会更改。 仅当手动替换群集中的 VM 时,该 IP 才会更改。 可以从 Ambari 门户检查最新的 IP。

为 IP 播发配置 Kafka

此配置允许客户端使用中转站 IP 地址而不是域名进行连接。 默认情况下,Apache Zookeeper 向客户端返回 Kafka 中转站的域名。

此配置不适用于 VPN 软件客户端,因为它无法对虚拟网络中的实体使用名称解析。

使用以下步骤将 HDInsight Kafka 配置为播发 IP 地址而不是域名:

  1. 使用 Web 浏览器转到 https://CLUSTERNAME.azurehdinsight.cn。 将 CLUSTERNAME 替换为 HDInsight Kafka 群集名称。

  2. 出现提示时,使用群集的 HTTPS usernamepassword。 将显示群集的 Ambari Web UI。

  3. 若要查看有关 Kafka 的信息,请从左侧面板中选择 Kafka,然后选择配置。

    Screenshot showing Kafka VNet configurations.

  4. 若要访问 Ambari 仪表板上的 kafka-env 配置,只需在 Ambari UI 中右上方的筛选器字段中键入 kafka-env

    Screenshot showing Kafka environment.

  5. 要配置 Kafka 以播发 IP 地址,请将下列文本添加到“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. 要配置 Kafka 侦听的接口,请在右上方的“筛选器”字段中输入 listeners

  7. 要将 Kafka 配置为侦听所有网络接口,请将“listeners”字段的值更改为“PLAINTEXT://0.0.0.0:9092”。

  8. 使用“Save”按钮保存配置更改。 输入描述更改的文本消息。 保存更改后,请选择“OK”。

    Screenshot showing the save button.

  9. 要防止在重启 Kafka 时出错,请使用“Actions”按钮,并选择“Turn On Maintenance Mode”。 选择“OK”完成此操作。

    Screenshot showing action button.

  10. 要重启 Kafka,请使用“Restart”按钮,然后选择“Restart All Affected”。 确认重启,在操作完成后再使用“OK”按钮。

    Screenshot showing how to restart.

  11. 要禁用维护模式,请使用“Actions”按钮,然后选择“Turn Off Maintenance Mode”。 选择“OK”完成此操作。

  12. 现在,可以使用 Kafka IP 地址从客户端 VM 执行作业。 要从 Ambari 门户检查工作器节点的 IP 地址,请单击左侧面板上的“Hosts”。

    Screenshot showing the worker node IP for Ambari.

  13. 使用示例 git 存储库创建 Kafka 主题 (https://github.com/Azure-Samples/hdinsight-kafka-java-get-started),以生成和使用来自该主题的数据。

    # In previous example IP of worker node 0 is `broker1-ip` and worker node 1 is `broker2-ip`
    # Create Kafka Topic 
    java -jar kafka-producer-consumer.jar create <topic_name> $KAFKABROKERS
    java -jar kafka-producer-consumer.jar create test broker1-ip:9092,broker1-ip:9092
    

    Screenshot showing how to create Kafka topic.

    # Produce Data in Topic
    java -jar kafka-producer-consumer.jar producer <topic_name> $KAFKABROKERS
    java -jar kafka-producer-consumer.jar producer test broker1-ip:9092, broker2-ip:9092
    

    Screenshot showing how to view Kafka producer.

    # Consume Data from Topic
    java -jar kafka-producer-consumer.jar consumer <topic_name> $KAFKABROKERS
    java -jar kafka-producer-consumer.jar consumer test broker1-ip:9092,broker2-ip:9092
    

    Screenshot showing Kafka consumer section.

    注意

    建议在 $KAFKABROKERS 中添加所有中转站 IP,实现容错。

更新客户端计算机中的 /etc/hosts 文件

  1. 将文件 /etc/host 的突出显示的工作器节点条目从 Kafka 头节点复制到客户端 VM。

  2. 创建这些条目后,尝试使用 Web 浏览器或 curl 命令访问 Kafka Ambari 仪表板,将 hn0 或 hn1 FQDN 用作:

    如果客户端 VM 使用 Linux OS

    # Execute curl command  
    curl hn0-hdi-ka.mvml5coqo4xuzc1nckq1sltcxf.bx.internal.chinacloudapp.cn:8080 
    
    # Output
    <!--
    * Licensed to the Apache Software Foundation (ASF) under one
    * or more contributor license agreements.  See the NOTICE file
    * distributed with this work for additional information
    * regarding copyright ownership.  The ASF licenses this file
    * to you under the Apache License, Version 2.0 (the
    * "License"); you may not use this file except in compliance
    * with the License.  You may obtain a copy of the License at
    *
    * http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    -->
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <link rel="stylesheet" href="stylesheets/vendor.css">
      <link rel="stylesheet" href="stylesheets/app.css">
      <script src="javascripts/vendor.js"></script>
      <script src="javascripts/app.js"></script>
      <script>
          $(document).ready(function() {
              require('initialize');
              // make favicon work in firefox
              $('link[type*=icon]').detach().appendTo('head');
              $('#loading').remove();
          });
      </script>
      <title>Ambari</title>
      <link rel="shortcut icon" href="/img/logo.png" type="image/x-icon">
    </head>
    <body> 
        <div id="loading">...Loading...</div>
        <div id="wrapper">
        <!-- ApplicationView -->
    
        </div>
        <footer>
            <div class="container footer-links">
                <a data-qa="license-link" href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Licensed under the Apache License, Version 2.0</a>.
                <a data-qa="third-party-link" href="/licenses/NOTICE.txt" target="_blank">See third-party tools/resources that Ambari uses and their respective authors</a>
             </div>
        </footer>
    </body>
    </html> 
    

如果客户端 VM 使用 Windows OS

  1. 转到 hdi-kafka 的概述页面,然后单击“Ambari 视图”获取 URL。

  2. 将创建群集时设置的用户名 admin 和密码 YOUR_PASSWORD 作为登录凭据。

    注意

    1. 在 Windows VM 中,需要将静态主机名添加到路径 C:\Windows\System32\drivers\etc\ 中存在的主机文件中。
    2. 本文假定 Ambari 服务器在 Head Node 0 上处于活动状态。 如果 Ambari 服务器在 Head Node 1 上处于活动状态,请使用 hn1 的 FQDN 访问 Ambari UI。

    Screenshot showing the dashboard.

  3. 还可以将消息发送到 kafka 主题,并从 VM 中读取主题。 为此,可以尝试使用此示例 Java 应用程序。

  4. 使用示例 git 存储库创建 Kafka 主题,生成和使用该主题中的数据。 有关详细信息,请参阅 hdinsight-kafka-java-getting-started

  5. 可以使用中转站的 FQDN、IP 或短名称(群集名称的前六个字母)来传递,如以下命令中的 KAFKABROKERS

     # In the previous example       # IP of worker node 0 is `broker1-ip` and worker node 1 is `broker2-ip`
     # Short Name of worker node 0 is `wn0-hdi-ka` and worker node 1 is `wn1-hdi-ka`      # FQDN of worker node 0 is `wn0-hdi-ka.mvml5coqo4xuzc1nckq1sltcxf.bx.internal.chinacloudapp.cn` and worker node 1 is `wn1-hdi-ka.mvml5coqo4xuzc1nckq1sltcxf.bx.internal.chinacloudapp.cn`
    
     # Create Kafka Topic 
          java -jar kafka-producer-consumer.jar create <topic_name> $KAFKABROKERS
          java -jar kafka-producer-consumer.jar create test broker1-ip:9092,broker2-ip:9092
    
     # Produce Data in Topic
          java -jar kafka-producer-consumer.jar producer <topic_name> $KAFKABROKERS
          java -jar kafka-producer-consumer.jar producer test wn0-hdi-ka:9092,wn1-hdi-ka:9092
    
     # Consume Data from Topic
          java -jar kafka-producer-consumer.jar consumer <topic_name> $KAFKABROKERS
          java -jar kafka-producer-consumer.jar consumer test wn0-hdi-ka.mvml5coqo4xuzc1nckq1sltcxf.bx.internal.chinacloudapp.cn:9092,wn1-hdi-ka.mvml5coqo4xuzc1nckq1sltcxf.bx.internal.chinacloudapp.cn:9092
    

注意

建议在 $KAFKABROKERS 中添加所有中转站 IP,FQDN 或短名称以实现容错。