Apache Flink

Flink系列之Metrics

五迷三道 提交于 2019-12-04 17:52:17
Flink是一个针对流数据和批处理的分布式处理引擎,近两年才真正的频繁出现在数据处理领域 。其实Flink在2014年就已经成为ASF(Apache Software Foundation)的顶级项目之一,也许之前是被spark掩盖了光芒,spark在数据处理上的优势不可否认,但是个人经过对spark和flink的源码研读和项目实战后,更偏爱flink一些。在实时计算方面,相对于spark的微批处理(micro batch),flink的数据处理方式更真正称得上流处理,不久前release的spark 2.3目前也已经提供了类似flink流处理的方式,但是目前还没有经过大型互联网公司的实战验证,不知道其线上表现如何,我们可以拭目以待;除了流处理的方式以外,flink在内存管理,网络传输方面也很有其独特之处,另外spark SQL和flink SQL相比,在代码层面上,flink做了简单的封装后直接利用了calcite的API,让SQL变的不再那么的神秘,更便于我们自定义语义,定制我们自己的SQL语句;Flink基于其状态机制提供的CEP(Complex Event Processing)Library可以让我们在流处理过程匹配出我们定义的事件组合。这些我之后都会在flink系列里一一做其原理说明和代码解读。 回到此篇文章的标题:flink-metrics

趣头条基于 Flink 的实时平台建设实践

坚强是说给别人听的谎言 提交于 2019-12-04 13:26:46
本文由趣头条实时平台负责人席建刚分享趣头条实时平台的建设,整理者叶里君。文章将从平台的架构、Flink 现状,Flink 应用以及未来计划四部分分享。 一.平台架构 1.Flink 应用时间线 首先是平台的架构,2018 年 3 月之前基本都是基于 Storm 和 Spark Streaming 来做的。目前,基本已经把 Spark Streaming 和 Storm 淘汰了,主要都是 Flink SQL 来做的。起初还比较传统,一般是接需求然后开发类似于 Flink SQL 的任务,基本是手工作坊操作模式。 后来 Flink SQL 的任务逐渐多了起来,就开始考虑往平台化方向发展。大概在 2018 年 10 月份,我们开始搭建实时平台。当时设计实时平台时就直接抛弃了 Spark Streaming 和 Storm,基础理念设计的时候,主要以 Flink 场景来设计平台。趣头条实时平台上线将近两个月后,当时任务量并不多,由于趣头条基本都是 PHP 和 Golang 开发语言,而Flink更偏向于 Java 包括它 API 的提供,所以经常会接到用户需求,如: Golang 能不能开发, PHP 能不能开发? 这个问题听起来比较奇怪,但是对于不会用并且确实也想用的用户,就需要想办法解决这个问题。后来我们做了一版类似于 Flink SQL 配置化开发,可以让用户不用写Flink 代码

聊聊flink的PrintSinkFunction

谁说我不能喝 提交于 2019-12-04 10:08:23
序 本文主要研究一下flink的PrintSinkFunction DataStream.print flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/datastream/DataStream.java /** * Writes a DataStream to the standard output stream (stdout). * * <p>For each element of the DataStream the result of {@link Object#toString()} is written. * * <p>NOTE: This will print to stdout on the machine where the code is executed, i.e. the Flink * worker. * * @return The closed DataStream. */ @PublicEvolving public DataStreamSink<T> print() { PrintSinkFunction<T> printFunction = new PrintSinkFunction<>(); return addSink

聊聊flink的consecutive windowed operations

二次信任 提交于 2019-12-04 10:08:12
序 本文主要研究一下flink的consecutive windowed operations 实例 DataStream<Integer> input = ...; DataStream<Integer> resultsPerKey = input .keyBy(<key selector>) .window(TumblingEventTimeWindows.of(Time.seconds(5))) .reduce(new Summer()); DataStream<Integer> globalResults = resultsPerKey .windowAll(TumblingEventTimeWindows.of(Time.seconds(5))) .process(new TopKWindowFunction()); 本实例首先根据key进行partition,然后再按指定的window对这些key进行计数,之后对该dataStream进行windowAll操作,其时间WindowAssigner与前面的相同,这样可以达到在同样的时间窗口内先partition汇总,再全局汇总的效果( 可以解决类似top-k elements的问题 ) TimestampsAndPeriodicWatermarksOperator flink-streaming-java_2.11-1.7

聊聊flink的BoundedOutOfOrdernessTimestampExtractor

一个人想着一个人 提交于 2019-12-04 10:07:59
序 本文主要研究一下flink的BoundedOutOfOrdernessTimestampExtractor BoundedOutOfOrdernessTimestampExtractor flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/functions/timestamps/BoundedOutOfOrdernessTimestampExtractor.java /** * This is a {@link AssignerWithPeriodicWatermarks} used to emit Watermarks that lag behind the element with * the maximum timestamp (in event time) seen so far by a fixed amount of time, <code>t_late</code>. This can * help reduce the number of elements that are ignored due to lateness when computing the final result for a * given window, in the case where

《从0到1学习Flink》—— 介绍Flink中的Stream Windows

泪湿孤枕 提交于 2019-12-04 10:07:48
前言 目前有许多数据分析的场景从批处理到流处理的演变, 虽然可以将批处理作为流处理的特殊情况来处理,但是分析无穷集的流数据通常需要思维方式的转变并且具有其自己的术语(例如,“windowing(窗口化)”、“at-least-once(至少一次)”、“exactly-once(只有一次)” )。 对于刚刚接触流处理的人来说,这种转变和新术语可能会非常混乱。 Apache Flink 是一个为生产环境而生的流处理器,具有易于使用的 API,可以用于定义高级流分析程序。 Flink 的 API 在数据流上具有非常灵活的窗口定义,使其在其他开源流处理框架中脱颖而出。 在这篇文章中,我们将讨论用于流处理的窗口的概念,介绍 Flink 的内置窗口,并解释它对自定义窗口语义的支持。 什么是 Windows? 下面我们结合一个现实的例子来说明。 就拿交通传感器的示例:统计经过某红绿灯的汽车数量之和? 假设在一个红绿灯处,我们每隔 15 秒统计一次通过此红绿灯的汽车数量,如下图: 可以把汽车的经过看成一个流,无穷的流,不断有汽车经过此红绿灯,因此无法统计总共的汽车数量。但是,我们可以换一种思路,每隔 15 秒,我们都将与上一次的结果进行 sum 操作(滑动聚合),如下: 这个结果似乎还是无法回答我们的问题,根本原因在于流是无界的,我们不能限制流,但可以在有一个有界的范围内处理无界的流数据。 因此

聊聊flink的window操作

☆樱花仙子☆ 提交于 2019-12-04 10:05:16
序 本文主要研究一下flink的window操作 window DataStream flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/datastream/DataStream.java public AllWindowedStream<T, TimeWindow> timeWindowAll(Time size) { if (environment.getStreamTimeCharacteristic() == TimeCharacteristic.ProcessingTime) { return windowAll(TumblingProcessingTimeWindows.of(size)); } else { return windowAll(TumblingEventTimeWindows.of(size)); } } public AllWindowedStream<T, TimeWindow> timeWindowAll(Time size, Time slide) { if (environment.getStreamTimeCharacteristic() == TimeCharacteristic.ProcessingTime) { return

聊聊flink DataStream的join操作

本小妞迷上赌 提交于 2019-12-04 10:04:58
序 本文主要研究一下flink DataStream的join操作 实例 stream.join(otherStream) .where(<KeySelector>) .equalTo(<KeySelector>) .window(<WindowAssigner>) .apply(<JoinFunction>) 这里首先调用join,与另外一个stream合并,返回的是JoinedStreams,之后就可以调用JoinedStreams的where操作来构建Where对象构造条件;Where有equalTo操作可以构造EqualTo,而EqualTo有window操作可以构造WithWindow,而WithWindow可以设置windowAssigner、trigger、evictor、allowedLateness,它提供apply操作 DataStream.join flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/datastream/DataStream.java @Public public class DataStream<T> { //...... /** * Creates a join operation. See {@link JoinedStreams}

聊聊flink的RpcService

时光总嘲笑我的痴心妄想 提交于 2019-12-04 10:04:45
序 本文主要研究一下flink的RpcService RpcService flink-release-1.7.2/flink-runtime/src/main/java/org/apache/flink/runtime/rpc/RpcService.java public interface RpcService { String getAddress(); int getPort(); <C extends RpcGateway> CompletableFuture<C> connect( String address, Class<C> clazz); <F extends Serializable, C extends FencedRpcGateway<F>> CompletableFuture<C> connect( String address, F fencingToken, Class<C> clazz); <C extends RpcEndpoint & RpcGateway> RpcServer startServer(C rpcEndpoint); <F extends Serializable> RpcServer fenceRpcServer(RpcServer rpcServer, F fencingToken); void stopServer

聊聊flink的RpcServer

倾然丶 夕夏残阳落幕 提交于 2019-12-04 10:04:36
序 本文主要研究一下flink的RpcServer RpcGateway flink-release-1.7.2/flink-runtime/src/main/java/org/apache/flink/runtime/rpc/RpcGateway.java public interface RpcGateway { /** * Returns the fully qualified address under which the associated rpc endpoint is reachable. * * @return Fully qualified (RPC) address under which the associated rpc endpoint is reachable */ String getAddress(); /** * Returns the fully qualified hostname under which the associated rpc endpoint is reachable. * * @return Fully qualified hostname under which the associated rpc endpoint is reachable */ String getHostname(); }