我知道这可能是我的问题,但想暂时解决一下。 我正在尝试在AWS EMR集群中运行flink。
我的设置是: Kinesis中的时间序列事件-> flink作业->将其保存到S3
DataStream<Event> kinesis =
env.addSource(new FlinkKinesisConsumer< (this.streamName, new EventSchema(), kinesisConsumerConfig)).name("source");
final StreamingFileSink<Event> streamingFileSink =
StreamingFileSink.<Event>forRowFormat(
new org.apache.flink.core.fs.Path("s3a://"+ this.bucketName + "/" + this.objectPrefix),
new SimpleStringEncoder<>("UTF-8"))
.withBucketAssignerAndPolicy(new OrgIdBucketAssigner(), DefaultRollingPolicy.create().build())
.build();
DataStream<Event> eventDataStream = kinesis
.rebalance()
.keyBy(createKeySelectorByChoosingOrgIdFromTheEvent())
.process(new KeyedProcessFunction<String, Event, Event>() {
@Override
public void processElement(Event value, Context ctx, Collector<DeviceEvent> out) throws Exception {
out.collect(value);
}
});
eventDataStream.addSink(streamingFileSink).name("streamingFileSink");
在其中一个站点中, https://www.mail-archive.com/user@flink.apache.org/msg25039.html
更新:
我知道要使StreamingFileSink正常运行,必须将一个jar flink-s3-fs-hadoop-1.7.1.jar
放到/usr/lib/flink/lib
文件夹中。
我在EMR主节点中的/usr/lib/flink/lib
文件夹如下所示
-rw-r--r-- 1 root root 9924 Mar 20 01:06 slf4j-log4j12-1.7.15.jar
-rw-r--r-- 1 root root 42655628 Mar 20 01:06 flink-shaded-hadoop2-uber-1.7.1.jar
-rw-r--r-- 1 root root 483665 Mar 20 01:06 log4j-1.2.17.jar
-rw-r--r-- 1 root root 140172 Mar 20 01:06 flink-python_2.11-1.7.1.jar
-rw-r--r-- 1 root root 92070994 Mar 20 01:08 flink-dist_2.11-1.7.1.jar
-rw-r--r-- 1 root root 23451686 May 5 23:04 flink-s3-fs-hadoop-1.7.1.jar
当我尝试运行flink作业时,它将在EMR从站中引发以下异常。
2019-05-06 01:43:49,589 INFO org.apache.flink.runtime.taskmanager.Task - KeyedProcess -> Sink: streamingFileSink (3/4) (31000a186f6ab11f0066556116c669ba) switched from RUNNING to FAILED.
java.lang.NoClassDefFoundError: Could not initialize class org.apache.flink.fs.s3base.shaded.com.amazonaws.services.s3.internal.S3ErrorResponseHandler
at org.apache.flink.fs.s3base.shaded.com.amazonaws.services.s3.AmazonS3Client.<init>(AmazonS3Client.java:374)
at org.apache.flink.fs.s3base.shaded.com.amazonaws.services.s3.AmazonS3Client.<init>(AmazonS3Client.java:553)
at org.apache.flink.fs.s3base.shaded.com.amazonaws.services.s3.AmazonS3Client.<init>(AmazonS3Client.java:531)
at org.apache.flink.fs.shaded.hadoop3.org.apache.hadoop.fs.s3a.DefaultS3ClientFactory.newAmazonS3Client(DefaultS3ClientFactory.java:80)
at org.apache.flink.fs.shaded.hadoop3.org.apache.hadoop.fs.s3a.DefaultS3ClientFactory.createS3Client(DefaultS3ClientFactory.java:54)
at org.apache.flink.fs.shaded.hadoop3.org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:256)
at org.apache.flink.fs.s3.common.AbstractS3FileSystemFactory.create(AbstractS3FileSystemFactory.java:125)
at org.apache.flink.core.fs.FileSystem.getUnguardedFileSystem(FileSystem.java:395)
at org.apache.flink.core.fs.FileSystem.get(FileSystem.java:318)
at org.apache.flink.streaming.api.functions.sink.filesystem.Buckets.<init>(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)
您能否让我知道我最想念的东西是什么?
答案 0 :(得分:0)
出现错误的第一件事是,您将来自不同flink版本的JAR混合在一起。这些来自Flink 1.7.1
-rw-r--r-- 1 root root 42655628 Mar 20 01:06 flink-shaded-hadoop2-uber-1.7.1.jar
-rw-r--r-- 1 root root 140172 Mar 20 01:06 flink-python_2.11-1.7.1.jar
-rw-r--r-- 1 root root 92070994 Mar 20 01:08 flink-dist_2.11-1.7.1.jar
这是来自Flink 1.8.0
-rw-r--r-- 1 root root 23451686 May 5 23:04 flink-s3-fs-hadoop-1.8.0.jar
这行不通;选择一个版本或另一个版本。请注意,1.7.2是1.7系列中的最新错误修复版本。
我还建议您阅读文档的这一部分:Streaming File Sink: Important Considerations for S3。
答案 1 :(得分:0)
最后我找到了原因。尽管它非常非常具有欺骗性。
Flink在内部使用AWS开发工具包版本1.11.271
。
引起NoClassDefFoundError的类S3ErrorResponseHandler
...
具有以下静态变量。
public class S3ErrorResponseHandler implements
HttpResponseHandler<AmazonServiceException> {
/** Shared logger for profiling information */
private static final Log log = LogFactory
.getLog(S3ErrorResponseHandler.class);
/** Shared factory for creating XML event readers */
private static final XMLInputFactory xmlInputFactory = XMLInputFactory
.newInstance();
private static enum S3ErrorTags {
Error, Message, Code, RequestId, HostId
};
....
...
在AWS开发工具包1.11.272
中,已删除XMLInputFactory的初始化。
那给了我一个线索。
我通过切换到1.11.272
来重建了flink库。瞧,它开始工作了。
这仍然给我提出了一些未解决的问题。
我在EMR中运行的Flink JVM中进行了彻底的调试。
类路径显然具有flink-s3-fs-hadoop-1.7.1.jar
。我编写了一个代码来读取该jar并打印其所有条目,但确实看到了S3ErrorResponseHandler
。
在我的flink运算符中,我可以如下进行初始化-
XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance()
类加载器显然引用了jre库。 但是,flink无法初始化此特定的类。我想知道为什么!!是因为Flink如何与运营商打交道!!! 下面的Flink序列化操作员并传输到从属节点。在从属节点中,操作员被反序列化,初始化并作为任务运行。 在这些不同的阶段之间,Flink类加载器无法以某种方式访问JRE的XMLInputFactory的默认实现。那就太奇怪了!我也希望JRE更具体地说明加载类时无法初始化的静态变量。 我应该将此称为Flink中的错误吗? 没有人在使用Flink时在AWS EMR中报告此错误?
还指出,flink relase 1.7.1在StreamingFlineSink中存在一个错误。如果您的EMR群集有2个挂载,它将尝试对两者进行读/写操作,从而导致其失败。 在1.8.0及更高版本中已解决。但是,默认情况下,AWS EMR仍使用1.7.1版本。因此,请确保将1.8.0库放在/ usr / lib / flink / lib
下