Apache Flink初探

1. Apache Flink的简介

Apache Flink是一个开源的针对批量数据和流数据的处理引擎,已经发展为ASF的顶级项目之一。Flink 的核心是在数据流上提供了数据分发、通信、具备容错的分布式计算。同时,Flink 在流处理引擎上构建了批处理引擎,原生支持了迭代计算、内存管理和程序优化。

Flink的技术栈:

Flink的主要API:

  • DataSet API, 对静态数据进行批处理操作,将静态数据抽象成分布式的数据集,用户可以方便地使用Flink提供的各种操作符对分布式数据集进行处理,支持Java、Scala和Python。
  • DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流,用户可以方便地对分布式数据流进行各种操作,支持Java和Scala。
  • Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过类SQL的DSL对关系表进行各种查询操作,支持Java和Scala。

此外,Flink还针对特定的应用领域提供了领域库,例如:

  • Flink ML,Flink的机器学习库,提供了机器学习Pipelines API并实现了多种机器学习算法。
  • Gelly,Flink的图计算库,提供了图计算的相关API及多种图计算算法实现。

Flink的部署方式:

  • 本地模式
  • 集群模式或yarn集群
  • 云集群部署

另外,Flink也可以方便地和Hadoop生态圈中其他项目集成,例如Flink可以读取存储在HDFS或HBase中的静态数据,以Kafka作为流式的数据源,直接重用MapReduce或Storm代码,或是通过YARN申请集群资源等。

2. Apache Flink的架构

当Flink集群启动后,首先会启动一个JobManger和一个或多个的 TaskManager。由Client提交任务给JobManager,JobManager再调度任务到各个TaskManager去执行,然后TaskManager将心跳和统计信息汇报给 JobManager。TaskManager之间以流的形式进行数据的传输。上述三者均为独立的JVM进程。

  • Client:提交Job的客户端,可以是运行在任何机器上(与JobManager环境连通即可)
  • JobManager:Flink系统的协调者,负责任务的排定分配、快照协调、失败恢复控制等,有三种部署模式:单机、一主多备集群、Yarn集群
  • TaskManger:负责具体数据分析任务的执行,主要有业务数据的计算、传输等,相对于Storm的Worker把内存交给jvm管理,Flink的TaskManager还自己管理了部分内存
    • TaskSlot:运行TaskManager中固定大小的资源子集,一个TaskManager中有多少个TaskSlot意味着可以执行多少个Task
  • Task:执行组件,即业务计算的执行实体

3. Flink运行例子

使用Flink的自带例子: flink-stream-examples/WordCount,这是一个从字符串数组读取句子计算每个单词出现次数的例子。

1、启动flink bin/start-local.sh

2、运行WordCount bin/flink run examples/streaming/WordCount.jar

3、执行完之后查看统计结果 cat log/flink-$USER-jobmanager-0-$USER-VirtualBox.out

4、那么我们访问localhost:8081可以查看到此job的执行计划

  • Source:Collection Source:收据数据源,当前是从字符串数数组里面读取
  • Flat Map:把每一条句子分隔成一个个的单词,设置每个单词的出现次数为1,并提交到下游
  • Keyed Aggregation:对每个单词进行聚合统计,统计每个单词的出现次数
  • Sink Unamed:输出统计结果

WordCount代码:

public static void main(String[] args) throws Exception {

        // Checking input parameters
        final ParameterTool params = ParameterTool.fromArgs(args);

        // set up the execution environment
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // make parameters available in the web interface
        env.getConfig().setGlobalJobParameters(params);

        // get input data
        DataStream<String> text;
        if (params.has("input")) {
            // read the text file from given input path
            text = env.readTextFile(params.get("input"));
        } else {
            System.out.println("Executing WordCount example with default input data set.");
            System.out.println("Use --input to specify file input.");
            // get default test text data
            text = env.fromElements(WordCountData.WORDS);
        }

        DataStream<Tuple2<String, Integer>> counts =
        // split up the lines in pairs (2-tuples) containing: (word,1)
        text.flatMap(new Tokenizer()).setParallelism(2)
        // group by the tuple field "0" and sum up tuple field "1"
                .keyBy(0).sum(1).setParallelism(2);

        // emit result
        if (params.has("output")) {
            counts.writeAsText(params.get("output"));
        } else {
            System.out.println("Printing result to stdout. Use --output to specify output path.");
            counts.print();
        }

        // execute program
        env.execute("Streaming WordCount");
    }

