凌波微步Flink——Flink的技术逻辑与编程步骤剖析

转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/95459606
本文出自【我是干勾鱼的博客

Ingredients:

1 当Spark遇见Flink。。。

Spark已经很火了!

有多火呢?Spark在Apache名人堂匾额上书Lightning-fast unified analytics engine,自称Lighting,还fast,口气不小。两三年前,大家谈到大数据,谈到未来的数据计算,首先想到的就是Spark,它是公认的明星产品,是计算领域的领军人物和颜值担当,提起计算的未来,基本是和Spark划等号的。

可是现在说未来,我们要犹豫了。Spark是将一切看成批,基于批计算来模拟流式计算;而Flink是将一切看成流,基于流式计算来模拟批计算,顺畅的逻辑就给人久违的赞同。

还有它更细粒度的封装,它的state、time、window,它的“Exactly-once”,概念都如此贴切,像是站在时间的远处等了我们好久。

就好比科比在最鼎盛的时代遇到詹姆斯:这个年轻人自称你的粉丝,略带稚嫩的说:“我上小学时就崇拜科比,高中毕业想到他没继续读大学就进入职业联赛,我想我也可以。。。”

当Spark遇见Flink,当科比遇见詹姆斯。。。一切都来得那么突然,仿佛一低头看到了未来。虽然你突破、投篮、罚球、三分都驾轻就熟,虽然你拿过5个总冠军,单场得过81分的高分,职业生涯早已技压群雄,惊世骇俗。。。眼前年轻人自称你的粉丝,却是未来全世界的明星。总有那么一刻,你矗立人生巅峰眺望远方,看到后出茅庐的新人在你面前纵身一跃,还是会有一种期盼已久的惊讶!这种惊讶,就像风清扬看到令狐冲一天完成自己三个月才学会招数时的大奇,又像曹操挥鞭江畔脱口而出生子当如孙仲谋时的赞叹,是对拳怕少壮的感慨,也是对长江后浪推前浪的敬畏!

2 编程步骤剖析

之前在:

凌波微步Flink——Flink安装及简单实用

凌波微步Flink——Flink API中的一些基础概念

中简单介绍了一下Flink,这里来说说Flink的编程剖析。

Basic API Concepts中,Anatomy of a Flink Program介绍了在编程语言里如何使用Flink,给出了编程的步骤,并通过Java、Scala两种语言给出了示例。

具体步骤如下:

  • Obtain an execution environment,
  • Load/create the initial data,
  • Specify transformations on this data,
  • Specify where to put the results of your computations,
  • Trigger the program execution

也就是:

  • 获取执行环境
  • 加载/创建初始数据
  • 指明对数据的转换方式
  • 指明计算结果保存的位置
  • 启动程序的执行

这里用Java语言简单说一下。

值得一提的事,使用Java语言处理Flink,数据集(DataSet)处理的核心代码位于:

  • org.apache.flink.api.java

数据流(DataStreaming)处理的核心代码位于:

  • org.apache.flink.streaming.api

2.1 获取执行环境

要注意:

StreamExecutionEnvironment

是所有Flink程序的基础,获得它有几种方式:

  • getExecutionEnvironment()

  • createLocalEnvironment()

  • createRemoteEnvironment(String host, int port, String… jarFiles)

一般情况下使用:

  • shelgetExecutionEnvironment()

就够用了。比如:

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

2.2 加载/创建初始数据

得到了执行环境(execution environment)之后,这个执行环境有很多种读取数据的方式,可以从CSV文件中一行一行的读取数据,也可以使用完全定制化的方式来读取数据。

比如,对数据以行序列的方式进行读取,可以:

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

DataStream<String> text = env.readTextFile("file:///path/to/file");

你会得到一个数据流(DataStream),使用这个数据流也可以生成新的驱动数据流。

2.3 指明对数据的转换方式

可以使用DataStream中的转换方法进行数据转换,例如map转换:

DataStream<String> input = ...;

DataStream<Integer> parsed = input.map(new MapFunction<String, Integer>() {
    @Override
    public Integer map(String value) {
        return Integer.parseInt(value);
    }
});

以上内容其实就是调用原有DataStream对象(及input)的map方法,传入一个Java类:

MapFunction<String, Integer>

的匿名对象,并重写了它的构造函数。这样返回值会生成一个新的DataStream,里面数据中的String类型全被转换为Integer类型。

2.4 指明计算结果保存的位置

一旦得到了满足最终需求的DataStream,就需要创建一个Sink并把数据传到里面去。比如可以这样:

writeAsText(String path)
print()

这是把DataStream以文本的形式记录,并打印出来。

2.5 启动程序的执行

以上的内容都完成之后,就到了最关键的一步:启动程序的执行。主要通过调用StreamExecutionEnvironment的方法来实现:

  • execute()

比如:

 env.execute();

3 参考

Apache Flink

Basic API Concepts

Building real-time dashboard applications with Apache Flink, Elasticsearch, and Kibana

发布了278 篇原创文章 · 获赞 425 · 访问量 160万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览