【flink】flink基础

一、Flink中的流与批

  • 批处理的特点是有界、持久、大量,非常适合需要访问全部记录才能完成的计算工作,一般用于离线统计。
  • 流处理的特点是无界、实时,无需针对整个数据集执行操作,而是对通过系统 传输的每个数据项执行操作,一般用于实时统计。

二、架构

1.重要角色

在这里插入图片描述

  • JobManager处理器:
    也称之为Master,用于协调分布式执行,它们用来调度task,协调检查点,协调失败时恢复等。Flink运行时至少存在一个master处理器,如果配置高可用模式则会存在多个master处理器,它们其中有一个是leader,而其他的都是standby。
  • TaskManager处理器:
    也称之为Worker,用于执行一个dataflow的task(或者特殊的subtask)、数据缓冲和data stream的交换,Flink运行时至少会存在一个worker处理器。

2.程序模型

在这里插入图片描述

三、WordCount案例(流处理)

1.步骤

  • 获取流处理运行环境
  • 构建socket流数据源,并指定IP地址和端口号
  • 对接收到的数据进行空格拆分
  • 对拆分后的单词,每个单词记一次数
  • 对拆分后的单词进行分组
  • 根据单词的次数进行聚合
  • 打印输出 启动执行
  • 在Linux中,使用nc -lk 端口号监听端口,并发送单词
    • 装nc: yum install -y nc
    • nc -lk 9999 监听9999端口的信息

2.代码

package cn.itcast.flink;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

/**
 * 编写Flink程序,接收socket的单词数据,并以空格进行单词拆分打印。
 */
public class StreamWordCount {
    public static void main(String[] args) throws Exception {

        //1:获取流处理运行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        //2:构建socket流数据源,并指定IP地址和端口号
        DataStream<String> lines = env.socketTextStream("node1", 9999);

        //3:对接收到的数据进行空格拆分
        SingleOutputStreamOperator<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public void flatMap(String line, Collector<String> out) throws Exception {
                //切分
                String[] words = line.split(" ");
                for (String word : words) {
                    //输出
                    out.collect(word);
                }
            }
        });

        //4:对拆分后的单词,每个单词记一次数
        SingleOutputStreamOperator<Tuple2<String, Integer>> wordAndOne = words.map(new MapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> map(String word) throws Exception {
                return Tuple2.of(word, 1);
            }
        });

        //5:对拆分后的单词进行分组
        KeyedStream<Tuple2<String, Integer>, Tuple> groupedStream = wordAndOne.keyBy(0);

        //6:根据单词的次数进行聚合
        SingleOutputStreamOperator<Tuple2<String, Integer>> summed = groupedStream.sum(1);

        //7:打印输出
        summed.print();

        //8:启动执行
        env.execute("StreamWordCount");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值