簡體   English   中英

如何在 Flink 中為 Google Cloud Storage 創建 RecoverableWriter

[英]How to create a RecoverableWriter in Flink for Google Cloud Storage

我想使用Google Cloud Storage從我的流式作業中使用StreamingFileSink編寫(接收DataStream元素。

為此,我將Google Cloud Storage 連接器用於 Hadoop 作為org.apache.hadoop.fs.FileSystem的實現,並使用HadoopFileSystem作為包裝了hadoop FileSystemorg.apache.flink.core.fs.FileSystem的實現對於 Flink。

我在我的 gradle 文件中包含了以下依賴項:

  • compile( "com.google.cloud.bigdataoss:gcs-connector:1.9.4-hadoop2" )
  • compile( "org.apache.flink:flink-connector-filesystem_2.11:1.6.0" )
  • provided( "org.apache.flink:flink-shaded-hadoop2:1.6.0" )

現在,根據我對來源[1] [2] [3] 的理解,Flink 在運行時動態加載FileSystemFactory的實現(通過java.util.ServiceLoader )並在運行時加載HadoopFsFactory (通過反射,如果它在類路徑中找到 Hadoop),然后用它來創建FileSystem實例。

我面臨的問題是 Hadoop 兼容包的默認RecoverableWriter僅支持hdfs文件方案(我使用gs ),因此在運行時引發錯誤

因此,我extendedHadoopFileSystem (我調用了GCSFileSystem )並@overrided FileSystem#createRecoverableWriter()以返回RecoverableWriter的自定義實現,然后處理恢復等的細節,並創建了一個相應的FileSystemFactory類(該類用@AutoService因此應該可以被ServiceLoader發現)。

設置效果很好本地和本地泊塢窗群集上(實際上是GCS連接器拋出一個錯誤,由於缺乏授權,但是這很好,因為這意味着該FileSystem被加載並運行),但是當我把它部署到一個碼頭工人集群失敗在谷歌計算引擎上運行。

在 GCE 上,默認的HadoopFileSystem被加載並拋出異常,因為方案是gs而不是hdfs ,但我的假設是它應該已經加載了我的工廠實現,因此不應該出現這個錯誤。

我在 Flink v1.6.0 上使用docker-flink在 Docker 上運行長時間運行的會話集群

答案在OP的最后一行!!

我是一個長期的生活會話集群上運行,並通過時間我job.jar執行該FileSystem初始化已經完成,已經加載的工廠! 因此,當我添加我的工作時沒有進行初始化調用。

解決方案? 根據您部署作業的方式,有幾種方法:

  • 獨立:將包含FileSystem實現的 jar 添加到lib/目錄

  • 集群( manual ):將包含FileSystem實現的 jar 添加到您的zip或圖像或其他任何東西的lib/目錄中。

  • 集群 ( docker )( long-living ):創建自定義容器鏡像並將 jar 添加到該鏡像的lib/目錄中。

  • 集群 ( docker )( per-job-session ):創建自定義容器映像並將所有 jar(包含FileSystem和您的作業等)添加到lib/目錄, 在此處閱讀有關每個作業會話的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM