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

相关文章

来自专栏牛客网

C++后台研发工程师2018年BAT华为网易等面经总结

先介绍下个人情况,国内top5本硕科班,英特尔和腾讯两段实习经历,几个项目和还没中的论文QVQ。目前提前批和内推已经基本结束,有意向的offer也有了几个,现整...

1233
来自专栏用户2442861的专栏

2014 360校园招聘技术类笔试题

原文:http://blog.csdn.net/lanxuezaipiao/article/details/41892553

781
来自专栏牛客网

Java工程师校招面经总结

自我介绍 我本身本科阶段和硕士阶段都是自动化专业,和计算机专业有一点相关,但是差别还是挺大的。我学习计算机方面的知识主要是从研究生阶段开始,大约是从研一下学期开...

4177
来自专栏服务端思维

如何健壮你的后端服务

对每一个程序员而言,故障都是悬在头上的达摩克利斯之剑,都唯恐避之不及,如何避免故障是每一个程序员都在苦苦追寻希望解决的问题。对于这一问题,大家都可以从需求分析、...

1072
来自专栏Java架构解析

月入3W的高级Java工程师都具备哪些能力?

很多面试,很多人员能力要求都有“Java高级工程师的字眼”,如果您真心喜欢Java,并且您刚起步,那么我今天简单分享一个Java高级工程师所应该具备的特质,希望...

1104
来自专栏大数据和云计算技术

新数仓系列:MongoDB关键能力和特性梳理

最近看一本书,铃木敏文的《零售的哲学》,里面提到一个很有意思的观点,711核心使命是提供便利,围绕便利场景,提供一系列食品、ATM服务等,而不是和超市去PK货物...

2826
来自专栏圣杰的专栏

ABP入门系列(18)—— 使用领域服务

源码路径:Github-LearningMpaAbp 1.引言 自上次更新有一个多月了,发现越往下写,越不知如何去写。特别是当遇到DDD中一些概念术语的时候...

18810
来自专栏程序人生

永恒不变的魅力

一个程序员,无论你人生的第一个hello world是从basic开始,c开始,抑或javascript开始,接下来了解的一个概念一定是「变量」(variabl...

34812
来自专栏一名叫大蕉的程序员

Spark你一定学得会(四)No.68

小伙伴在写Spark任务的过程中感觉非常巨痛苦,总是有奇奇怪怪的问题,写好的程序在开发环境跑得好好的,一上到生产直接被干懵逼了。今天呢,我就跟大伙好好聊聊 Sp...

1865
来自专栏程序猿DD

来自95后的天池中间件大赛总结

天池中间件大赛的初赛在今早终于正式结束了,公众号停更了一个月,主要原因就是博主的空余时间几乎全花在这个比赛上,第一赛季结束,做下参赛总结,总的来说,收获不小。

2356

扫码关注云+社区