2017-05-09 89 views
1

我正在使用flink程序将我从kafka获得的流式数据写入Azure Data Lake。当我在获取ADLOutputStream和写入和关闭时使用同步时,它工作正常,但性能非常差,因为只有一个线程正在写入数据湖。当我使用多线程而没有同步时,它将抛出http 400 illegalargument异常。有多种线程可以写入Azure数据湖中的文件吗?如何从多线程写入流数据到Azure数据湖?

回答

1

再想一想你的设计。

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

1

使用AdlOuputStream不是这种并行写入的正确机制。 AdlOutputStream专为一个作家场景而设计。当从多个线程有并行摄取数据通常是我们通常看到的几个特点:

  1. 要优化吞吐量和不能做跨线程同步
  2. 订购(跨线程)通常并不重要

为了专门解决这些类型的场景,Azure Data Lake Store提供了一个独特的高性能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

几点需要注意的特定于Azure的数据湖店实现并发追加的:

  1. 一旦文件被用于并发追加,则不能使用固定偏移附加与它
  2. 这是POSS您可能会在文件中看到重复的数据。这是错误模式和自动重试的可能副作用。

编辑:此外,Murray Foxcraft的答案适用于具有合理文件旋转策略的长时间运行的线程。这种方法唯一的缺点是你不会得到大量的小文件。

+0

感谢您的指导和要点。我正在寻找过去两周的答案。 – Dhinesh

相关问题