转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/95459606
本文出自【我是干勾鱼的博客】
Ingredients:
Java:Java SE Development Kit 8u162(Oracle Java Archive),Linux下安装JDK并修改环境变量
Flink:flink-1.7.2-bin-scala_2.12.tgz(flink-1.7.2-bin-scala_2.12.tgz(mirror.bit.edu.cn/apache),Downloads,All Flink releases),Apache Flink® - Stateful Computations over Data Streams,Local Setup Tutorial,Building real-time dashboard applications with Apache Flink, Elasticsearch, and Kibana,Examples
Spark已经很火了!
有多火呢?Spark在Apache名人堂匾额上书Lightning-fast unified analytics engine,自称Lighting,还fast,口气不小。两三年前,大家谈到大数据,谈到未来的数据计算,首先想到的就是Spark,它是公认的明星产品,是计算领域的领军人物和颜值担当,提起计算的未来,基本是和Spark划等号的。
可是现在说未来,我们要犹豫了。Spark是将一切看成批,基于批计算来模拟流式计算;而Flink是将一切看成流,基于流式计算来模拟批计算,顺畅的逻辑就给人久违的赞同。
还有它更细粒度的封装,它的state、time、window,它的“Exactly-once”,概念都如此贴切,像是站在时间的远处等了我们好久。
就好比科比在最鼎盛的时代遇到詹姆斯:这个年轻人自称你的粉丝,略带稚嫩的说:“我上小学时就崇拜科比,高中毕业想到他没继续读大学就进入职业联赛,我想我也可以。。。”
当Spark遇见Flink,当科比遇见詹姆斯。。。一切都来得那么突然,仿佛一低头看到了未来。虽然你突破、投篮、罚球、三分都驾轻就熟,虽然你拿过5个总冠军,单场得过81分的高分,职业生涯早已技压群雄,惊世骇俗。。。眼前年轻人自称你的粉丝,却是未来全世界的明星。总有那么一刻,你矗立人生巅峰眺望远方,看到后出茅庐的新人在你面前纵身一跃,还是会有一种期盼已久的惊讶!这种惊讶,就像风清扬看到令狐冲一天完成自己三个月才学会招数时的大奇,又像曹操挥鞭江畔脱口而出生子当如孙仲谋时的赞叹,是对拳怕少壮的感慨,也是对长江后浪推前浪的敬畏!
之前在:
凌波微步Flink——Flink安装及简单实用
凌波微步Flink——Flink API中的一些基础概念
中简单介绍了一下Flink,这里来说说Flink的编程剖析。
在Basic API Concepts中,Anatomy of a Flink Program介绍了在编程语言里如何使用Flink,给出了编程的步骤,并通过Java、Scala两种语言给出了示例。
具体步骤如下:
也就是:
这里用Java语言简单说一下。
值得一提的事,使用Java语言处理Flink,数据集(DataSet)处理的核心代码位于:
数据流(DataStreaming)处理的核心代码位于:
要注意:
StreamExecutionEnvironment
是所有Flink程序的基础,获得它有几种方式:
getExecutionEnvironment()
createLocalEnvironment()
createRemoteEnvironment(String host, int port, String… jarFiles)
一般情况下使用:
就够用了。比如:
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
得到了执行环境(execution environment)之后,这个执行环境有很多种读取数据的方式,可以从CSV文件中一行一行的读取数据,也可以使用完全定制化的方式来读取数据。
比如,对数据以行序列的方式进行读取,可以:
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> text = env.readTextFile("file:///path/to/file");
你会得到一个数据流(DataStream),使用这个数据流也可以生成新的驱动数据流。
可以使用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类型。
一旦得到了满足最终需求的DataStream,就需要创建一个Sink并把数据传到里面去。比如可以这样:
writeAsText(String path)
print()
这是把DataStream以文本的形式记录,并打印出来。
以上的内容都完成之后,就到了最关键的一步:启动程序的执行。主要通过调用StreamExecutionEnvironment的方法来实现:
比如:
env.execute();
Apache Flink
Basic API Concepts
Building real-time dashboard applications with Apache Flink, Elasticsearch, and Kibana