Apache Flink 入门笔记

慕课网Flink入门课程笔记
视频地址:https://www.imooc.com/video/17914


1 简介

Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,提供支持流处理和批处理两种类型的应用功能。

现有的开源计算方案中,将流处理和批处理作为两类不同的应用类型:流处理一般支持低延迟、Exactly-once保证(仅用一次),而批处理则是需要支持高吞吐、高效处理。

Flink完全支持流处理,作为流处理看待时输入数据流是无界的;批处理被作为一种特殊的流处理,其输入数据流有界。

Flink的分层架构
  • Deployment层
    涉及Flink的部署模式,本地模式、集群模式(Standalone/YARN)、云。生产环境中主要为YARN模式。

  • RunTime层
    提供了支持Flink计算的全部核心实现,例如:支持分布式的Stream处理、调度策略等,为上层API服务。

  • API层
    实现面向无界Stream的流处理和面向Batch的批处理API,分别为DataStream API和DataSet API。

  • Libaries层
    在API层之上构建的满足特定应用的实现计算框架,分别用于面向流处理和批处理。
    CEP面向事件,Table用于类SQL,FlinkML用于机器学习,Gelly为图处理。

2 Flink的优势和对比

高吞吐、低延迟、高性能的流处理。
支持高度灵活的窗口操作。
支持有状态计算的Exactly-once语义。
提供DataStream和DataSet API。

3 基本概念和编程模型

基本概念

Flink程序的基础构建模块是流(Streams)转换(transformations)。流就是数据的输入,转换是对数据的操作。每个流都起始于一个或多个source,并终止于一个sink

Flink程序映射为Streaming Dataflow

流上的聚合需要由窗口来划定范围,比如时间区间和数量的序号范围等。窗口分为多个类型,滚动窗口(没有数据重叠),滑动窗口(有数据重叠),会话窗口(由不活动的间隙打断)。

窗口类型示意图

上图中的sliding size 是滑动窗口在滑动过程中的时间间隔。
滚动窗口有滚动时间窗口和滚动数据窗口,前者划定一段时间内的数据,后者等待数据规模到达阈值。

基本架构

Flink是基于Master-Slave风格的架构,其启动时会启动JobManager进程和至少一个TaskManager进程。

架构示意图
  • JobManager
    系统的协调者,负责接收Job,调度组成Job的多个Task的执行。
    收集Job的状态信息,管理从节点TaskManager。

  • TaskManager
    实际负责执行计算的工作节点,在其上执行Task。
    TaskManager负责管理其所在节点上的资源信息,并在启动时将这些信息向JobManager汇报。

  • Client
    用户提交Flink程序的时候,会先创建一个Client,该Client对提交的程序进行预处理后在提交到Flink集群。
    Client会将用户提交的Flink程序组成一个JobGraph,并以这种形式提交。

4 安装与使用

通过Git获取源码进行安装:

或是下载编译好的二级制文件。
如果是为了部署生产环境,则需要下载与Hadoop兼容的版本。

解压后进入bin目录运行启动脚本:

windows下直接启动.bat文件。

其UI界面端口默认为8081:

5 示例程序

windows下通过flink run ../example ... *.jar --port *
可以运行一个flink自带的示例程序

通过curl来创建一个maven项目。

$ curl https://flink.apache.org/q/quickstart.sh | bash 

wordcount程序如下:

package org.myorg.quickstart;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;
import scala.Int;

/**
 * Created by Edwin_1993 on 2019/3/3.
 */
public class WordCount {
    public static void main(String[] args) throws Exception {
        //flink 上下文
        final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

        DataSet<String> text = env.fromElements(
                "To be or not to be,--that is a question--",
                "hello everyone, my name is Lileilei",
                "Fine,thank you and you?"
        );

        DataSet<Tuple2<String,Integer>> counts =
                text.flatMap(new LineSplitter())
                .groupBy(0) //0至数组中的第0号元素 eg:(tuntun,1)
                .sum(1);

        counts.print();
    }

    public static final class LineSplitter implements FlatMapFunction<String,Tuple2<String, Integer>>{

        @Override
        public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
//            表示匹配数字、字母、下划线和加号本身字符
            String[] tokens = value.toLowerCase().split("\\W+");
            for (String token:tokens){
                if(token.length() > 0){
                    out.collect(new Tuple2<String ,Integer>(token,1));
                }
            }
        }
    }
}

部分输入日志如下:

6 Flink常用算子

算子是在Transformation过程中使用的,主要分为DatasetAPI 和DataStreamAPI

Stream中有类似的API

也有特有的API:

7 应用实例

添加依赖:

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-wikiedits_2.11</artifactId>
            <version>${flink.version}</version>
        </dependency>

创建类:

package org.myorg.quickstart;

import org.apache.flink.api.common.functions.FoldFunction;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.connectors.wikiedits.WikipediaEditEvent;
import org.apache.flink.streaming.connectors.wikiedits.WikipediaEditsSource;


/**
 * Created by Edwin_1993 on 2019/3/3.
 */
public class WikipediaAnalysis {
    public static void main(String[] args) throws Exception{
        StreamExecutionEnvironment see = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStream<WikipediaEditEvent> edits = see.addSource(new WikipediaEditsSource());

//        keyedEdits为无边界的流输入
        KeyedStream<WikipediaEditEvent,String> keyedEdits = edits
                .keyBy((KeySelector<WikipediaEditEvent,String >) event->{
                    return event.getUser();
                });

//        将输入进行Sink
        DataStream<Tuple2<String,Long>> result = keyedEdits
                .timeWindow(Time.seconds(5))
//                fold的两个参数,第一个是初始值:new Tuple2<>("", 0L)
//                第二个是foldfunction,对fold功能进行编写
                .fold(new Tuple2<>("", 0L), new FoldFunction<WikipediaEditEvent, Tuple2<String, Long>>() {
                    @Override
                    public Tuple2<String, Long> fold(Tuple2<String, Long> stringLongTuple2, WikipediaEditEvent event) throws Exception {
                        stringLongTuple2.f0 = event.getUser();
                        stringLongTuple2.f1 += event.getByteDiff();
                        return stringLongTuple2;
                    }
                });

        result.print();//可以落地到其它地方,kafka或是redis
        see.execute();
    }
}

部分结果:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容