大数据之Flink(一)

1、简介

flink是一个分布式计算/处理引擎,用于对无界和有界数据流进行状态计算。

flink处理流程
在这里插入图片描述
应用场景:

  • 电商销售:实时报表、广告投放、实时推荐
  • 物联网:实时数据采集、实时报警
  • 物流配送、服务:订单状态跟踪、信息推送
  • 银行、金融:实时结算、风险检测

有状态的流式处理

用内存的本地状态替代传统的数据库
在这里插入图片描述
flink核心特点:高吞吐低延迟、结果准确性、精确一次的状态一致性保证、兼容性好、高可用和动态扩展。

分层API:

  • SQL-最高层语言
  • Table API-声明式领域专用语言
  • DataStream/ DataSet API-核心API
  • 有状态流处理-底层API

Flink与Spark对比
在这里插入图片描述

  • 数据模型

    spark采用RDD模型,spark streaming的DStream实际上也是一组小批量数据集(RDD的集合)

    flink基本数据模型是数据流以及时间序列

  • 运行时架构

    spark是批计算,将DAG划分为不同的stage,一个完成后才计算下一个

    flink是标准的流执行模式,一个事件在一个节点处理完后直接发往下一个节点进行处理

    2、测试wordcount

maven的pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.lizhe</groupId>
    <artifactId>flinkDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
        <build>
        <plugins>
            <!-- 该插件用于将Scala代码编译成class文件 -->
<!--            <plugin>-->
<!--                <groupId>net.alchim31.maven</groupId>-->
<!--                <artifactId>scala-maven-plugin</artifactId>-->
<!--                <version>3.4.6</version>-->
<!--                <executions>-->
<!--                    <execution>-->
<!--                        &lt;!&ndash; 声明绑定到maven的compile阶段 &ndash;&gt;-->
<!--                        <goals>-->
<!--                            <goal>compile</goal>-->
<!--                        </goals>-->
<!--                    </execution>-->
<!--                </executions>-->
<!--            </plugin>-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>1.13.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_2.12</artifactId>
            <version>1.13.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.12</artifactId>
            <version>1.13.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>
    </dependencies>


</project>

java代码(批处理)

package FlinkDemo;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.AggregateOperator;
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.operators.FlatMapOperator;
import org.apache.flink.api.java.operators.UnsortedGrouping;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;


/**
 * @Title: FlinkWordCount
 * @Author lizhe
 * @Package FlinkDemo
 * @Date 2024/2/24 22:03
 * @description: FLinkDemo
 */
public class FlinkWordCount {
    public static void main(String[] args) throws Exception {
        //初始化环境
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        DataSource<String> dataSource = env.readTextFile("input/words.txt");
        //对每行进行分词,并转换成元组类型
        FlatMapOperator<String, Tuple2<String, Long>> wordAndOneTuple = dataSource.flatMap((String line, Collector<Tuple2<String, Long>> col) -> {
            String[] words = line.split(" ");
            for (String word : words) {
                col.collect(Tuple2.of(word, 1L));
            }

        }) .returns(Types.TUPLE(Types.STRING,Types.LONG));//returns 方法指定的返回数据类型Tuple2,就是 Flink 自带的二元组数据类型。
        //按照第一个字段进行聚合
        UnsortedGrouping<Tuple2<String, Long>> group = wordAndOneTuple.groupBy(0);
        //按照第二个字段进行求和
        AggregateOperator<Tuple2<String, Long>> sum = group.sum(1);
        sum.print();

    }
}

java代码(流处理)

package FlinkDemo;

import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
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;

/**
 * @Title: BoundedStreamWordCount
 * @Author lizhe
 * @Package FlinkDemo
 * @Date 2024/2/25 18:57
 * @description: BoundedStreamWordCount
 */
public class BoundedStreamWordCount {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
        DataStreamSource<String> streamSource = env.readTextFile("input/words.txt");
        SingleOutputStreamOperator<Tuple2<String, Long>> singleOutputStreamOperator = streamSource.flatMap((String line, Collector<Tuple2<String, Long>> col) -> {
            String[] words = line.split(" ");
            for (String word : words) {
                col.collect(Tuple2.of(word, 1L));
            }
        }).returns(Types.TUPLE(Types.STRING, Types.LONG));
        KeyedStream<Tuple2<String, Long>, Object> keyedStream = singleOutputStreamOperator.keyBy(new KeySelector<Tuple2<String, Long>, Object>() {
            @Override
            public Object getKey(Tuple2<String, Long> stringLongTuple2) throws Exception {
                return stringLongTuple2.f0;
            }
        });
        SingleOutputStreamOperator<Tuple2<String, Long>> sum = keyedStream.sum(1);
        sum.print();
        env.execute();

    }

}

输出结果:线程号>(单词,个数)

7> (flink,1)
8> (hadoop,1)
3> (hello,1)
5> (world,1)
3> (hello,2)
3> (hello,3)

