Flink-数据局流DataStream

 Flink主要用来处理数据流,所以从抽象上来看就是对数据流的处理,正如前面大数据开发-Flink-体系结构 && 运行架构提到写Flink程序实际上就是在写DataSource、Transformation、Sink。

  • DataSource是程序的数据源输入,可以通过StreamExecutionEnvironment.addSource(sourceFuntion)为程序
    添加一个数据源

  • Transformation是具体的操作,它对一个或多个输入数据源进行计算处理,比如Map、FlatMap和Filter等操作

  • Sink是程序的输出,它可以把Transformation处理之后的数据输出到指定的存储介质中

Flink针对DataStream提供了实现数据源的方式,可以归纳为以下几种:

  • 基于文件readTextFile(path) 读取文本文件,文件遵循TextInputFormat逐行读取规则并返回

  • 基于SocketsocketTextStream 从Socket中读取数据,元素可以通过一个分隔符分开

  • 基于集合fromCollection(Collection) 通过Java的Collection集合创建一个数据流,集合中的所有元素必须是相同类型的,需要注意的是,如果集合里面的元素要识别为POJO,需要满足下面的条件

总结:上面的要求其实就是为了让Flink可以方便地序列化和反序列化这些对象为数据流

  • 该类有共有的无参构造方法

  • 该类是共有且独立的(没有非静态内部类)

  • 类(及父类)中所有的不被static、transient修饰的属性要么有公有的(且不被final修饰),要么是包含公有的getter和setter方法,这些方法遵循java bean命名规范

自定义Source

使用StreamExecutionEnvironment.addSource(sourceFunction)将一个流式数据源加到程序中,具体这个sourceFunction 是为非并行源implements SourceFunction,或者为并行源 implements ParallelSourceFunction接口,或者extends RichParallelSourceFunction,对于自定义Source,Sink, Flink内置了下面几种Connector

连接器是否提供Source支持是否提供Sink支持
Apache Kafka
ElasticSearch
HDFS
Twitter Streaming PI

   对于Source的使用,其实较简单,这里给一个较常用的自定义Source的KafaSource的使用例子。更多相关源码可以查看

Source数据源

  1. 从已有集合读取数据

  2. List<Tuple3<String, String, Integer>> tuple3List = Arrays.asList(Tuple3.of("zs", "532101xxx", 1),Tuple3.of("ls", "532102xxx", 2),Tuple3.of("ww", "532103xxx", 2));
    DataStream<Tuple2<String, Integer>> dataStream = env.fromCollection(tuple3List)

   2.读取任意类型的数据

env.fromElements(1, 2, "date")

  3.从文件读取数据

env.readTextFile("D:\\test.txt")

  4.从kafka中读取

pom.xml引入

<dependency>    <groupId>org.apache.flink</groupId>    <artifactId>flink-connector-kafka_2.11</artifactId>    <version>1.13.0</version></dependency>

Kafka Consumer 代码如下

Properties properties = new Properties();properties.setProperty("bootstrap.servers", "localhost:9092");properties.setProperty("group.id", "test");DataStream<String> stream = env  .addSource(new FlinkKafkaConsumer<>("topic", new SimpleStringSchema(), properties));

Transfromation转换

    对于Transformation ,Flink提供了很多的算子,map、flatMap...

map

    DataStream → DataStream Takes one element and produces one element. A map function that doubles the values of the input stream:

flatMap

DataStream → DataStream Takes one element and produces zero, one, or more elements. A flatmap function that splits sentences to words:

Sink

Flink针对DataStream提供了大量的已经实现的数据目的地(Sink),具体如下所示

  • writeAsText():讲元素以字符串形式逐行写入,这些字符串通过调用每个元素的toString()方法来获取

  • print()/printToErr():打印每个元素的toString()方法的值到标准输出或者标准错误输出流中

  • 自定义输出:addSink可以实现把数据输出到第三方存储介质中, Flink提供了一批内置的Connector,其中有的Connector会提供对应的Sink支持

FlinkKafkaProducer producer = new FlinkKafkaProducer(brokerList, topic, new SimpleStringSchema());
data.addSink(producer);

   当然sink也可以自定义,自定义Sink需要建议继承RichSinkFunction类。

   如果觉得文章能帮到您,欢迎关注微信公众号:“蓝天Java大数据” ,共同进步!

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值