• Flink流式计算


    1、spark:DStream

    Flink:DataStream

    2、Flink Time

    处理乱序 watemark(水位线机制)

    3、个别数据

    4、状态容错(面试项目重点)

    5、Flink+Kafka项目应用

    数据源-------》数据采集-----》kafka-----》流计算(spark/Flink)------》数据输出

    获取的每个变量都不可以变  
    分布式缓存
    1、flink(hadoop)
    例子:
    hdfs://mycluster/user/hiver/user.log
    自定义RichMapFuntion
    2.1通过nc发送数据
    [root@hadoop3-1 ~]# nc -lk 9999
    2.2启动flink 应用
    2.3窗口触发
    key:9527,eventtime:[2020-02-22 16:16:34.000],currentMaxTimestamp:[2020-02-22 16:16:34.000],watermark:[2020-02-22 16:16:24.000]
    
    (9527),窗口元素个数:[1],窗口元素最小值:[2020-02-22 16:16:22.000],窗口元素最大值:[2020-02-22 16:16:22.000],窗口起始值:[2020-02-22 16:16:21.000],窗口结束值:[2020-02-22 16:16:24.000]
    
    
    3.测试总结:
    window窗口大小间隔跟TumblingEventTimeWindows.of(Time.seconds(3)设置有关,但是窗口的起始值和结束值跟数据本身没有关系,而是系统定义好的。
    
    窗口触发计算需要满足两个条件
    a)watermark时间>=window_endtime
    b)[window_starttime,window_endtime)窗口中必须有至少输入数据

    案例:

    package com.djt.flink.BACD;
    import org.apache.commons.io.FileUtils;
    import org.apache.flink.api.common.functions.RichMapFunction;
    import org.apache.flink.api.java.DataSet;
    import org.apache.flink.api.java.ExecutionEnvironment;
    import org.apache.flink.api.java.operators.DataSource;
    import org.apache.flink.api.java.tuple.Tuple2;
    import org.apache.flink.configuration.Configuration;
    import java.io.File;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    /**
     * @author dajiangtai
     * @create 2020-02-18-17:29
     */
    public class DistributedCacheDemo {
        public static void main(String[] args) throws Exception{
    
            //获取运行环境
            ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
    
            //1.添加分布式缓存文件
            env.registerCachedFile("D:\\study\\data\\2020\\city.txt","city.txt");
    
            //源数据
            ArrayList<Tuple2<Integer, String>> list = new ArrayList<>();
            list.add(new Tuple2(101,"1.1万亿"));
            list.add(new Tuple2(102,"1万亿"));
            list.add(new Tuple2(103,"8千亿"));
    
            DataSource<Tuple2<Integer,String>> data = env.fromCollection(list);
    
            DataSet<String> result = data.map(new RichMapFunction<Tuple2<Integer,String>, String>() {
                HashMap<Integer, String> allMap = new HashMap<Integer, String>();
    
                @Override
                public void open(Configuration parameters) throws Exception {
                    super.open(parameters);
                    //2.获取分布式缓存文件
                    File myFile = getRuntimeContext().getDistributedCache().getFile("city.txt");
                    List<String> lines = FileUtils.readLines(myFile);
                    for (String line : lines) {
                        String[] split = line.split(",");
                        allMap.put(Integer.parseInt(split[0]),split[1]);
                        System.out.println("line:" + line);
                    }
                }
    
                @Override
                public String map(Tuple2<Integer,String> value) throws Exception {
                    //3.使用分布式缓存文件
                    String province = allMap.get(value.f0);
                    return province+","+value.f1;
                }
            });
    
            result.print();
        }
    }

    总结:可以理解为是一个公共的共享变量,我们可以把一个dataset 数据集广播出去,然后不同的task在节点上都能够获取到,这个数据在每个节点上只会存在一份。如果不使用broadcast,则在每个节点中的每个task中都需要拷贝一份dataset数据集,比较浪费内存(也就是一个节点中可能会存在多份dataset数据)。

    用法

    1:初始化数据

    DataSet<Integer> toBroadcast = env.fromElements(1, 2, 3)

    2:广播数据

    .withBroadcastSet(toBroadcast, "broadcastSetName");

    3:获取数据

    Collection<Integer> broadcastSet = getRuntimeContext().getBroadcastVariable("broadcastSetName");

    触发了30到33的数据

     

     

    ########## 今天的苦逼是为了不这样一直苦逼下去!##########
  • 相关阅读:
    Codeforces Round #192 (Div. 2)
    STL删除vector或list的方法及注意的问题
    HDU 4614 (13年多校第二场1004)裸线段树
    将汇编的指令画在图片上==可以贴图法操作==动动图片图案指示就行了。(堆积木编译器)
    MySQL Connector/Python 安装、测试
    crtmpserver的架构简介
    hi3531的i2c部分 分类: HI3531 2014-03-18 14:41 948人阅读 评论(0) 收藏
    bootrom的构成 分类: vxWorks 2014-03-14 08:48 315人阅读 评论(0) 收藏
    bootrom脚本的创建 分类: vxWorks 2014-03-14 08:47 307人阅读 评论(0) 收藏
    ROM型启动方式概述 分类: vxWorks 2014-03-14 08:47 297人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/ruii/p/14386509.html
Copyright © 2020-2023  润新知