监听socket流

  1. 启动netcat

    nc -lk 7777
    
  2. 编写代码

    package FlinkDemo;
    
    import org.apache.flink.api.common.typeinfo.Types;
    import org.apache.flink.api.java.ExecutionEnvironment;
    import org.apache.flink.api.java.functions.KeySelector;
    import org.apache.flink.api.java.tuple.Tuple2;
    import org.apache.flink.streaming.api.datastream.DataStreamSource;
    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;
    
    /**
     * @Title: StreamWordCount
     * @Author lizhe
     * @Package FlinkDemo
     * @Date 2024/2/25 20:34
     * @description: StreamWordCount
     */
    public class StreamWordCount {
        public static void main(String[] args) throws Exception {
            StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
            DataStreamSource<String> dataStreamSource = env.socketTextStream("192.168.132.101", 7777);
            SingleOutputStreamOperator<Tuple2<String, Long>> singleOutputStreamOperator = dataStreamSource.flatMap((String line, Collector<Tuple2<String, Long>> col) -> {
                String[] words = line.split(" ");
                for (String word : words) {
                    col.collect(Tuple2.of(word, 1L));
                }
            }).returns(Types.TUPLE(Types.STRING, Types.LONG));
            KeyedStream<Tuple2<String, Long>, Object> keyedStream = singleOutputStreamOperator.keyBy(new KeySelector<Tuple2<String, Long>, Object>() {
                @Override
                public Object getKey(Tuple2<String, Long> stringLongTuple2) throws Exception {
                    return stringLongTuple2.f0;
                }
            });
            SingleOutputStreamOperator<Tuple2<String, Long>> sum = keyedStream.sum(1);
            sum.print();
            env.execute();
    
        }
    }
    
    
  3. netcat发送

    在这里插入图片描述

  4. 查看结果

    3> (hello,1)
    7> (flink,1)
    5> (world,1)
    3> (hello,2)
    3> (hello,3)
    8> (hadoop,1)
    

3、flink快速部署

fink提交作业和执行任务需要:客户端(Client)、作业管理器(JobManager)、任务管理器(TaskManager)

JobManager对作业进行调度管理,把任务分发给TaskManager,TaskManager对数据进行处理。
在这里插入图片描述

  1. 本地启动

下载flink,地址:https://flink.apache.org/downloads/#apache-flink-downloads

解压后直接启动

[root@hadoop101 soft] cd /export/soft/flink-1.13.0
[root@hadoop101 flink-1.13.0] bin/start-cluster.sh
Starting cluster.
Starting standalonesession daemon on host hadoop101.
Starting taskexecutor daemon on host hadoop101.

访问webUI:http://hadoop101:8081/
在这里插入图片描述
关闭命令

bin/stop-cluster.sh
  1. 集群启动

    修改flink下的conf/flink-conf.yaml,修改jobmanager.rpc.address:hadoop100,并修改works文件,其中添加hadoop101,hadoop102
    在这里插入图片描述
    在这里插入图片描述

  2. 在master节点输入启动命令,得到

    [root@hadoop100 flink-1.13.0]# bin/start-cluster.sh
    Starting cluster.
    Starting standalonesession daemon on host hadoop100.
    Starting taskexecutor daemon on host hadoop101.
    Starting taskexecutor daemon on host hadoop102.
    
    

    集群停止同本地启动。

  3. 向集群提交作业

    程序使用maven打包,并提交到web端
    在这里插入图片描述
    启动netcat,并在netcat中发送数据
    在这里插入图片描述
    在这里插入图片描述

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
尚硅谷大数据Flink(Scala版)文档是一份详细介绍Flink框架的文档。Flink是一种用于流处理和批处理的分布式数据处理引擎,可以实时且高效地处理大规模数据。该文档以Scala语言为基础,介绍了Flink在实时处理、窗口计算、水印机制、状态管理、故障恢复等方面的重要概念和使用方法。 文档首先介绍了Flink的基本概念和架构,包括数据流和任务图的概念,以及Flink的分布式部署模式。然后,文档详细介绍了Flink的核心功能和特性,如事件时间处理、窗口计算、状态管理等。 在事件时间处理方面,文档介绍了Flink如何处理流式数据中的事件时间,并解释了水印机制的原理和使用方法。水印机制能够确保事件在流式处理中的有序性和准确性,提高了数据处理的可靠性。 窗口计算是Flink的一个重要功能,文档详细介绍了滚动窗口、滑动窗口和会话窗口等不同类型的窗口,并给出了相应的示例代码,帮助读者理解窗口计算的概念和使用方式。 此外,文档还介绍了Flink的状态管理和故障恢复机制。Flink通过内部状态存储机制来维护流处理中的状态信息,并提供了容错机制来处理节点故障和故障恢复。 最后,文档提供了大量的实例代码和案例分析,帮助读者更好地理解和应用Flink框架。读者可以通过这些示例代码来学习和实践Flink的各种功能和特性。 总之,尚硅谷大数据Flink(Scala版)文档是一份全面而详细的Flink框架学习资料,对于想要深入了解和使用Flink的开发者来说是一份非常有价值的文档。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值