Flink(三) Flink 编程模型之创建和加载数据集

Flink(三) Flink 编程模型之创建和加载数据集

所有的 Flink 程序都是由三部分组成的: SourceTransformationSink

Source 负责读取数据源, Transformation 利用各种算子进行处理加工, Sink 负责输出。

DataStream Source API

DataSource模块定义了DataStream API的数据输入操作,Flink将数据源主要分为内置数据源和第三方数据源两种类型。

内置数据源

  1. 文件数据源

    readTextFile(path):TextInputFormat逐行读取文本文件,即符合规范的文件,并将它们作为字符串返回。

    readFile(fileInputFormat, path):

    readFile(fileInputFormat, path, watchType, interval, pathFilter, typeInfo) :watchType:文件读取类型,interval:检测文件变换事件间隔,pathFilter,文件路径过滤条件

    其中:watchType分为PROCESS_CONTINUOUSLY和PROCESS_ONCE。

    • PROCESS_CONTINUOUSLY :一旦检测到文件内容发生变化,Flink会将该文件的全部内容加载到Flink系统中进行处理
    • PROCESS_ONCE:当文件内容发生变化时,只会将变化的数据读取至Flink,在PROCESS_once模式下,可以保证数据Excatly Once级别的一致性保证
    //使用readTextFile方法直接读取文本文件
    DataStreamSource<String> stringDataStreamSource = env.readTextFile("F:\\mystudy\\mycode\\myFlink\\src\\main\\java\\testdata\\data.txt");
    stringDataStreamSource.print();
    //使用readFile(fileInputFormat, path):
    Path path = new Path("F:\\mystudy\\mycode\\myFlink\\src\\main\\java\\testdata\\LoginLog.csv");
    DataStreamSource<String> stringDataStreamSource = env.readFile(new CsvInputFormat<String>(path) {
                @Override
                protected String fillRecord(String s, Object[] objects) {
                    return null;
                }
            }, "F:\\mystudy\\mycode\\myFlink\\src\\main\\java\\testdata\\LoginLog.csv")
    
  2. Socket数据源

    调用socketTextStream方法,获取数据

    //接受socket数据流
    DataStreamSource<String> textDataSteam = env.socketTextStream("localhost",7777,"\n",5);
    

    该方法参数分别为Ip地址和端口,同时也可以传入字符串切割符delimiter和最大的尝试次数maxRetry

  3. 集合数据源

    集合内的数据结构类型必须要一致,否则可能会出现数据转换异常

    • 通过fromElements从元素集合中创建DataStream数据集:

      env.fromElements(1,2,5).print();
      
    • 通过formCollection从数组转创建

      String[] element=new String[]{"hello","flink"};
      env.fromCollection(Arrays.asList(element));
      
    • 将java.util.List转化为DataStream

      List<String> arraylist=new ArrayList<>();
      arraylist.add("hello flink");
      env.fromCollection(arraylist);
      

    外部数据源

    flink内置连接器信息:

    连接器 是否提供Source支持 是否提供Sink支持
    Apache Kafka
    Apache Cassandra
    Amazon Kinesis Data Streams
    Elasticsearch
    Hadoop FileSystem
    RabbitMQ
    Apache Nifi
    Twitter Streaming API

    以Kafka为例:

    加入依赖:

    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId> flink-connector-kafka-0.11_2.11</artifactId>
        <version>1.6.0</version>
    </dependency>
    

    数据接入:

    Properties properties = new Properties();
    properties.setProperty("bootstrap.servers","localhost:9092");
    properties.setProperty("group.id","consumer-group");
    properties.setProperty("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
    properties.setProperty("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
    properties.setProperty("auto.offset.reset","lastest");
    
    DataStreamSource<String> sensor = env.addSource(new FlinkKafkaConsumer011<String>("sensor", new SimpleStringSchema(), properties));
    
posted @ 2020-08-02 17:35  这个小仙女真可爱  阅读(330)  评论(0编辑  收藏  举报