[英]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 FileSystem類的org.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
),因此在運行時引發錯誤。
因此,我extended
了HadoopFileSystem
(我調用了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.