Azure Eventhubs(Python):使用blob存储设置检查点-启用检查点时EventProcessor中出现keyerror问题

Azure Eventhubs(Python):使用blob存储设置检查点-启用检查点时EventProcessor中出现keyerror问题,python,azure,azure-eventhub,azure-blob-storage,keyerror,Python,Azure,Azure Eventhub,Azure Blob Storage,Keyerror,我在eventhubs中遇到blob存储检查点问题。如果在获取消费者客户端时未设置检查点存储,则我的应用程序运行良好。每当我尝试设置checkpoint_store变量并运行代码时,它都会引发以下异常: eventhub使用者组的EventProcessor实例“XXXXXXXXXX”。负载平衡和声明所有权时出错。例外情况是KeyError('ownerid')。xxxx秒后重试 我能找到的唯一一个github条目甚至提到了这种错误是,但是问题本身从未得到解决,有问题的人最终使用了另一个库 我正

我在eventhubs中遇到blob存储检查点问题。如果在获取消费者客户端时未设置检查点存储,则我的应用程序运行良好。每当我尝试设置checkpoint_store变量并运行代码时,它都会引发以下异常:

eventhub使用者组的EventProcessor实例“XXXXXXXXXX”。负载平衡和声明所有权时出错。例外情况是KeyError('ownerid')。xxxx秒后重试

我能找到的唯一一个github条目甚至提到了这种错误是,但是问题本身从未得到解决,有问题的人最终使用了另一个库

我正在使用的相关库是azure eventhub和azure eventhub checkpointstoreblob aio

下面是我正在使用的()代码的相关片段:

这个问题似乎只与blob存储检查点有关;如果我在创建消费者客户端时注释掉“checkpoint\u store=checkpoint\u store”,那么一切运行都不会出现问题

与blob存储的连接看起来很好,因为我进行了一些挖掘,发现在blob存储中创建了一些文件夹“checkpoint”和“ownership”: 后者包含一些元数据中带有“ownerid”的文件:


也就是说,钥匙确实存在。我认为正在发生的是,EventProcessor正在尝试获取这些blob的所有权元数据,但不知何故未能做到这一点。如果有人知道如何解决这个问题,我将非常感激

从其中一个blob中检索“ownerid”时似乎出现了问题。你能帮我测试一下这些场景吗

  • 从blob容器中删除所有内容,然后重试
  • 如果问题仍然存在,是否可以检查每个blob是否都有元数据“ownerid”
  • 如果问题仍然存在,能否将azure eventhub checkpointstoreblob aio 1.1.0版库中文件azure.eventhub.extensions.checkpointstoreblobaio.\u blobstoragecsaio.py的第144行替换为以下内容,然后重试
  • “owner\u id”:blob.metadata.get(“ownerid”),
    
    根本原因是,在启用了data lake(分层命名空间)的v2存储blob上调用存储sdk的
    列表blob
    功能时,不仅会获取每个分区的检查点/所有权,还会获取不包含元数据的父blob节点

    为了更好地说明这一点,假设我们有以下blob结构:

    - fullqualifiednamespace (directory)
      - eventhubname (directory)
        - $default (directory)
            - ownership (directory)
              - 0 (blob)
              - 1 (blob)
              ...
    
    在启用了data lake(分层命名空间)的v2存储中,当代码使用前缀时
    {///ownership
    要搜索blob,当我们试图提取信息时,
    {///ownership
    目录本身也将返回不包含导致
    键错误的元数据

    checkpointstoreblob sdk有一个bug修复版本,请升级到最新版本以查看它是否解决了您的问题

    如果你有更多问题,请告诉我

    链接:

    对于同步:

    对于异步:


    github问题:

    checkpointstoreblobaio源代码中的第144行确实是问题的原因,用您的编辑替换它解决了问题。非常感谢!感谢Ramon的测试。我不知道此更改现在是否有任何副作用。如果您发现任何问题,请告诉我。我在repo中创建了一个用于跟踪此问题的。我无法在我的环境。您能告诉我您的python版本和操作系统版本吗?除了编辑第144行之外,我还必须将第244行替换为
    “offset”:blob.metadata.get(“offset”),
    并将第255行替换为
    “sequence\u number”:blob.metadata.get(“sequencenumber”),
    以完全修复它。我目前正在azure databricks环境(databricks Runtime 7.0 ML)中开发和测试。我在运行python 3.8.5和windows 10 build 18362.959的本地计算机上也遇到了同样的问题。请不要为您的问题添加答案。我已回滚/编辑了您的问题。请改为编写新的答案。
    async def on_event(partition_context, event):
        await partition_context.update_checkpoint(event)
        #<do stuff with event data>
    
    checkpoint_store = BlobCheckpointStore.from_connection_string(blob_connection_string, container_name)
    client = EventHubConsumerClient.from_connection_string(connection_str, consumer_group, eventhub_name=input_eventhub_name, checkpoint_store=checkpoint_store)
    
    async def main():
      async with client:
        await client.receive(
          on_event=on_event,
        )
        print("Terminated.")
    
    if __name__ == '__main__':
        loop = asyncio.get_event_loop()
        loop.run_until_complete(main())
    
    - fullqualifiednamespace (directory)
      - eventhubname (directory)
        - $default (directory)
            - ownership (directory)
              - 0 (blob)
              - 1 (blob)
              ...