DataLake锁定对同一文件的读写

时间:2019-10-09 09:34:09

标签: azure azure-data-lake

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

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

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

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

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

谢谢。

1 个答案:

答案 0 :(得分: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设置来避免这种情况。