Google cloud storage Flink检查点到谷歌云存储

Google cloud storage Flink检查点到谷歌云存储,google-cloud-storage,apache-flink,google-cloud-dataproc,Google Cloud Storage,Apache Flink,Google Cloud Dataproc,我正在尝试为GCS中的flink作业配置检查点。 如果我在本地运行测试作业(没有docker和任何集群设置),一切正常,但是如果我使用docker compose或集群设置运行测试作业,并在flink dashboard中使用作业部署fat jar,则测试作业将失败并出错 有什么想法吗? 谢谢 这是我的核心站点.xml文件: <configuration> <property> <name>google.cloud.auth.service.accou

我正在尝试为GCS中的flink作业配置检查点。 如果我在本地运行测试作业(没有docker和任何集群设置),一切正常,但是如果我使用docker compose或集群设置运行测试作业,并在flink dashboard中使用作业部署fat jar,则测试作业将失败并出错

有什么想法吗? 谢谢

这是我的
核心站点.xml
文件:

<configuration>
<property>
    <name>google.cloud.auth.service.account.enable</name>
    <value>true</value>
</property>
<property>
    <name>google.cloud.auth.service.account.json.keyfile</name>
    <value>${user.dir}/key.json</value>
</property>
<property>
    <name>fs.gs.impl</name>
    <value>com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem</value>
    <description>The FileSystem for gs: (GCS) uris.</description>
</property>
<property>
    <name>fs.AbstractFileSystem.gs.impl</name>
    <value>com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS</value>
    <description>The AbstractFileSystem for gs: (GCS) uris.</description>
</property>
<property>
    <name>fs.gs.application.name.suffix</name>
    <value>-kube-flink</value>
    <description>
        Appended to the user-agent header for API requests to GCS to help identify
        the traffic as coming from Dataproc.
    </description>
</property>

我相信这将是最后一个错误…

问题在于方案的实施。这是connec到地面军事系统的协议。如果添加以下依赖项,java程序应该能够运行:

<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-storage</artifactId>
  <version>1.35.0</version>
</dependency>

com.google.cloud
您将发现如何为任何其他编程语言添加此依赖项。

最终我找到了解决方案

您必须创建自己的映像,并将gcs连接器放入lib目录。否则,您总是会遇到类加载问题(用户代码和系统类加载器)

要创建自定义Docker映像,我们将创建以下Dockerfile:

一旦图像建成,我们将把图像上传到谷歌的 容器注册表。配置Docker以正确访问 注册表中,运行此命令一次:

$ gcloud auth configure-docker
接下来,我们将标记并上载容器:

$ docker tag flink-1.4.2-gs:latest eu.gcr.io/<your project id>/flink-1.4.2-gs
$ docker push eu.gcr.io/<your project id>/flink-1.4.2-gs
$docker tag flink-1.4.2-gs:最新的eu.gcr.io//flink-1.4.2-gs
$docker push eu.gcr.io//flink-1.4.2-gs
上传完成后,我们需要为 应用程序管理器部署。已发送以下修补程序请求:

PATCH /api/v1/deployments/<your AppMgr deployment id>
 spec:
   template:
     spec:
       flinkConfiguration:
         fs.hdfs.hadoopconf: /opt/flink/etc-hadoop/
       artifact:
         flinkImageRegistry: eu.gcr.io
         flinkImageRepository: <your project id>/flink-1.4.2-gs
         flinkImageTag: latest
PATCH/api/v1/deployments/
规格:
模板:
规格:
flinkConfiguration:
fs.hdfs.hadoopconf:/opt/flink/etc hadoop/
人工制品:
flinkImageRegistry:eu.gcr.io
flinkImageRepository:/flink-1.4.2-gs
flinkImageTag:最新版本
或者,使用以下curl命令:

$ docker build -t flink-1.4.2-gs .
$ curl -X PATCH --header 'Content-Type: application/yaml' --header 'Accept: application/yaml' -d '  spec: \ 
    template: \ 
      spec: \ 
        flinkConfiguration:
          fs.hdfs.hadoopconf: /opt/flink/etc-hadoop/
        artifact: \ 
          flinkImageRegistry: eu.gcr.io \ 
          flinkImageRepository: <your project id>/flink-1.4.2-gs \ 
          flinkImageTag: latest' 'http://localhost:8080/api/v1/deployments/<your AppMgr deployment id>‘
