azure - DataLake 锁定同一文件的读写

标签 azure azure-data-lake

我有 2 个不同的应用程序来处理来自 Data Lake Storage Gen1 的数据。

第一个应用程序上传文件:如果同一天多次上传,现有文件将被覆盖(始终是使用 YYYY-MM-dd 格式保存的每天一个文件)

第二个应用程序从文件中读取数据。

是否有一个选项可以锁定此操作:执行写入操作时,不应进行读取,同样,当发生读取时,写入应等待读取操作完成。

我没有找到任何使用 AdlsClient 的选项。

谢谢。

最佳答案

据我所知,ADL gen1 是与 Hadoop 分布式文件系统 (HDFS) 兼容的 Apache Hadoop 文件系统。于是查了一些HDFS的文档,恐怕无法直接控制读写互斥。请参阅以下文档:

1.link1:https://www.raviprak.com/research/hadoop/leaseManagement.html

writers must obtain an exclusive lock for a file before they’d be allowed to write / append / truncate data in those files. Notably, this exclusive lock does NOT prevent other clients from reading the file, (so a client could be writing a file, and at the same time another could be reading the same file).

2.link2:https://blog.cloudera.com/understanding-hdfs-recovery-processes-part-1/

客户端在写入 HDFS 文件之前,必须获得租约,租约本质上是一个锁。这确保了单作者语义。如果客户希望继续写信,则必须在预定时间内续签租约。如果租约没有明确续签或者持有租约的客户去世,那么租约就会到期。发生这种情况时,HDFS 将关闭该文件并代表客户端释放租约,以便其他客户端可以写入该文件。这个过程称为租约恢复。

<小时/>

我在这里提供一个解决方法供您引用:在写入和读取之前添加 Redis 数据库!

无论何时进行读或写操作,首先请判断Redis数据库中是否存在特定的key。如果没有,则将一组键值写入Redis。然后进行业务逻辑处理。最后不要忘记删除该 key 。

虽然这可能有点麻烦或影响性能,但我认为它可以满足您的需求。 BTW,考虑到业务逻辑可能会失败或崩溃导致 key 永远不会被释放,您可以添加 TTL创建 key 时进行设置以避免这种情况。

关于azure - DataLake 锁定同一文件的读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58301154/

相关文章:

azure - 如何手动激活/停用 Azure 服务总线的订阅

Azure应用程序自动扩展

azure - U-Sql 是否支持游标来迭代数据集并根据行值提取更多数据?

azure - 从 Databricks 访问 AzureDataLake Gen2

azure - 使用 Azure 数据工厂将压缩的 XML 文件从 HTTP 链接源复制并提取到 Azure Blob 存储

Azure Data Lake 存储和数据工厂 - 临时 GUID 文件夹和文件

postgresql - Microsoft Azure HDInsight Ambari Sqoop 和 Postgres

javascript - 使用 Node 缩略图从图像生成缩略图

linux - 尝试使用静态 IP 创建虚拟机时无法获取 CurrentStorageAccountName

python - Databricks 仅打印大约 280 行数据