flink入门_Flink快速入门

第1章针对Flink的基本原理、架构和组件进行了分析,本章开始快速实现一个Flink的入门案例,这样可以加深对之前内容的理解。

2.1 Flink开发环境分析

2.1.1 开发工具推荐

在实战之前,需要先说明一下开发工具的问题。官方建议使用IntelliJ IDEA,因为它默认集成了Scala和Maven环境,使用更加方便,当然使用Eclipse也是可以的。

开发Flink程序时,可以使用Java或者Scala语言,个人建议使用Scala,因为使用Scala实现函数式编程会比较简洁。当然使用Java也可以,只不过实现起来代码逻辑比较笨重罢了。

在开发Flink程序的时候,建议使用Maven管理依赖。针对Maven仓库,建议使用国内镜像仓库地址,因为国外仓库下载较慢,可以使用国内阿里云的Maven仓库。

注意:如果发现依赖国内源无法下载的时候,记得切换回国外源。利用国内阿里云Maven仓库镜像进行相关配置时,需要修改$Maven_HOME/conf/settings.xml文件。

aliMavenaliyun Mavenhttp://Maven.aliyun.com/nexus/content/groups/public/central

2.1.2 Flink程序依赖配置

在使用Maven管理Flink程序相关依赖的时候,需要提前将它们配置好。对应的Maven项目创建完成以后,也需要在这个项目的pom.xml文件中进行相关配置。

使用Java语言开发Flink程序的时候需要添加以下配置。

注意:在这里使用的Flink版本是1.6.1。如果使用的是其他版本,需要到Maven仓库中查找对应版本的Maven配置。

org.apache.flink  flink-java  1.6.1providedorg.apache.flink  flink-streaming-java_2.11  1.6.1provided

使用Scala语言开发Flink程序的时候需要添加下面的配置。

org.apache.flink  flink-scala_2.11  1.6.1providedorg.apache.flink  flink-streaming-scala_2.11  1.6.1provided

注意:在IDEA等开发工具中运行代码的时候,需要把依赖配置中的scope属性注释掉。在编译打JAR包的时候,需要开启scope属性,这样最终的JAR包就不会把这些依赖包也包含进去,因为集群中本身是有Flink的相关依赖的。

2.2 Flink程序开发步骤

开发Flink程序有固定的流程。

(1)获得一个执行环境。

(2)加载/创建初始化数据。

(3)指定操作数据的Transaction算子。

(4)指定计算好的数据的存放位置。

(5)调用execute()触发执行程序。

注意:Flink程序是延迟计算的,只有最后调用execute()方法的时候才会真正触发执行程序。

延迟计算的好处:你可以开发复杂的程序,Flink会将这个复杂的程序转成一个Plan,并将Plan作为一个整体单元执行!

在这里,提前创建一个Flink的Maven项目,起名为FlinkExample,效果如图2.1所示。

a005a841a53f24c37675f4b83e139896.png

图2.1 项目目录

后面的Java代码全部存放在src/main/Java目录下,Scala代码全部存放在src/main/Scala目录下,流计算相关的代码存放在对应的streaming目录下,批处理相关的代码则存放在对应的batch目录下。

2.3 Flink流处理(Streaming)案例开发

需求分析:通过Socket手工实时产生一些单词,使用Flink实时接收数据,对指定时间窗口内(如2s)的数据进行聚合统计,并且把时间窗口内计算的结果打印出来。

2.3.1 Java代码开发

首先添加Java代码对应的Maven依赖,参考2.1.2节的内容。注意,在下面的代码中,我们会创建一个WordWithCount类,这个类主要是为了方便统计每个单词出现的总次数。

需求:实现每隔1s对最近2s内的数据进行汇总计算。

分析:通过Socket模拟产生单词,使用Flink程序对数据进行汇总计算。

代码实现如下。

package xuwei.tech.streaming;import org.apache.Flink.api.common.functions.FlatMapFunction;import org.apache.Flink.api.Java.utils.ParameterTool;import org.apache.Flink.contrib.streaming.state.RocksDBStateBackend;import org.apache.Flink.runtime.state.filesystem.FsStateBackend;import org.apache.Flink.runtime.state.memory.MemoryStateBackend;import org.apache.Flink.streaming.api.DataStream.DataStream;import org.apache.Flink.streaming.api.DataStream.DataStreamSource;import org.apache.Flink.streaming.api.environment.StreamExecutionEnvironment;import org.apache.Flink.streaming.api.windowing.time.Time;import org.apache.Flink.util.Collector;/** * 单词计数之滑动窗口计算 * * Created by xuwei.tech */public class SocketWindowWordCountJava { public static void main(String[] args) throws Exception{ //获取需要的端口号 int port; try { ParameterTool parameterTool = ParameterTool.fromArgs(args); port = parameterTool.getInt("port"); }catch (Exception e){ System.err.println("No port set. use default port 9000--Java"); port = 9000; } //获取Flink的运行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); String hostname = "hadoop100"; String delimiter = ""; //连接Socket获取输入的数据 DataStreamSource text = env.socketTextStream(hostname, port, delimiter); // a a c // a 1 // a 1 // c 1 DataStream windowCounts = text.flatMap(new FlatMapFunction () { public void flatMap(String value, Collector out) throws Exception { String[] splits = value.split("s"); for (String word : splits) { out.collect(new WordWithCount(word, 1L)); } } }).keyBy("word") .timeWindow(Time.seconds(2), Time.seconds(1))//指定时间窗口大小为2s,指定时间间隔为1s .sum("count");//在这里使用sum或者reduce都可以 /*.reduce(new ReduceFunction() { public WordWithCount reduce(WordWithCount a, WordWithCount b) throws Exception { return new WordWithCount(a.word,a.count+b.count); } })*/ //把数据打印到控制台并且设置并行度 windowCounts.print().setParallelism(1); //这一行代码一定要实现,否则程序不执行 env.execute("Socket window count"); } public static class WordWithCount{ public String word; public long count; public WordWithCount(){} public WordWithCount(String word,long count){ this.word = word; this.count = count; } @Override public String toString() { return "WordWithCount{" + "word='" + word + ''' + 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值