网上关于Flink介绍的文章很多,可以自行百度,向来喜欢研究技术解决实际问题,主要谈我是怎么入坑的
学java出身没怎么接触大数据,也分不清楚Hadoop和Spark的业务场景好坏之分,只是在工作中遇到GPS异常数据处理时,项目中时时会出现一些单靠现有的知识解决不了的问题,想着有没有更好的架构或者java相关的处理办法呢,而恰好Flink是基于java代码设计的,于是开始了
简单的介绍还是要的
一 应用场景:
大量数据不断产生:金融交易数据,互联网订单数,GPS定位数据,传感器信号,移动终端数据,以及网络流量监控,服务器产生的日志;这些数据共同点都是实时从不同数据源产生,然后再传输到下游。日常的智能推荐,复杂事件处理,实时欺诈检测,流数据分析,及时报表。
二.优势特点:
1高吞吐,低延迟,高性能
2支持事时间概念,支持有状态计算(将计算的结果放在内存或者文件中,等下一个事件获取中间结果,有效降低了资源消耗)
3有很好的容错机制,基于分布式的快照CheckPoints,Save points恢复到原来的计算状态
4基于JVM实现的独立内存管理,将所有数据对象转成二进制在内存中,降低内存空间和GC带来的问题
来实现我们的第一个Flink项目
三.安装Flink
官网下载https://flink.apache.org/downloads.html#apache-flink-181
下载后,直接去E:\Flink\flink-1.8.1-bin-scala_2.11\flink-1.8.1\bin\start-cluster.bat(安装目录的bat文件),然后查看本地8081
当然,这些是为后面做铺垫,还是回归到我们demo上来
四.创建maven项目
当然第一次需要将flink所需的jar按add进来,仓库jar包地址如下
构建完成结构如下(多出2个默认批处理和流处理的java文件)
五创建流处理的main方法
我这里的demo是对文件的单词进行统计次数小功能,将他打印到控制台和指定文件内
import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.util.Collector; /** * 利用读取文件 * @author zhouxl */ public class ReadFile { public static void main(String[] args) throws Exception { //第一步设定环境 final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); //第二步;指定数据源,读取文件 DataStreamSource<String> stream =env.readTextFile("本地文件地址,可相对和绝对路径"); //第三步:计数 SingleOutputStreamOperator<Tuple2<String, Integer>> sum = stream.flatMap(new Tokenizer()) .keyBy(0) .sum(1); //将统计数据打印控制台 sum.print(); //将统计数据打印到本地文件 sum.writeAsText("自定义本地文件路径"); env.execute("单词统计数据"); } public static final class Tokenizer implements FlatMapFunction<String, Tuple2<String, Integer>> { @Override //s是行数据,将每行数据进行切割 public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) { String[] tokens = s.toLowerCase().split("\\W+"); //token是切出来的单词 for (String token: tokens) { if (token.length() > 0) { //写入集合统计 collector.collect(new Tuple2<String, Integer>(token, 1)); } } } } }
直接运行,会生成本地文件夹打开如下:
前面是分出的单词数,后面的统计个数,至于控制台日志内容以及分析,接着会在下一次讲到!