2017-05-09 110 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