使用Flink处理数据时,可以基于Flink提供的批式处理(Batch Processing)和流式处理(Streaming Processing)API来实现,分别能够满足不同场景下应用数据的处理。这两种模式下,输入处理都被抽象为Source Operator,包含对应输入数据的处理逻辑;输出处理都被抽象为Sink Operator,包含了对应输出数据的处理逻辑。这里,我们只关注输出的Sink Operator实现。
Flink批式处理模式,运行Flink Batch Job时作用在有界的输入数据集上,所以Job运行的时间是有时限的,一旦Job运行完成,对应的整个数据处理应用就已经结束,比如,输入是一个数据文件,或者一个Hive SQL查询对应的结果集,等等。在批式处理模式下处理数据的输出时,主要需要实现一个自定义的OutputFormat,然后基于该OutputFormat来构建一个Sink,下面看下OutputFormat接口的定义,如下所示:
@PublicpublicinterfaceOutputFormatextendsSerializable{voidconfigure(Configuration parameters);voidopen(inttaskNumber,intnumTasks)throwsIOException;voidwriteRecord(IT record)throwsIOException;voidclose()throwsIOException;}
上面,configure()方法用来配置一个OutputFormat的一些输出参数;open()方法用来实现与外部存储系统建立连接;writeRecord()方法用来实现对Flink Batch Job处理后,将数据记录输出到外部存储系统。开发Batch Job时,通过调用DataSet的output()方法,参数值使用一个OutputFormat的具体实现即可。后面,我们会基于Elasticsearch来实现上面接口中的各个方法。
Flink流式处理模式,运行Flink Streaming Job时一般输入的数据集为流数据集,也就是说输入数据元素会持续不断地进入到Streaming Job的处理过程中,但你仍然可以使用一个HDFS数据文件作为Streaming Job的输入,即使这样,一个Flink Streaming Job启动运行后便会永远运行下去,除非有意外故障或有计划地操作使其终止。在流式处理模式下处理数据的输出时,我们需要是实现一个SinkFunction,它指定了如下将流数据处理后的结果,输出到指定的外部存储系统中,下面看下SinkFunction的接口定义,如下所示:
@Public
publicinterfaceSinkFunctionextendsFunction,Serializable{@Deprecateddefaultvoidinvoke(IN value)throwsException{}defaultvoidinvoke(IN value, Context context)throwsException{ invoke(value); } @PublicinterfaceContext{longcurrentProcessingTime();longcurrentWatermark();Longtimestamp(); }}
通过上面接口可以看到,需要实现一个invoke()方法,实现该方法来将一个输入的IN value输出到外部存储系统中。一般情况下,对一些主流的外部存储系统,Flink实现了一下内置(社区贡献)的SinkFunction,我们只需要配置一下就可以直接使用。而且,对于Stre

本文介绍了如何使用Flink的批处理和流处理API将数据输出到Elasticsearch。在批处理中,通过实现OutputFormat接口,而在流处理中,通过实现SinkFunction接口。示例代码展示了如何配置和使用ElasticsearchSinkFunction,包括从Kafka源处理数据并将其索引到Elasticsearch。此外,还讨论了在批处理模式下缺少Elasticsearch Connector的情况,以及如何利用现有Streaming处理模式的代码进行适配。
最低0.47元/天 解锁文章
1454

被折叠的 条评论
为什么被折叠?



