DataLake在读取和写入同一文件时锁定

问题描述 投票:0回答:1

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

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

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

是否有锁定此操作的选项:执行写操作时,不应进行任何读取;发生读操作时,应进行相同操作,直到读操作完成为止。

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

谢谢。

azure azure-data-lake
1个回答
0
投票

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

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

写作者必须先获得文件的排他锁,允许在这些文件中写入/追加/截断数据。尤其是此排他锁不会阻止其他客户端读取文件,(这样客户端可以同时写文件另一个可能正在读取相同的文件)。

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

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


我在此处提供一种解决方法,供您参考:在进行读写之前添加Redis数据库!

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

尽管这可能有点麻烦或影响性能,但我认为它可以满足您的需求。顺便说一句,考虑到业务逻辑可能会失败或崩溃,以致永远不会释放密钥,可以在创建密钥时添加TTL设置,以避免这种情况。

希望对您有好处。

© www.soinside.com 2019 - 2024. All rights reserved.