我正在使用flink程序来编写从kafka到Azure Data Lake的流数据。当我在获取ADLOutputStream和写入和关闭时使用同步时,它工作正常但性能非常差,因为只有一个线程正在写入数据湖。当我使用多线程而没有同步时,它会抛出http 400非法规范异常。多线程有没有办法写入Azure数据湖中的文件?
答案 0 :(得分:1)
再考虑一下你的设计。
一种方法是将多个文件写入Data Lake - 每个线程一个。进入Data Lake后,您可以使用USQL或PolyBase查询一组文件,就像它们是一个数据源一样。或者,您可以编排一个USQL作业,以便在文件存在于湖中时合并它们。这将是本地处理,并且表现良好。
答案 1 :(得分:1)
使用AdlOuputStream不是这种并行写入的正确机制。 AdlOutputStream专为单个编写器方案而设计。当从多个线程并行摄取数据时,我们通常会观察到一些特征:
为了专门解决这些类型的场景,Azure Data Lake Store提供了一种独特的高性能API,我们称之为“并发附加”#34;。
以下是向您展示如何使用此API的要点:https://gist.github.com/asikaria/0a806091655c6e963eea59e89fdd40a9
我们的SDK中的Core类提供了该方法:https://azure.github.io/azure-data-lake-store-java/javadoc/com/microsoft/azure/datalake/store/Core.html
特别注意并发附加的Azure Data Lake Store实现的一些要点:
编辑:此外,Murray Foxcraft的答案适用于具有合理文件轮换策略的长时间运行线程。在这种方法中唯一的缺点是你不会得到大量的小文件。