【问题标题】:Check whether a Kafka topic exists in Python检查 Python 中是否存在 Kafka 主题
【发布时间】:2015-09-05 17:32:46
【问题描述】:

如果Kafka 主题尚不存在,我想创建它。我知道如何通过 bash 创建主题,但我不知道如何检查它是否存在。

topic_exists = ??????
if not topic_exists:
    subprocess.call([os.path.join(KAFKABIN, 'kafka-topics.sh'),
        '--create',  
        '--zookeeper', '{}:2181'.format(KAFKAHOST),
        '--topic', str(self.topic), 
        '--partitions', str(self.partitions),
        '--replication-factor', str(self.replication_factor)])

【问题讨论】:

    标签: python bash apache-kafka


    【解决方案1】:

    为此使用kafka-python consumer api。

    import kafka 
    consumer = kafka.KafkaConsumer(group_id='test', bootstrap_servers=your_server_list) 
    new_topics = set(wanted_topics)-set(consumer.topics())
    for topic in new_topics:
        create(topic)
    

    【讨论】:

      【解决方案2】:

      另一个不错的方法是使用 python kafka 模块:

      kafka_client = kafka.KafkaClient(kafka_server_name)
      server_topics = kafka_client.topic_partitions
      
      if topic_name in server_topics:
         your code....
      

      kafka_client.topic_partitions 返回主题列表。

      【讨论】:

      • 长期以来一直在寻找一种方法来做到这一点。从文档中看不出来,imo。
      • @sshow 请在此处写下您要查找的内容,以便下一个遇到您问题的人可以更快地找到它:)
      • 这正是我想要的。如果主题不存在,我需要一种尽早失败的方法,因为当前(kafka-python 1.3.5)当消费者开始轮询不存在的主题时,由于无限循环,消费者会消耗 100% 的 CPU。
      • 我也想要主题列表,因此我尝试了这段代码,但我收到错误,因为 - 'KafkaClient' 对象没有属性 'topic_partitions' 谁能帮助我为什么会这样
      【解决方案3】:

      您可以对kafka-topics.sh 使用--list (List all available topics) 选项,查看self.topic 是否存在于topics 数组中,如下所示。

      根据您拥有的主题数量,这种方法可能有点繁重。如果是这种情况,您也许可以使用--describe (List details for the given topics),如果主题不存在,它可能返回空。我还没有彻底测试过这个,所以我不能肯定这个解决方案 (--describe) 有多可靠,但你可能值得进一步调查一下。

      wanted_topics = ['host_updates_queue', 'foo_bar']
      
      topics = subprocess.check_output([os.path.join(KAFKABIN, 'kafka-topics.sh'),
              '--list',
              '--zookeeper', '{}:2181'.format(KAFKAHOST)])
      
      for wanted in wanted_topics:
          if wanted in topics:
              print '\'{}\' topic exists!'.format(wanted)
          else:
              print '\'{}\' topic does NOT exist!'.format(wanted)
      
          topic_desc = subprocess.check_output([os.path.join(KAFKABIN, 'kafka-topics.sh'),
              '--describe',
              '--topic', wanted,
              '--zookeeper', '{}:2181'.format(KAFKAHOST)])
      
          if not topic_desc:
              print 'No description found for the topic \'{}\''.format(wanted)
      

      输出:

      root@dev:/opt/kafka/kafka_2.10-0.8.2.1# ./t.py
      'host_updates_queue' topic exists!
      'foo_bar' topic does NOT exist!
      No description found for the topic 'foo_bar'
      

      还有一个Broker Configuration 可用,因此您不必采取以下任何步骤:

      auto.create.topics.enable |真实 |在服务器上启用主题的自动创建。如果设置为 true,则尝试为不存在的主题生成数据或获取元数据将使用默认复制因子和分区数自动创建它。

      如果可能,我会采用这种方法。

      请注意,您应该在您的代理上为 num.partitions 和 default.replication.factor 设置主题配置 (server.properties) 以匹配您在代码 sn-p 中的设置。

      【讨论】:

      • 是的,一个直接的解决方案。谢谢。
      • @ThS 不小心引用了错误的代理配置。我将帖子修复为引用auto.create.topics.enable,这是完成此操作的正确配置。注意默认是true,所以你可能不需要做任何事情:)
      猜你喜欢
      • 2017-10-02
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      相关资源
      最近更新 更多