Flink学习笔记(4)——source and sink

本文详细介绍了Flink中的数据源和接收器,包括从集合、文件、socket、kafka读取数据,以及如何自定义source和sink。讨论了自定义sink的基本方法,如open、invoke和close,并提供了从文件读取的具体实现细节,强调了不同watchType对文件源的影响。此外,还提到了向kafka、redis和Elasticsearch的写入操作以及jdbc自定义方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

flink中提供了很多种数据源,有基于本地集合的 source、基于文件的 source、基于网络套接字的 source、自定义的 source。自定义的 source 常见的有 Apache kafka、Amazon Kinesis Streams、RabbitMQ、Twitter Streaming API、Apache NiFi 等,当然你也可以定义自己的 source。
在这里插入图片描述
Flink 常见的 Sink 大概有如下几类:写入文件、打印出来、写入 socket 、自定义的 sink 。自定义的 sink 常见的有 Apache kafka、RabbitMQ、MySQL、ElasticSearch、Apache Cassandra、Hadoop FileSystem 等,同理你也可以定义自己的 Sink。
在这里插入图片描述
自定义sink需要继承RichSinkFunction 类,主要实现open、invoke、close三个方法。open主要是一些连接,invoke主要是插入逻辑,close是关闭。比如sink to mysql,open建立连接,invoke具体写执行逻辑,close关闭连接。

从集合读取数据

  1. fromCollection(Collection) - 从 Java 的 Java.util.Collection 创建数据流。集合中的所有元素类型必须相同。
  2. fromCollection(Iterator, Class) - 从一个迭代器中创建数据流。Class 指定了该迭代器返回元素的类型。
  3. fromElements(T …) - 从给定的对象序列中创建数据流。所有对象类型必须相同。
  4. fromParallelCollection(SplittableIterator, Class) - 从一个迭代器中创建并行数据流。Class 指定了该迭代器返回元素的类型。
  5. fromSequence(from, to) - 创建一个生成指定区间范围内的数字序列的并行数据流。
    package source;
    
    import bean.SensorReading;
    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 java.util.Arrays;
    
    /**
     * Created with IntelliJ IDEA.
     *
     * @Author: yingtian
     * @Date: 2021/05/10/16:36
     * @Description: 从集合中读取数据
     */
    public class SourceTest1_Collection {
         
    
        public static void main(String[] args) throws Exception{
         
            //创建执行环境
            StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    
            env.setParallelism(1);
    
            // Source: 从集合Collection中获取数据
            DataStream<SensorReading> dataStream = env.fromCollection(
                    Arrays.asList(
                            new SensorReading("sensor_1", 1547718199L, 35.8),
                            new SensorReading("sensor_6", 1547718201L, 15.4),
                            new SensorReading("sensor_7", 1547718202L, 6.7),
                            new SensorReading("sensor_10", 1547718205L, 38.1)
                    )
            );
    
            //元素类型必须相同
            DataStream<Integer> intStream = env.fromElements(1,2,3,4,5,6,7,8,9);
    
            //生成区间 输出10、11、12、13、14、15
            DataStreamSource<Long> longStream = env.fromSequence(10, 15);
    
            //打印
            dataStream.print("sensorReading");
            intStream.print("int");
            longStream.print("long");
    
            //执行程序
            env.execute();
        }
    }
    

从文件读取数据

  1. readTextFile(path) - 读取文本文件,即符合 TextInputFormat 规范的文件,并将其作为字符串返回。

  2. readFile(fileInputFormat, path) - 根据指定的文件输入格式读取文件(一次)。

  3. readFile(fileInputFormat, path, watchType, interval, pathFilter, typeInfo)

    这是上面两个方法内部调用的方法。它根据给定的 fileInputFormat 和读取路径读取文件。根据提供的 watchType,这个 source 可以定期(每隔 interval 毫秒)监测给定路径的新数据(FileProcessingMode.PROCESS_CONTINUOUSLY),或者处理一次路径对应文件的数据并退出(FileProcessingMode.PROCESS_ONCE)。你可以通过 pathFilter 进一步排除掉需要处理的文件。
    实现:
    在具体实现上,Flink 把文件读取过程分为两个子任务,即目录监控和数据读取。每个子任务都由单独的实体实现。目录监控由单个非并行(并行度为1)的任务执行,而数据读取由并行运行的多个任务执行。后者的并行性等于作业的并行性。单个目录监控任务的作用是扫描目录(根据 watchType 定期扫描或仅扫描一次),查找要处理的文件并把文件分割成切分片(splits),然后将这些切分片分配给下游 reader。reader 负责读取数据。每个切分片只能由一个 reader 读取,但一个 reader 可以逐个读取多个切分片。
    重要注意:
    如果 watchType 设置为 FileProcessingMode.PROCESS_CONTINUOUSLY,则当文件被修改时,其内容将被重新处理。这会打破“exactly-once”语义,因为在文件末尾附加数据将导致其所有内容被重新处理。
    如果 watchType 设置为 FileProcessingMode.PROCESS_ONCE,则 source 仅扫描路径一次然后退出,而不等待 reader 完成文件内容的读取。当然 reader 会继续阅读,直到读取所有的文件内容。关闭 source 后就不会再有检查点。这可能导致节点故障后的恢复速度较慢,因为该作业将从最后一个检查点恢复读取。

    package source;
    
    import org.apache.flink.streaming.api.datastream.DataStreamSource;
    import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
    import wc.WordCountSet;
    
    /**
     * Created with IntelliJ IDEA.
     *
     * @Author: yingtian
     * @Date: 2021/05/10/16:54
     * @Description: 从文件中获取数据
     */
    public class SourceTest2_File {
         
    
        public static void main(String[] args) throws Exception{
         
            //创建执行环境
            StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    
            env.setParallelism(1);
    
            //从文件中读取数据
            String inputPath = WordCountSet.class.getClassLoader().getResource("sensor.txt").getFile
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值