Flink 学习: DataStream Api 入门

一、数据源

1、内置数据源

  • 基于文件
  • 基于socket
  • 基于collection

2、自定义数据源

  • 实现SourceFuncition (非并行)
  • 实现ParalleSourceFuncition
  • 实现RichParalleSourceFuncition (如需打开/关闭数据源,打开/关闭连接)

3、自定义数据源例子

	public class SimpleSourceFunction implements ParallelSourceFunction<Long> {
		private long num = 0L;
		private volatile boolean isRunning = true;

		@Override
		public void run(SourceContext<Long> sourceContext) throws  Exception{
			while (isRunning){
				sourceContext.collect(num);
				num ++;
				Thread.sleep(10000);
			}
		}

		@Override
		public void cancel(){
			isRunning = false;
		}
	}

 

二、转换算子

三、DataSink

1、常用的sink

 

2、自定义sink

  • 实现SinkFunction接口
  • 继承RichSinkFunction

四、流式迭代运算(Iterations)

1、简单的理解迭代

  • 当前运算的输出作为下一运算的输入
  • 不断反复进行某个运算知道满足某个条件退出

2、流式迭代计算

  • 没有最大迭代次数
  • 需要通过split/filter转换操作指定流的那些部分反馈给那些算子,哪些部分数据被转发到下游DataStream

3、基本套路

  • 基于输入流构建IterativeStream(迭代头)
  • 定义迭代逻辑(map func等)
  • 定义反馈流逻辑(从迭代过的流中过滤出符合条件的元素组成部分流反馈给迭代头进行重复计算的逻辑)
  • 调用IterativeStream的closeWith的方法可以关闭一个迭代
  • 定义终止迭代的逻辑(符合条件的元素将被下发给下游而不用于进行下一次迭代)

流式迭代计算例子:

package org.myorg.quickstart;

import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.IterativeStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

// 输入一组数据对其分别减10,直达为0
public class IterativeStreamJob {
    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStream<Long> input = env.generateSequence(0,100);
        // 基于输入流构建IterativeStream
        IterativeStream<Long> itStream = input.iterate();
        
        // 定义迭代逻辑(map func等)
        DataStream<Long> minusOneStream = itStream.map(new MapFunction<Long, Long>(){
            @Override
            public Long map(Long value) throws Exception {
                return value -10;
            }
        });

        // 定义反馈流逻辑
        DataStream<Long> feedBackStream = minusOneStream.filter(new FilterFunction<Long>() {
            @Override
            public boolean filter(Long value) throws Exception {
                return value > 0;
            }
        });

        // 调用IterativeStream的closeWith的方法可以关闭一个迭代
        itStream.closeWith(feedBackStream);

        //  定义终止迭代的逻辑
        DataStream<Long> outputStream = minusOneStream.filter(new FilterFunction<Long>() {
            @Override
            public boolean filter(Long value) throws Exception {
                return value<=0;
            }
        });
        
        outputStream.print();

        env.execute("IterativeStreamJob");

    }
}

五、Execution 参数

1、默认情况下,流中的元素并不会一个一个的在网络中传输(这会导致不必要的网络流量消耗),而是缓存起来,缓存的time大小可以在Flink的配置文件、ExecutionEnvironment、设置某个算子上进行配置(默认100ms)

  • 好处:提高吞吐
  • 坏处:增加延时

六、调试

1、Flink 提供以下一些方法可以进行调试

  • 本地执行环境
  • Collection Data Sources
  • Iterator Data Sink  (  Iterator<T> output = DataStreamUtils.collect(outputStream);)

集合数据源--模拟数据源 (程序测试成功后,将source 和sink 替换为真正的source 和 sink)

        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.fromElements(1,2,3,4);
        env.fromCollection(Collection);
        env.fromCollection(Iterator, Class);
        env.generateSequence(1,100);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值