$curl-X补丁--header'Content-Type:application/yaml'-header'Accept:application/yaml'-d'spec:\
模板:\
规格:\
flinkConfiguration:
fs.hdfs.hadoopconf:/opt/flink/etc hadoop/
工件:\
flinkImageRegistry:eu.gcr.io\
flinkImageRepository:/flink-1.4.2-gs\
flinkImageTag:最新版本“”http://localhost:8080/api/v1/deployments/‘
实施此更改后,您将能够检查到Google的 云存储。指定目录时使用以下模式 gs:///检查点。对于保存点,请设置 state.savepoints.dir Flink配置选项


我已经检查了文档,我不确定您的依赖关系是否正确。如果将此依赖项用于gsc连接器,会发生什么情况
com.google.cloud.bigdataoss gcs连接器hadoop2-1.9.5已提供
Hello Philipp!事实上,我在故障排除方面取得了一些进展。我将flink docker映像从
flink:1.5.0
更改为
flink:1.5.2-hadoop28
,因此异常消失。不幸的是,我还有一个,你的建议没有帮助。我现在得到的是
java.lang.ClassNotFoundException:com.google.cloud.hadoop.repacked.gcs.com.google.api.client.auth.oauth2.TokenResponseException
似乎是类加载问题。它无法从GoogleHadoop文件系统数据库中查看GCS类…您能提供完整的pom.xml文件并更新错误消息吗?嗨,Philipp!我添加了一个更新信息。如果您能够帮助解决NoClassDefFound错误,那就太好了。谢谢你的帮助。你好,查克!谢谢你的回复,但我帮不了你。实际上,GoogleCloudStorageImpl中定义了一个匿名类,应用程序类加载器无法加载该类。我已经翻到了job jar,在classpath中有一个类GoogleCloudStorageImpl$6,但不知怎么的,它找不到了。哦!是的,根据您上次的更新,这样的类属于一个名为gcsio的包。我在github[1]中找到了GoogleCloudStorageImpl.java,它的pom.xml有一个依赖关系:您能用工作URL更新您的答案吗?“如果您计划将Apache Flink与Apache Hadoop一起使用(在Thread上运行Flink、连接到HDFS、连接到HBase或使用一些基于Hadoop的文件系统连接器)然后选择捆绑匹配Hadoop版本的下载,下载与您的版本匹配的可选预捆绑Hadoop并将其放置在Flink的lib文件夹中,或者导出您的Hadoop_类路径。“
FROM registry.platform.data-artisans.net/trial/v1.0/flink:1.4.2-dap1-scala_2.11

RUN wget -O lib/gcs-connector-latest-hadoop2.jar https://storage.googleapis.com/hadoop-lib/gcs/gcs-connector-latest-hadoop2.jar

RUN wget -O lib/gcs-connector-latest-hadoop2.jar https://storage.googleapis.com/hadoop-lib/gcs/gcs-connector-latest-hadoop2.jar && \     
wget http://ftp.fau.de/apache/flink/flink-1.4.2/flink-1.4.2-bin-hadoop28-scala_2.11.tgz && \

tar xf flink-1.4.2-bin-hadoop28-scala_2.11.tgz && \
mv flink-1.4.2/lib/flink-shaded-hadoop2* lib/  && \
rm -r flink-1.4.2*  

RUN mkdir etc-hadoop
COPY <name of key file>.json etc-hadoop/
COPY core-site.xml etc-hadoop/

ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 6123 8081
CMD ["jobmanager"]
$ docker build -t flink-1.4.2-gs .
$ gcloud auth configure-docker
$ docker tag flink-1.4.2-gs:latest eu.gcr.io/<your project id>/flink-1.4.2-gs
$ docker push eu.gcr.io/<your project id>/flink-1.4.2-gs
PATCH /api/v1/deployments/<your AppMgr deployment id>
 spec:
   template:
     spec:
       flinkConfiguration:
         fs.hdfs.hadoopconf: /opt/flink/etc-hadoop/
       artifact:
         flinkImageRegistry: eu.gcr.io
         flinkImageRepository: <your project id>/flink-1.4.2-gs
         flinkImageTag: latest
$ curl -X PATCH --header 'Content-Type: application/yaml' --header 'Accept: application/yaml' -d '  spec: \ 
    template: \ 
      spec: \ 
        flinkConfiguration:
          fs.hdfs.hadoopconf: /opt/flink/etc-hadoop/
        artifact: \ 
          flinkImageRegistry: eu.gcr.io \ 
          flinkImageRepository: <your project id>/flink-1.4.2-gs \ 
          flinkImageTag: latest' 'http://localhost:8080/api/v1/deployments/<your AppMgr deployment id>‘