Flink笔记

本文介绍了Apache Flink的事件驱动架构、流批一体特性,展示了如何通过Java API实现批处理WordCount和流处理WordCount实例,以及YARN模式下的Session-Cluster和Per-Job-Cluster部署教程。
摘要由CSDN通过智能技术生成

Flink 简介和特点

简介:

Flink 项目的理念是:“Apache Flink 是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架”。

Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink 被设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算。

特点:

事件驱动型(Event-driven)

流与批的世界观

分层 api

快速上手

搭建 maven 工程 FlinkTutorial

pom文件添加依赖:

<dependencies>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-java</artifactId>
        <version>1.10.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_2.12</artifactId>
        <version>1.10.1</version>
    </dependency>
</dependencies>

批处理wordcount

package com.jxtele;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;

/**
 * @author liuhui
 * @version 1.0
 * @description: TODO 批处理 wordcount
 * @date 2021/11/10 3:39 下午
 */
public class WordCount {
    public static void main(String[] args) throws Exception {
        // 创建执行环境
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        // 从文件中读取数据
        String inputPath = "/Users/liuhui/Documents/bigData/idea/workspace/FlinkTutorial/src/main/resources/hello.txt";
        DataSet<String> inputDataSet = env.readTextFile(inputPath);
        // 空格分词打散之后,对单词进行 groupby 分组,然后用 sum 进行聚合
        DataSet<Tuple2<String, Integer>> wordCountDataSet =
                inputDataSet.flatMap(new MyFlatMapper())
                        .groupBy(0) //安装第一个位置的word 分组
                        .sum(1);//将第二个位置的数据求和
        // 打印输出
        wordCountDataSet.print();
    }

    public static class MyFlatMapper implements FlatMapFunction<String, Tuple2<String,
                Integer>> {
        public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws
                Exception {
            String[] words = value.split(" ");
            for (String word : words) {
                out.collect(new Tuple2<String, Integer>(word, 1));
            }
        }
    }
}

流处理wordcount

package com.jxtele;

import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

/**
 * @author liuhui
 * @version 1.0
 * @description: TODO  流处理 wordcount
 * @date 2021/11/10 3:44 下午
 */
public class StreamWordCount {
    public static void main(String[] args) throws Exception{
        //创建流处理执行环境
        StreamExecutionEnvironment env =
                StreamExecutionEnvironment.getExecutionEnvironment();
//        // 从文件中读取数据
//        String inputPath = "/Users/liuhui/Documents/bigData/idea/workspace/FlinkTutorial/src/main/resources/hello.txt";
//        DataStream<String> inputDataStream = env.readTextFile(inputPath);

        DataStream<String> inputDataStream = env.socketTextStream("hadoop102", 7777);
        DataStream<Tuple2<String, Integer>> wordCountDataStream = inputDataStream
                .flatMap( new WordCount.MyFlatMapper())
                .keyBy(0)
                .sum(1);
        wordCountDataStream.print().setParallelism(1);
        env.execute();
    }
}

注意 测试方法:利用netcat 模拟流式输入 ,在 linux 系统中用 netcat 命令进行发送测试。

没有netcat命令可安装

##安装
[root@hadoop102 hadoop]# yum install -y nc
##使用
[root@hadoop102 hadoop]# nc -lk 7777

在这里插入图片描述

Flink部署

Yarn 模式

(1)Session-cluster模式:

Session-Cluster 模式需要先启动集群,然后再提交作业,接着会向 yarn 申请一块空间后,资源永远保持不变。如果资源满了,下一个作业就无法提交,只能等到yarn 中的其中一个作业执行完成后,释放了资源,下个作业才会正常提交。所有作业共享 Dispatcher 和 ResourceManager;共享资源;适合规模小执行时间短的作业。在 yarn 中初始化一个 flink 集群,开辟指定的资源,以后提交任务都向这里提交。这个 flink 集群会常驻在 yarn 集群中,除非手工停止。

(2)Per-Job-Cluster 模式:

在这里插入图片描述

一个 Job 会对应一个集群,每提交一个作业会根据自身的情况,都会单独向 yarn申请资源,直到作业执行完成,一个作业的失败与否并不会影响下一个作业的正常提交和运行。独享 Dispatcher 和 ResourceManager,按需接受资源申请;适合规模大长时间运行的作业。每次提交都会创建一个新的 flink 集群,任务之间互相独立,互不影响,方便管理。任务执行完成之后创建的集群也会消失。

Session-cluster模式

(1)启动hadoop集群

[hadoop@hadoop102 ~]$ myhadoop.sh start
 =================== 启动 hadoop 集群 ===================
 --------------- 启动 hdfs ---------------
Starting namenodes on [hadoop102]
Starting datanodes
Starting secondary namenodes [hadoop104]
 --------------- 启动 yarn ---------------
Starting resourcemanager
Starting nodemanagers
 --------------- 启动 historyserver ---------------

(2)安装flink,,启动flink, 启动 yarn-session

