amazon-s3 - Amazon EMR 在为 Apache-Flink 提交作业时遇到 Hadoop 可恢复错误

标签 amazon-s3 apache-flink hadoop2

Added Depedency Pom Details :

<dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.11</artifactId>
            <version>1.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_2.11</artifactId>
            <version>1.7.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-core</artifactId>
            <version>1.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>1.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-runtime_2.11</artifactId>
            <version>1.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table_2.11</artifactId>
            <version>1.7.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-kafka-0.10_2.11</artifactId>
            <version>1.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-filesystem_2.11</artifactId>
            <version>1.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-hadoop-compatibility_2.11</artifactId>
            <version>1.7.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-s3-fs-hadoop</artifactId>
            <version>1.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-shaded-hadoop</artifactId>
            <version>1.7.1</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-aws</artifactId>
            <version>2.8.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.8.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.8.5</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-s3</artifactId>
            <version>1.11.529</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-connectors</artifactId>
            <version>1.1.5</version>
            <type>pom</type>
        </dependency>
    </dependencies>

java.lang.UnsupportedOperationException: Recoverable writers on Hadoop are only supported for HDFS and for Hadoop version 2.7 or newer at org.apache.flink.runtime.fs.hdfs.HadoopRecoverableWriter.(HadoopRecoverableWriter.java:57) at org.apache.flink.runtime.fs.hdfs.HadoopFileSystem.createRecoverableWriter(HadoopFileSystem.java:202) at org.apache.flink.core.fs.SafetyNetWrapperFileSystem.createRecoverableWriter(SafetyNetWrapperFileSystem.java:69) at org.apache.flink.streaming.api.functions.sink.filesystem.Buckets.(Buckets.java:112) at org.apache.flink.streaming.api.functions.sink.filesystem.StreamingFileSink$RowFormatBuilder.createBuckets(StreamingFileSink.java:242) at org.apache.flink.streaming.api.functions.sink.filesystem.StreamingFileSink.initializeState(StreamingFileSink.java:327) at org.apache.flink.streaming.util.functions.StreamingFunctionUtils.tryRestoreFunction(StreamingFunctionUtils.java:178) at org.apache.flink.streaming.util.functions.StreamingFunctionUtils.restoreFunctionState(StreamingFunctionUtils.java:160) at org.apache.flink.streaming.api.operators.AbstractUdfStreamOperator.initializeState(AbstractUdfStreamOperator.java:96) at org.apache.flink.streaming.api.operators.AbstractStreamOperator.initializeState(AbstractStreamOperator.java:278) at org.apache.flink.streaming.runtime.tasks.StreamTask.initializeState(StreamTask.java:738) at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:289) at org.apache.flink.runtime.taskmanager.Task.run(Task.java:704) at java.lang.Thread.run(Thread.java:748)

最佳答案

Flink 使用一种叫做 ServiceLoader 的东西加载 interface with pluggable File Systems 所需的组件.如果您想查看 Flink 在代码中执行此操作的位置,请转到 org.apache.flink.core.fs.FileSystem。请注意 initialize 函数,它使用了 RAW_FACTORIES 变量。 RAW_FACTORIES 由函数 loadFileSystems 创建,您可以看到它使用了 Java 的 ServiceLoader

在您的应用程序在 Flink 上启动之前,需要设置文件系统组件。这意味着您的 Flink 应用程序不需要捆绑这些组件,它们应该为您的应用程序提供。

EMR 不提供 Flink 开箱即用 S3 作为流文件接收器所需的 S3 文件系统组件。抛出这个异常不是因为版本不够高,而是因为 Flink 在没有匹配 s3 方案(see code here)的文件系统的情况下加载了 HadoopFileSystem。

您可以通过为我的 Flink 应用程序启用 DEBUG 日志记录级别来查看您的文件系统是否正在加载,EMR 允许您在配置中这样做:

{
    "Classification": "flink-log4j",
    "Properties": {
      "log4j.rootLogger": "DEBUG,file"
    }
  },{
    "Classification": "flink-log4j-yarn-session",
    "Properties": {
      "log4j.rootLogger": "DEBUG,stdout"
    }
  }

YARN资源管理器中有相关日志,查看单个节点的日志。搜索字符串 "Added file system" 应该可以帮助您找到所有成功加载的文件系统。

在本次调查中同样方便的是通过 SSH 连接到主节点并使用 flink-scala REPL ,在给定文件 URI 的情况下,我可以看到 Flink 决定加载什么文件系统。

解决方案是在启动 Flink 应用程序之前,将 S3 文件系统实现的 JAR 放到 /usr/lib/flink/lib/ 中。这可以通过获取 flink-s3-fs-hadoopflink-s3-fs-presto(取决于您使用的实现)的引导操作来完成。我的引导 ActionScript 看起来像这样:

sudo mkdir -p /usr/lib/flink/lib
cd /usr/lib/flink/lib

sudo curl -O https://search.maven.org/remotecontent?filepath=org/apache/flink/flink-s3-fs-hadoop/1.8.1/flink-s3-fs-hadoop-1.8.1.jar

关于amazon-s3 - Amazon EMR 在为 Apache-Flink 提交作业时遇到 Hadoop 可恢复错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55517566/

相关文章:

amazon-web-services - 将AWS SQS连接到Apache-Flink

hadoop - 使用 MapDriver 测试 Hbase 连接

hadoop - 如何将 map reduce 作业的输出直接写入分布式缓存,以便将其传递给另一个作业

amazon-web-services - AWS CloudFront杠杆浏览器缓存

amazon-web-services - 在 AWS Parallelcluster 安装后脚本中访问其他账户的 s3 存储桶

elasticsearch - 带有_update_by_query的version_conflict_engine_exception

apache-flink - Flink 动态表 vs Kafka Stream Ktable?

hadoop - 启动 hive 和 spark 时未发现合适的驱动程序错误

amazon-web-services - 从 aws s3 存储桶下载 yfcc100m

delphi - 使用 TAmazonStorageService.UploadObject 当 Content-type 为 'text/*' 时出现 SignatureDoesNotMatch 错误