pig2 发表于 2020-3-12 19:34:51

Flink从思想到实现,从实现到细节1

本帖最后由 pig2 于 2020-3-15 10:08 编辑

问题导读

1.Flink流式处理到底是怎样的?
2.Flink window是为了解决什么问题?
3.你认为Flink优势在什么地方?


Flink当前已经非常流行,而且普及率已经非常高了。有的会Spark,就懒的学习Flink了,有的同学想学习Flink,可是总是学点皮毛。

这里给大家将Flink从思想到实现,从实现到细节,来剖析Flink。

1.Flink思想
Spark已经非常火了,为何还会产生Flink,而且他们是很多地方,都是类似的。那么Flink到底跟Spark不同在地方?为何Flink会火。Flink设计思想的源头:把数据视为流式的,对的,这就是这么个想法。那么这时候我们产生问题了,Spark,Storm是流式处理,MapReduce是批数据。那么到了Flink为何统一了流处理和批处理。Flink认为数据是流式的,批处理是流处理的特殊情况。正是因为这个想法所以Flink和Spark、Storm区分开来。虽然Spark和Flink二者长的有点像,但是在思想上或则设计层面,他们完全是不同的。Flink是真正的流式处理,比如Flink各种api都是在流上来处理数据的。Spark则不是,Spark是在微批数据的基础上来处理数据的。
那么什么是流上处理数据,什么是在微批的基础上处理数据。我们来看下面例子部分代码:

Flink部分代码:
package com.aboutyun.flink_example;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.ReduceFunction;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;

public class SocketWindowWordCount {
public static void main(String[] args) throws Exception{
         //连接端口号
      final int port;
      try {
                final ParameterTool params = ParameterTool.fromArgs(args);
                port = params.getInt("port");
      } catch (Exception e) {
                System.out.println("No port specified. Please run 'SocketWindowWordCount --port <port>'");
                return ;
      }
      //获取执行环节
      final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
      
      //获取连接socket输入数据
      DataStream<String> text = env.socketTextStream("node3.kg.cn", port,"\n");
      
      //解析数据、对数据进行分组、窗口函数和统计个数
      
      DataStream<WordWithCount> windowCounts =text.flatMap(new FlatMapFunction<String, WordWithCount>() {

                private static final long serialVersionUID = 6800597108091365154L;

                public void flatMap(String value, Collector<WordWithCount> out) throws Exception {
                         for(String word:value.split("//s")) {
                                 out.collect(new WordWithCount(word, 1));
                         }
                }
      })
                        .keyBy("word")
                        .timeWindow(Time.seconds(5),Time.seconds(1))
                        .reduce(new ReduceFunction<WordWithCount>() {
                              
                              public WordWithCount reduce(WordWithCount value1, WordWithCount value2) throws Exception {
                                       
                                        return new WordWithCount(value1.word,value1.count+value2.count);
                              }
                        });
      windowCounts.print().setParallelism(1);
      
      env.execute("Socket Window WordCount");
      
}

}


代码解析:
DataStream<String> text = env.socketTextStream("node3.kg.cn", port,"\n");
text是实时获取端口的流式数据,那么这个流式数据该如何处理?
首先想将这个流式数据进行下分割,分隔符为:空格,回车,换行等空白符。那么这个该如何实现。通过下面代码text.flatMap(new FlatMapFunction<String, WordWithCount>() {

                private static final long serialVersionUID = 6800597108091365154L;

                public void flatMap(String value, Collector<WordWithCount> out) throws Exception {
                         for(String word:value.split("//s")) {
                                 out.collect(new WordWithCount(word, 1));
                         }
                }
      })
这其实就是在流上的数据处理。很多老铁,都知道Flink为流式处理,到底流式处理怎么实现,这便是流式处理的实现。这时候我们可能产生一个问题?window是干啥的?它不是批处理吗?这就要从需求出发了,如果我们想在流上做下统计,比如想统计5分钟内数据,比如统计商品的下单数,或则统计单词个数等,这就是我们的需求。面对这个需求,我们该如何实现--window,应运而生。这就是window的作用,很多新手在学习Flink的时候,认为window是Flink批处理的表现。其实这是Flink为了满足用户需求而生的api。

我们来看Spark,Spark DStream是微批处理。pageViews = readStream("http://...", "1s")
ones = pageViews.map(event => (event.url, 1))
counts = ones.runningReduce((a, b) => a + b)
可以看到Flink亦是有map函数,Spark也有map函数,二者都是对数据的处理,但是在实现上,Flink是真正的流式处理,Spark则是微批处理。这就是二者在思想上或则设计上的本质区别。

最新经典文章,欢迎关注公众号http://www.aboutyun.com/data/attachment/forum/201406/15/084659qcxzzg8n59b6zejp.jpg待续:
2.Flink实现
3.Flink细节



美丽天空 发表于 2020-3-13 09:53:14

感谢分享

marguerite 发表于 2020-4-12 16:52:20

赞赞赞&#128077;,跟着博主学
页: [1]
查看完整版本: Flink从思想到实现,从实现到细节1