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 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

Github 项目推荐 | Google 大脑神经音频合成器的物理接口 —— Open NSynth Super

Open NSynth Super 是 NSynth 的实验性物理接口,而 NSynth 是 Google 大脑 Megenta 团队开发的一种机器学习算法,用...

15130
来自专栏程序人生

Pipe 之美

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

42470
来自专栏企鹅号快讯

Python的新手指南,教你如何变编程大佬级别的

新的Python?下面是基础知识的细分,包括语言的历史,使用者的语言以及Python 2与3的区别。 Python是一种编程语言,对于编写快速而简单的脚本非常有...

24780
来自专栏企鹅号快讯

毕业的大学生生、想转行的人或想学习编程的学Python、C 还是Java?

刚毕业的大学生生、想转行的人或想学习编程的朋友,应该挑选学习Python、C++还是Java?关于许多要面临就业的大学生、想转行找工作的人来说,零基础挑选学习哪...

305100
来自专栏CSDN技术头条

编码过程中需尽量避免的 7 条捷径

1. 复制代码 “我认为最有价值的规则是避免重复。有且仅有一次是极限编程里的说法。- Martin Fowler 这很容易成为头号规则。如果你想要你的代码坚如磐...

22760
来自专栏企鹅号快讯

python资料汇总

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

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

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

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

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

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

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

几种计算机语言的评价(修订版)

编程新手都有一个同样的问题:"我应该学习哪一种语言?"。 《Unix编程艺术》(Eric Raymond著)第十四章,对各种语言进行了评价,正好可以用来回答这个...

41680
来自专栏Golang语言社区

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

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

37180

扫码关注云+社区

领取腾讯云代金券