4. Apache Flink兼容Apache Storm

考虑到业界当前主流的流式处理引擎为Apache Storm,Flink为了更好的与业界衔接,在流处理上对Storm是做了兼容,通过复用代码的方式即可实现Storm在Flink运行环境的执行,这个也大大降低了Storm使用者过渡到Flink的难度;同理Flink也可以运行我们数平的JStorm。

1、先来对比一下Apache Flink 与Apache Storm的异同:

  • 与Apache Storm相比,Apache Flink少了一层节点管理器,TaskManager直接由主控节点管理
  • 在流处理这一块,Apache Flink与Apache Storm从运行实体到任务组件,基本上能一一对应

2、由上可得,虽然两者运行实体的结构及代码有一定的差别,但归根到底两者运行的都是有向无环图(DAG),所以从Storm的Topology相关类转换成Flink执行的DataStream相关类是可以作转换的。 以下是粗略的转换过程:Storm Topology -> Flink Topology -> DataStream StreamGraph

3、举个例子:已有WordCountTopology,需要提交到Flink集群,那么只需下面几行代码:

final TopologyBuilder builder = WordCountTopology.buildTopology();//构造storm的topology
Map conf = new HashMap();
conf.put("nimbus.host", xxxx);//optional,master server
conf.put("nimbus.thrift.port", xxxx);//optional, master server port
FlinkSubmitter.submitTopology(topologyId, conf, FlinkTopology.createTopology(bgy转换成FlinkTopology再提交

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏挖掘大数据

如何成为一名10x的数据分析师?

不知道大家以前听没听说过“10x Developer”这个词,如果你连听都还没听说过,那可真是时候考虑放弃自己的程序猿事业了。就像传说一样,一些程序猿的战斗力能...

2328
来自专栏企鹅号快讯

2017年10大主流编程语言最新排行榜出炉

前言 据美国科技公司Gizmodo报道,截至2014年9月24日,全世界采用IT操作系统的设备数量已经达到10亿台,IT推动中国移动互联网进入高速发展期,成为所...

1989
来自专栏PPV课数据科学社区

【每日一课】Python入门训练营第一周任务第三节视频

Python入门训练营在线试听第一章第三节:02_Python环境安装(2) 《Python入门(初级)学习班第一期》第一周任务 请大家在学习完第一周的课程后,...

3836
来自专栏HBStream流媒体与音视频技术

借用PortAudio采集和播放音频,实现双路混音器

3595
来自专栏程序人生

Pipe 之美

Unix 三大宝是 C,file 和 pipe。C的重要性自不必说,如果 Lisp 是编程语言之母,那么 C 就是编程语言他爹。file 是 unix 世界的夸...

4067
来自专栏Golang语言社区

【Go 语言社区】选择Go语言的12个理由

多核化和集群化是互联网时代的典型特征,那语言需要哪些特性来应对这些特征呢?多数语言在语法层面并不直接支持协程,而通过库的方式支持的协程的功能也并不完整,比如仅仅...

3488
来自专栏杨建荣的学习笔记

go语言学习初体验

我们暂时先抛开go语言,咱们说下行业里近两年的哪些技术发展最火,毫无疑问是Docker和Kubernetes,没错,他们是go语言的顶级项目。

1272
来自专栏企鹅号快讯

python资料汇总

摘要:重新整理汇总,内容包括长期必备、入门教程、练手项目、学习视频。 ? 一、长期必备。 1. StackOverflow,是疑难解答、bug排除必备网站,任何...

2219
来自专栏阮一峰的网络日志

程序员小测试:保守派 vs 自由派

最近,我在阅读 Steve Yegg 的文集《程序员的呐喊》。 ? 这是一本非常有趣的书,里面甚至包含了一个小测试(原文),区分一个程序员到底是保守派还是自由派...

2826
来自专栏WeTest质量开放平台团队的专栏

C++静态代码扫描哪家强?

为了保证游戏程序正常运行,就要在开发的各个环节为代码“体检”,发现并扫除“病症”。静态代码分析是一种常用的“体检”方式,也是保证代码质量的重要手段。 1....

3135

扫码关注云+社区