如何从多个线程向Azure数据湖写入流数据?

时间:2017-05-09 15:09:07

标签: azure apache-flink azure-data-lake

我正在使用flink程序来编写从kafka到Azure Data Lake的流数据。当我在获取ADLOutputStream和写入和关闭时使用同步时,它工作正常但性能非常差,因为只有一个线程正在写入数据湖。当我使用多线程而没有同步时,它会抛出http 400非法规范异常。多线程有没有办法写入Azure数据湖中的文件?

2 个答案:

答案 0 :(得分:1)

再考虑一下你的设计。

一种方法是将多个文件写入Data Lake - 每个线程一个。进入Data Lake后,您可以使用USQL或PolyBase查询一组文件,就像它们是一个数据源一样。或者,您可以编排一个USQL作业,以便在文件存在于湖中时合并它们。这将是本地处理,并且表现良好。

答案 1 :(得分:1)

使用AdlOuputStream不是这种并行写入的正确机制。 AdlOutputStream专为单个编写器方案而设计。当从多个线程并行摄取数据时,我们通常会观察到一些特征:

  1. 您希望针对吞吐量进行优化,而不是跨线程进行同步
  2. 订购(跨线程)通常并不重要
  3. 为了专门解决这些类型的场景,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实现的一些要点:

    1. 一旦文件与并发附加一起使用,就不能使用固定偏移量附加
    2. 您可能会在文件中看到重复的数据。这可能是错误模式和自动重试的副作用。
    3. 编辑:此外,Murray Foxcraft的答案适用于具有合理文件轮换策略的长时间运行线程。在这种方法中唯一的缺点是你不会得到大量的小文件。