如何从多线程将流数据写入azure数据湖?

ffx8fchx  于 2021-06-25  发布在  Flink
关注(0)|答案(2)|浏览(344)

我正在使用flink程序编写从kafka到azure数据湖的流数据。当我在获取adloutputstream以及写入和关闭时使用同步时,它工作得很好,但性能非常差,因为只有一个线程正在写入数据湖。当我使用多个线程而不进行同步时,它会引发http400 illegalargument异常。有没有什么方法可以让多个线程在azuredatalake中写入一个文件?

kulphzqa

kulphzqa1#

对你的设计有另一个想法。
一种方法是将多个文件写入数据湖—每个线程一个文件。一旦进入datalake,您就可以使用usql或polybase来查询一组文件,就像它们是一个数据源一样。或者,您可以编排一个usql作业,以便在文件进入湖中后将其合并。这将是本地处理,性能良好。

jutyujz0

jutyujz02#

使用adlouputstream不是这种并行写入的正确机制。adloutputstream是为单个编写器场景设计的。当从多个线程并行接收数据时,我们通常会观察到以下几个特征:
您希望优化吞吐量,而不是跨线程进行同步
排序(跨线程)通常并不重要
为了专门解决这些类型的场景,azuredatalakestore提供了一个独特的、高性能的api,我们称之为“并发附件”。
以下是演示如何使用此api的要点:https://gist.github.com/asikaria/0a806091655c6e963eea59e89fdd40a9
该方法在我们的sdk的核心类中可用:https://azure.github.io/azure-data-lake-store-java/javadoc/com/microsoft/azure/datalake/store/core.html
针对并发append的azure数据湖存储实现,需要注意以下几点:
一旦文件与并发追加一起使用,就不能使用固定偏移量追加
您可能会在文件中看到重复的数据。这可能是错误模式和自动重试的副作用。
编辑:murrayfoxcraft的答案也适用于具有合理文件轮换策略的长时间运行的线程。在这种方法中,唯一的缺点是你不会得到大量的小文件。

相关问题