##下载,解压flink
[hadoop@hadoop102 module]$ ls
apache-hive-3.1.2-bin            hadoop-3.1.3  jdk1.8.0_212  sqoop
flink-1.10.1-bin-scala_2.12.tgz  hbase-2.0.5   kafka         zookeeper-3.4.5-cdh5.12.1
[hadoop@hadoop102 module]$ tar zxvf flink-1.10.1-bin-scala_2.12.tgz 
[hadoop@hadoop102 software]$ cd ../module/
[hadoop@hadoop102 module]$ cd flink-1.10.1/
[hadoop@hadoop102 flink-1.10.1]$ ls
bin  conf  examples  lib  LICENSE  licenses  log  NOTICE  opt  plugins  README.txt
##修改 flink/conf/flink-conf.yaml 文件:
[hadoop@hadoop102 flink-1.10.1]$ cd conf/
[hadoop@hadoop102 conf]$ vi flink-conf.yaml 
## 修改 /conf/slaves 文件:
[hadoop@hadoop102 conf]$ vi slaves 
hadoop103
hadoop104
##分发给另外两台机器
[hadoop@hadoop102 module]$ xsync flink-1.10.1/
## 启动flink
[hadoop@hadoop102 bin]$ ./start-cluster.sh 
Starting cluster.
Starting standalonesession daemon on host hadoop102.
Starting taskexecutor daemon on host hadoop103.
Starting taskexecutor daemon on host hadoop104.
##启动 yarn-session
[hadoop@hadoop102 bin]$ ./yarn-session.sh -n 2 -s 2 -jm 1024 -tm 1024 -nm test -d

其中:

-n(–container):TaskManager 的数量。

-s(–slots): 每个 TaskManager 的 slot 数量,默认一个 slot 一个 core,默认每个

taskmanager 的 slot 的个数为 1,有时可以多一些 taskmanager,做冗余。

-jm:JobManager 的内存(单位 MB)。

-tm:每个 taskmanager 的内存(单位 MB)。

-nm:yarn 的 appName(现在 yarn 的 ui 上的名字)。

-d:后台执行。

(3)执行任务

[hadoop@hadoop102 bin]$ ./flink run -c com.jxtele.StreamWordCount /opt/software/FlinkTutorial-1.0-SNAPSHOT.jar 
Job has been submitted with JobID 8b47909eeb5b398bb3d3b7aa492d114a

(4)去yarn控制台查看任务状态

在这里插入图片描述

(5)测试

在这里插入图片描述

(6)取消yarn-session

[hadoop@hadoop102 bin]$ yarn application --kill application_1636546149277_0001
2021-11-10 23:43:30,001 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.56.103:8032
Application application_1636546149277_0001 has already finished 
[hadoop@hadoop102 bin]$ 
Per Job Cluster模式

(1)启动hadoop集群(略)

(2)不启动 yarn-session,直接执行job

[hadoop@hadoop102 bin]$ ./flink run -m yarn-cluster -c com.jxtele.StreamWordCount /opt/software/FlinkTutorial-1.0-SNAPSHOT.jar 
2021-11-10 23:49:00,737 WARN  org.apache.flink.yarn.cli.FlinkYarnSessionCli                 - The configuration directory ('/opt/module/flink-1.10.1/conf') already contains a LOG4J config file.If you want to use logback, then please delete or rename the log configuration file.
2021-11-10 23:49:00,737 WARN  org.apache.flink.yarn.cli.FlinkYarnSessionCli                 - The configuration directory ('/opt/module/flink-1.10.1/conf') already contains a LOG4J config file.If you want to use logback, then please delete or rename the log configuration file.
2021-11-10 23:49:01,120 INFO  org.apache.hadoop.yarn.client.RMProxy                         - Connecting to ResourceManager at hadoop103/192.168.56.103:8032
2021-11-10 23:49:01,280 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - No path for the flink jar passed. Using the location of class org.apache.flink.yarn.YarnClusterDescriptor to locate the jar
2021-11-10 23:49:01,422 WARN  org.apache.flink.yarn.YarnClusterDescriptor                   - Neither the HADOOP_CONF_DIR nor the YARN_CONF_DIR environment variable is set. The Flink YARN Client needs one of these to be set to properly load the Hadoop configuration for accessing YARN.
2021-11-10 23:49:01,476 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Cluster specification: ClusterSpecification{masterMemoryMB=1024, taskManagerMemoryMB=1728, slotsPerTaskManager=1}
2021-11-10 23:49:05,154 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Submitting application master application_1636546149277_0002
2021-11-10 23:49:05,201 INFO  org.apache.hadoop.yarn.client.api.impl.YarnClientImpl         - Submitted application application_1636546149277_0002
2021-11-10 23:49:05,201 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Waiting for the cluster to be allocated
2021-11-10 23:49:05,212 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Deploying cluster, current state ACCEPTED
2021-11-10 23:49:13,816 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - YARN application has been deployed successfully.
2021-11-10 23:49:13,816 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Found Web Interface hadoop104:33005 of application 'application_1636546149277_0002'.
Job has been submitted with JobID 5fba182fcf6d4b78aa4ea4f0d1957122

(3)测试

在这里插入图片描述

在这里插入图片描述

附尚硅谷学习资料: 链接: https://pan.baidu.com/s/1BrnKgO59vXq2Cv0uwc9G2Q 密码:
mvqg

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值