flink---4 dataStream api (1)source

lsource是程序的数据源输入,你可以通过StreamExecutionEnvironment.addSource(sourceFunction)来为你的程序添加一个source。

lflink提供了大量的已经实现好的source方法,你也可以自定义source

通过实现sourceFunction接口来自定义无并行度的source,

或者你也可以通过实现ParallelSourceFunction 接口 or 继承RichParallelSourceFunction 来自定义有并行度的source。

l基于文件

readTextFile(path)

读取文本文件,文件遵循TextInputFormat 读取规则,逐行读取并返回。

l基于socket

socketTextStream
从socker中读取数据,元素可以通过一个分隔符切开。

l基于集合

fromCollection(Collection)

通过java 的collection集合创建一个数据流,集合中的所有元素必须是相同类型的。

l自定义输入

addSource 可以实现读取第三方数据源的数据

系统内置提供了一批connectors,连接器会提供对应的source支持【kafka

source容错性分析

Source

语义保证

备注

kafka

exactly once(仅一次)

建议使用0.10及以上

Collections

exactly once

 

Files

exactly once

 

Socktes

at most once

 

 

自己实现一个单并行度的source

/**
 * @author zhangqi
 * @date 2019/6/11 下午7:39
 * 模拟产生1开始的数字
 */

public class MyNoParalleSource implements SourceFunction<Long> {

    private Long count = 0L;

    private boolean isRunning = true;

    /**
     * 主要的方法,启动一个source,大部分情况下都要在这个run方法中实现一个循环,这样可以循环产生数据
     * @param sourceContext
     * @throws Exception
     */
    @Override
    public void run(SourceContext sourceContext) throws Exception {
         while (isRunning){
             sourceContext.collect(count++);
             Thread.sleep(1000L);
         }
    }

    /**
     * 取消一个cancel的时候回调用的方法,相当于一个钩子方法
     */
    @Override
    public void cancel() {
         isRunning= false;
    }
}

public class StreamingDemoWithSelfDefineSource {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment streamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStream<Long> dataStreamSource = streamExecutionEnvironment.addSource(new MyNoParalleSource());
        DataStream<Long> env2 =  dataStreamSource.map(t->{
            System.out.println("接收到的数据:"+t);
            return t;
        }).timeWindowAll(Time.seconds(2)).sum(0);
        env2.print();
        streamExecutionEnvironment.execute();
    }
}

以上例子不能设置多并行度,否则会报错

实现一个多并行度只需要把SourceFunction改成ParallelSourceFunction

Kafka的source放在后面讲

 

`Flink-JSON`是一个用于处理JSON数据的插件,而`CanalJsonDeserializationSchema`通常是在Apache FlinkDataStream API中用于从Canal(阿里巴巴开源的一个分布式数据库变更日志服务)消息中解析JSON格式的数据并将其转换成内部表结构。 要使用`CanalJsonDeserializationSchema`,你需要按照以下步骤操作: 1. 添加依赖:首先,在你的Flink项目中添加Flink-JSON和Canal的依赖到构建工具(如Maven或Gradle)的配置文件中。 ```xml <!-- Maven --> <dependency> <groupId>com.alibaba</groupId> <artifactId>flink-connector-canal_2.11</artifactId> <version>版本号</version> </dependency> <!-- Gradle --> implementation 'com.alibaba:flink-connector-canal_2.11:版本号' ``` 2. 创建实例:创建一个`CanalJsonDeserializationSchema`的对象,并提供所需的配置,比如Canal的地址、主题名称等。 ```java CanalJsonDeserializationSchema canalSchema = new CanalJsonDeserializationSchemaBuilder() .jsonSchema("your_json_schema") // 根据你的数据定义JSON schema .build(); ``` 3. 注入schema:将`CanalJsonDeserializationSchema`应用于DataStreamSource操作上。 ```java DataStream<YourPojoClass> dataStream = env.addSource(new FlinkKafkaConsumer<>("canal_topic", canalSchema, kafkaConfig)); ``` 4. 处理数据:现在你可以对解析后的`YourPojoClass`对象进行进一步的处理,例如过滤、聚合或写入其他目标。 ```java dataStream.map(new MapFunction<YourPojoClass, String>() { @Override public String map(YourPojoClass value) { return value.toString(); } }) .print(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值