Flink学习笔记(一)


​ Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算(源自官方)。学过大数据的同学应该都多多少少知道Spark这个大数据处理的框架,那它到底与Flink相比有什么不同的呢?

​ 其实我认为最大的不同还是他们的“世界观”不同,那世界观是什么呢?Spark在对处理数据上提供了RDD的概念,将所有的数据都转化成为RDD,即便是实时的数据,在Spark眼中,只要我拆分的够快处理的够快,就可以认为是实时,属于微批次的那种,但是Flink的世界观从来都是以事件作为驱动的,Flink中引入的时间观念从本质上来说是真正意义上的流处理。

​ 其实个人感觉针对流处理业务,如果要求不是很高,其实Spark完全可以胜任,但是如果是一些高实时,而且对数据的准确性要求很高的情况下建议使用Flink,它内部对这种场景提供了很好的解决和容错方案。


常用的API

创建执行环境:
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
Tips:创建环境的方式不止一个,但是这个是最常用的。
Source:在数据源端有五种方式获取数据源
1.可以从自定义的集合中读取数据:
List data = new ArrayList<Tuple3<Integer, Integer, Integer>>();
data.add(new Tuple3<>(0,2,2));
data.add(new Tuple3<>(0,1,1));
data.add(new Tuple3<>(0,5,6));
DataStreamSource dataSource3 = env.fromCollection(data);
2.可以从文件中读取数据:
DataStreamSource<String> dataSource = env.readTextFile("");
3.可以监听某一个端口进行读取数据源
DataStreamSource<String> dataSource = env.socketTextStream("localhost", 9999);
4.可以从不同的源中读取数据,数据的类型可以是多种:
DataStreamSource<? extends Serializable> dataSource = env.fromElements(1, "1", 'c', true, 3.6f);
5.可以添加一个数据源可以是kafka或者mq的数据源:
// 这里的连接器是官方提供的与kafka对接的连接器,properties需要根据自己的情况进行设置。
Properties properties = new Properties();
FlinkKafkaConsumer010<String> consumer = new FlinkKafkaConsumer010<>("topic", new SimpleStringSchema(), properties);

6.可以自定义生成数据的方法需要实现SourceFunction:
DataStreamSource<String> textFile = env.addSource(new TestFunction());
// 实现SourceFunction,并重写run和cancel的方法
private static class TestFunction implements SourceFunction<String>{
  private static final long serialVersionUID = 2167150769842816932L;

  boolean flag = true;
  
  @Override
  public void run(SourceContext<String> source) throws Exception {
    while(flag){
      String[] arr = {"a","b","c","d","e","f"};
      source.collect(arr[new Random().nextInt(arr.length)]);
      TimeUnit.SECONDS.sleep(2);
    }
  }

  @Override
  public void cancel() {
    this.flag = false;
  }
}
Tips:在实际的开发中常用的是通过kafka和mq消费数据,在测试时用的大多数是自定义的Function和对某一个Socket进行监听。

posted @ 2020-09-26 16:21  小学生终结者  阅读(129)  评论(0)    收藏  举报