2024年大数据最新01-Flink安装部署及入门案例(仅供学习)(2),华为大神花费5个月打造的这份714页学习笔记系列

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

# node1和node2上执行
/export/server/flink-ha/bin/jobmanager.sh start

# node1和node2、node3执行
/export/server/flink-ha/bin/taskmanager.sh start  # 每台机器执行

在这里插入图片描述

08-Flink on YARN之运行流程

​ 在一个企业中,为了最大化的利用集群资源,一般都会在一个集群中同时运行多种类型的Workload,因此 Flink 也支持在 Yarn 集群运行。

为什么使用Flink on Yarn或Spark on Yarn?

  • 1)、Yarn的资源可以按需使用,提高集群的资源利用率
  • 2)、Yarn的任务有优先级,根据优先级运行作业
  • 3)、基于Yarn调度系统,能够自动化地处理各个角色的 Failover(容错)

当应用程序(MR、Spark、Flink)运行在YARN集群上时,可以实现容灾恢复。

09-Flink on YARN之安装部署

Flink on YARN安装配置,此处考虑高可用HA配置,集群机器安装软件框架示意图:
在这里插入图片描述1)、关闭YARN的内存检查(node1操作)

# yarn-site.xml中添加配置
vim /export/server/hadoop/etc/hadoop/yarn-site.xml

添加如下内容:

<!-- 关闭yarn内存检查 -->
<property>
    <name>yarn.nodemanager.pmem-check-enabled</name>
    <value>false</value>
</property>
<property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
</property>	

2)、 配置Application最大的尝试次数(node1操作)

# yarn-site.xml中添加配置
vim /export/server/hadoop/etc/hadoop/yarn-site.xml

添加如下内容:

<property>
	<name>yarn.resourcemanager.am.max-attempts</name>
	<value>4</value>
</property>

3)、同步yarn-site.xml配置文件(node1操作)

cd /export/server/hadoop/etc/hadoop
scp -r yarn-site.xml root@node2:$PWD
scp -r yarn-site.xml root@node3:$PWD

4)、启动HDFS集群和YARN集群(node1操作)

[root@node1 ~]# start-dfs.sh

[root@node1 ~]# start-yarn.sh

5)、添加HADOOP_CONF_DIR环境变量(集群所有机器

# 添加环境变量
 vim /etc/profile

添加内容:

export HADOOP\_CONF\_DIR=/export/server/hadoop/etc/hadoop

环境变量生效

source /etc/profile

6)、上传软件及解压(node1操作)

[root@node1 ~]# cd /export/software/
[root@node1 software]# rz
	上传软件包:flink-1.13.1-bin-scala_2.11.tgz
	
[root@node1 software]# chmod u+x flink-1.13.1-bin-scala\_2.11.tgz
[root@node1 software]# tar -zxf flink-1.13.1-bin-scala\_2.11.tgz -C /export/server/ 

[root@node1 ~]# cd /export/server/
[root@node1 server]# chown -R root:root flink-1.13.1
[root@node1 server]# mv flink-1.13.1 flink-yarn

7)、将Flink依赖Hadoop 框架JAR包上传至/export/server/flink-yarn/lib目录
在这里插入图片描述

[root@node1 ~]# cd /export/server/flink-yarn/lib/
[root@node1 lib]# rz
	commons-cli-1.4.jar
	flink-shaded-hadoop-3-uber-3.1.1.7.2.1.0-327-9.0.jar

8)、配置HA高可用,依赖Zookeeper及重试次数(node1操作)

# 修改配置文件
vim /export/server/flink-yarn/conf/flink-conf.yaml

添加如下内容:

high-availability: zookeeper
high-availability.storageDir: hdfs://node1:8020/flink/yarn-ha/
high-availability.zookeeper.quorum: node1:2181,node2:2181,node3:2181
high-availability.zookeeper.path.root: /flink-yarn-ha
high-availability.cluster-id: /cluster_yarn

yarn.application-attempts: 10

9)、集群所有机器,同步分发Flink 安装包,便于任意机器提交运行Flink Job。

scp -r /export/server/flink-yarn root@node2:/export/server/

scp -r /export/server/flink-yarn root@node3:/export/server/

10)、启动Zookeeper集群(node1操作)

start-zk.sh

在Flink中执行应用有如下三种部署模式(Deployment Mode):
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/28d9a859154f9ba2e2fd90d2110735.png#pic_center

10-Flink on YARN之Session模式运行

Flink on YARN :Session 模式,表示多个Flink Job运行共享Standalone集群资源。

​ 先向Hadoop YARN申请资源,启动运行服务JobManager和TaskManagers,再提交多个Job到Flink 集群上执行。
在这里插入图片描述

  • 无论JobManager还是TaskManager,都是运行NodeManager Contanier容器中,以JVM 进程方式运行;
  • 提交每个Flink Job执行时,找的就是JobManager(AppMaster),找运行在YARN上应用ID;

Session 会话模式:arn-session.sh(开辟资源) + flink run(提交任务)

  • 第一、Hadoop YARN 运行Flink 集群,开辟资源,使用:yarn-session.sh
    • 在NodeManager上,启动容器Container运行JobManager和TaskManagers
  • 第二、提交Flink Job执行,使用:flink run

准备测试数据,测试运行批处理词频统计WordCount程序

[root@node1 ~]# vim /root/words.txt

添加数据

spark python spark hive spark hive
python spark hive spark python
mapreduce spark hadoop hdfs hadoop spark
hive mapreduce

数据文件上传

[root@node1 ~]# hdfs dfs -mkdir -p /wordcount/input/
[root@node1 ~]# hdfs dfs -put /root/words.txt /wordcount/input/

在这里插入图片描述

  • 第一步、在yarn上启动一个Flink会话,node1上执行以下命令
export HADOOP\_CLASSPATH=`hadoop classpath`
/export/server/flink-yarn/bin/yarn-session.sh -d -jm 1024 -tm 1024 -s 2

# 参数说明
-d:后台执行
-s:	每个TaskManager的slot数量
-jm:JobManager的内存(单位MB)
-tm:每个TaskManager容器的内存(默认值:MB)

# 提交flink 集群运行yarn后,提示信息
JobManager Web Interface: http://node1:44263
..................................................................
$ echo "stop" | ./bin/yarn-session.sh -id application_1633441564219_0001
If this should not be possible, then you can also kill Flink via YARN's web interface or via:
$ yarn application -kill application_1633441564219_0001

  • 第二步、查看UI界面,http://node1:8088/cluster/apps
    在这里插入图片描述 JobManager提供WEB UI:http://node1:8088/proxy/application_1614756061094_0002/#/overview

在这里插入图片描述
此时,没有任何TaskManager运行在容器Container中,需要等待有Flink Job提交执行时,才运行TaskManager。

  • 第三步、使用flink run提交任务
/export/server/flink-yarn/bin/flink run \
-t yarn-session \
-Dyarn.application.id=application_1652168669227_0001 \
/export/server/flink-yarn/examples/batch/WordCount.jar \
--input hdfs://node1:8020/wordcount/input/words.txt

在这里插入图片描述

  • 第四步、通过上方的ApplicationMaster可以进入Flink的管理界面
    在这里插入图片描述
  • 第五步、关闭yarn-session
# 优雅 停止应用,如果设置重启次数,即使停止应用,也会重启,一直到超过次数以后,才能真正停止应用
echo "stop" | /export/server/flink-yarn/bin/yarn-session.sh -id application_1633441564219_0001

# kill 命令,直接将运行在yarn应用杀死,毫不留情
yarn application -kill application_1633441564219_0001

11-Flink on YARN之PerJob模式运行

每个Flink Job提交运行到Hadoop YARN集群时,根据自身的情况,单独向YARN申请资源,直到作业执行完成

在这里插入图片描述

​ 在Hadoop YARN中,每次提交job都会创建一个新的Flink集群,任务之间相互独立,互不影响并且方便管理。任务执行完成之后创建的集群也会消失。

采用Job分离模式,每个Flink Job运行,都会申请资源,运行属于自己的Flink 集群

  • 第一步、直接提交job
export HADOOP\_CLASSPATH=`hadoop classpath`
/export/server/flink-yarn/bin/flink run \
-t yarn-per-job -m yarn-cluster \
-yjm 1024 -ytm 1024 -ys 1 \
/export/server/flink-yarn/examples/batch/WordCount.jar \
--input hdfs://node1:8020/wordcount/input

# 参数说明
-m:指定需要连接的jobmanager(主节点)地址,指定为 yarn-cluster,启动一个新的yarn-session
-yjm:JobManager可用内存,单位兆
-ytm:每个TM所在的Container可申请多少内存,单位兆
-ys:每个TM会有多少个Slot
-yd:分离模式(后台运行,不指定-yd, 终端会卡在提交的页面上)

在这里插入图片描述

  • 第二步、查看UI界面:http://node1:8088/cluster
    在这里插入图片描述
    提交Flink Job在Hadoop YARN执行时,最后给出如下错误警告:
    在这里插入图片描述
解决办法: 在 flink 配置文件里 flink-conf.yaml设置
	classloader.check-leaked-classloader: false

12-Flink on YARN之Application模式运行

Flink 1.11 引入了一种新的部署模式,即 Application 模式,目前可以支持基于 Hadoop YARN 和 Kubernetes 的 Application 模式。

# 1、Session 模式:
	所有作业Job共享1个集群资源,隔离性差,JM 负载瓶颈,每个Job中main 方法在客户端执行。

# 2、Per-Job 模式:
	每个作业单独启动1个集群,隔离性好,JM 负载均衡,Job作业main 方法在客户端执行。

在这里插入图片描述 以上两种模式,main方法都是在客户端执行,需要获取 flink 运行时所需的依赖项,并生成 JobGraph,提交到集群的操作都会在实时平台所在的机器上执行,那么将会给服务器造成很大的压力。此外,提交任务的时候会把本地flink的所有jar包先上传到hdfs上相应的临时目录,带来大量的网络的开销,所以如果任务特别多的情况下,平台的吞吐量将会直线下降。

Application 模式下,用户程序的 main 方法将在集群中运行,用户将程序逻辑和依赖打包进一个可执行的 jar 包里,集群的入口程序 (ApplicationClusterEntryPoint) 负责调用其中的 main 方法来生成 JobGraph。
在这里插入图片描述

Application 模式为每个提交的应用程序创建一个集群,并在应用程序完成时终止。Application 模式在不同应用之间提供了资源隔离和负载平衡保证。在特定一个应用程序上,JobManager 执行 main 可以[节省所需的 CPU 周期],还可以[节省本地下载依赖项所需的带宽]。
Application 模式==使用 bin/flink run-application提交作业,本质上是Session和Per-Job模式的折衷。

  • 通过 -t 指定部署环境,目前支持部署在 yarn 上(-t yarn-application) 和 k8s 上(-t kubernetes-application);
  • 通过 -D 参数指定通用的运行配置,比如 jobmanager/taskmanager 内存、checkpoint 时间间隔等。
export HADOOP\_CLASSPATH=`hadoop classpath`

/export/server/flink-yarn/bin/flink run-application \
-t yarn-application \
-Djobmanager.memory.process.size=1024m \
-Dtaskmanager.memory.process.size=1024m \
-Dtaskmanager.numberOfTaskSlots=1 \
/export/server/flink-yarn/examples/batch/WordCount.jar \
--input hdfs://node1:8020/wordcount/input


由于MAIN方法在JobManager(也就是NodeManager的容器Container)中执行,当Flink Job执行完成以后,启动MRJobHistoryServer历史服务器,查看AppMaster日志信息。

# node1 上启动历史服务
[root@node1 ~]# mr-jobhistory-daemon.sh start historyserver 

第二步、查看UI界面:http://node1:8088/cluster
在这里插入图片描述

测试Flink Job不同运行模式时,注意事项如下
在这里插入图片描述

第三部分:Flink入门案例

13-Flink入门案例之编程模型

基于Flink计算引擎,分别实现批处理(Batch)和流计算(Streaming )中:词频统计WordCount。

第一点:Flink API== ,提供四个层次API,越在下面API,越复杂和灵活;越在上面API,使用越简单和抽象
在这里插入图片描述
第二点:编程模型==,无论编写批处理还是流计算程序,分为三个部分:Data Source、Transformations和Data Sink

# 第一步、从数据源DataSource获取数据
	流计算:DataStream
	批处理:DataSet

# 第二步、对数据进行转换处理
	
# 第三步、结果数据输出DataSink

无论批处理Batch,还是流计算Stream,首先需要创建执行环境ExecutionEnvironment对象,类似Spark中SparkSession或者SparkContext

在这里插入图片描述
创建整个Flink基础课程Maven Project,设置MAVEN Repository仓库目录及Maven安装目录
在这里插入图片描述
约定:每天创建一个Maven Module](),创建第1天Maven Module,模块结构:
在这里插入图片描述
POM文件添加如下内容:

    <repositories>
        <repository>
            <id>nexus-aliyun</id>
            <name>Nexus aliyun</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </repository>
        <repository>
            <id>central_maven</id>
            <name>central maven</name>
            <url>https://repo1.maven.org/maven2</url>
        </repository>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
        <repository>
            <id>apache.snapshots</id>
            <name>Apache Development Snapshot Repository</name>
            <url>https://repository.apache.org/content/repositories/snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>1.13.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_2.11</artifactId>
            <version>1.13.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.11</artifactId>
            <version>1.13.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-runtime-web_2.11</artifactId>
            <version>1.13.1</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.7</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.7</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
            <scope>runtime</scope>
        </dependency>

    </dependencies>

    <build>
        <sourceDirectory>src/main/java</sourceDirectory>
        <testSourceDirectory>src/test/java</testSourceDirectory>
        <plugins>
            <!-- 编译插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <!--<encoding>${project.build.sourceEncoding}</encoding>-->
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.18.1</version>
                <configuration>
                    <useFile>false</useFile>
                    <disableXmlReport>true</disableXmlReport>
                    <includes>
                        <include>**/*Test.*</include>
                        <include>**/*Suite.*</include>
                    </includes>
                </configuration>
            </plugin>
            <!-- 打jar包插件(会包含所有依赖) -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <!--
 zip -d learn\_spark.jar META-INF/\*.RSA META-INF/\*.DSA META-INF/\*.SF -->
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                 
                               </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

日志配置文件:log4j.properties

# This affects logging for both user code and Flink
log4j.rootLogger=INFO, console

# Uncomment this if you want to _only_ change Flink's logging
#log4j.logger.org.apache.flink=INFO

# The following lines keep the log level of common libraries/connectors on
# log level INFO. The root logger does not override this. You have to manually
# change the log levels here.
log4j.logger.akka=INFO
log4j.logger.org.apache.kafka=INFO
log4j.logger.org.apache.hadoop=INFO
log4j.logger.org.apache.zookeeper=INFO

# Log all infos to the console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n

# Suppress the irrelevant (wrong) warnings from the Netty channel handler
log4j.logger.org.apache.flink.shaded.akka.org.jboss.netty.channel.DefaultChannelPipeline=ERROR, console

14-Flink入门案例之WordCount【批处理】

首先,基于Flink计算引擎,[实现离线批处理Batch:从文本文件读取数据,词频统计]。
在这里插入图片描述
批处理时词频统计思路如下伪代码所示:

					spark flink flink flink spark
								|
								| flatMap
								|
			 3-1. 分割单词 spark, flink, flink, flink, spark
			 					|
			                    | map
			                    |
			 3-2. 转换二元组 (spark, 1) (flink, 1) (flink, 1) (flink, 1) (spark, 1)
			 					|
			                    | groupBy(0)
			                    |
			 3-3. 按照单词分组
			        spark -> [(spark, 1) (spark, 1)]
			        flink -> [(flink, 1) (flink, 1) (flink, 1) ]
			        			|
			                    |sum(1)
			                    |
			 3-4. 组内数据求和,第二元素值累加
			        spark -> 1 + 1 = 2
			        flink -> 1 + 1 + 1 =3

基于Flink编写批处理或流计算程序步骤如下:(5个步骤)

1.执行环境-env
2.数据源-source
3.数据转换-transformation
4.数据接收器-sink
5.触发执行-execute

编写批处理词频统计:BatchWordCount,创建Java类

package cn.itqzd.flink.batch;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
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.MapOperator;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;

/\*\*
 \* 使用Flink计算引擎实现离线批处理:词频统计WordCount
 \* 1.执行环境-env
 \* 2.数据源-source
 \* 3.数据转换-transformation
 \* 4.数据接收器-sink
 \* 5.触发执行-execute
 \*/
                                            public class BatchWordCount {

	public static void main(String[] args) throws Exception {
		// 1.执行环境-env
		ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment() ;

		// 2.数据源-source
		DataSource<String> inputDataSet = env.readTextFile("datas/words.txt");

		// 3.数据转换-transformation
		/\*
 spark flink spark hbase spark
 |flatMap
 分割单词: spark, flink, spark
 |map
 转换二元组:(spark, 1) (flink, 1) (spark, 1), TODO:Flink Java API中提供元组类Tuple
 |groupBy(0)
 分组:spark -> [(spark, 1), (spark, 1)] flink -> [(flink, 1)]
 |sum(1)
 求和:spark -> 1 + 1 = 2, flink = 1
 \*/
		// 3-1. 分割单词
		FlatMapOperator<String, String> wordDataSet = inputDataSet.flatMap(new FlatMapFunction<String, String>() {
			@Override
			public void flatMap(String line, Collector<String> out) throws Exception {
				String[] words = line.trim().split("\\s+");
				for (String word : words) {
					out.collect(word);
				}
			}
		});

		// 3-2. 转换二元组
		MapOperator<String, Tuple2<String, Integer>> tupleDataSet = wordDataSet.map(new MapFunction<String, Tuple2<String, Integer>>() {
			@Override
			public Tuple2<String, Integer> map(String word) throws Exception {
				return Tuple2.of(word, 1);
			}
		});

		// 3-3. 分组及求和, TODO: 当数据类型为元组时,可以使用下标指定元素,从0开始
		AggregateOperator<Tuple2<String, Integer>> resultDataSet = tupleDataSet.groupBy(0).sum(1);

		// 4.数据接收器-sink
		resultDataSet.print();

		// 5.触发执行-execute, TODO:批处理时,无需触发,流计算必须触发执行
		//env.execute("BatchWordCount") ;
	}

}


15-Flink入门案例之WordCount【流计算】

编写Flink程序,接收TCP Socket的单词数据,并以空格进行单词拆分,分组统计单词个数
在这里插入图片描述

package cn.itqzd.flink.stream;

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

/\*\*
 \* 使用Flink计算引擎实现实时流计算:词频统计WordCount,从TCP Socket消费数据,结果打印控制台。
 \* 1.执行环境-env
 \* 2.数据源-source
 \* 3.数据转换-transformation
 \* 4.数据接收器-sink
 \* 5.触发执行-execute
 \*/
public class StreamWordCount {

	public static void main(String[] args) throws Exception {
		// 1.执行环境-env
		StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

		// 2.数据源-source
		DataStreamSource<String> inputDataStream = env.socketTextStream("node1", 9999);

		// 3.数据转换-transformation
		SingleOutputStreamOperator<Tuple2<String, Integer>> resultDataStream = inputDataStream
			// 3-1. 分割单词
			.flatMap(new FlatMapFunction<String, String>() {
				@Override
				public void flatMap(String line, Collector<String> out) throws Exception {
					for (String word : line.trim().split("\\s+")) {
						out.collect(word);
					}
				}
			})
			// 3-2. 转换二元组
			.map(new MapFunction<String, Tuple2<String, Integer>>() {
				@Override
				public Tuple2<String, Integer> map(String word) throws Exception {
					return new Tuple2<>(word, 1);
				}
			})
			// 3-3. 分组和组内求和
			.keyBy(0).sum(1);

		// 4.数据接收器-sink
		resultDataStream.print();

		// 5.触发执行-execute
		env.execute("StreamWordCount");
	}

}

修改流计算词频统计,从本地系统文本文件加载数据,处理数据,设置执行模式为:Batch

package cn.itqzd.flink.execution;

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

/\*\*
 \* 使用Flink计算引擎实现离线批处理:词频统计WordCount,TODO:从Flink 1.12开始,流批一体化,API统一,设置执行模式即可
 \* 1.执行环境-env
 \* 2.数据源-source
 \* 3.数据转换-transformation
 \* 4.数据接收器-sink
 \* 5.触发执行-execute
 \*/
public class ExecutionWordCount {

	public static void main(String[] args) throws Exception {
		// 1.执行环境-env
		StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
		// TODO: 设置执行模式execute-mode为Batch批处理
		env.setRuntimeMode(RuntimeExecutionMode.BATCH) ;

		// 2.数据源-source
		DataStreamSource<String> inputDataStream = env.readTextFile("datas/words.txt") ;

		// 3.数据转换-transformation
		SingleOutputStreamOperator<Tuple2<String, Integer>> resultDataStream = inputDataStream
			// 3-1. 分割单词
			.flatMap(new FlatMapFunction<String, String>() {
				@Override
				public void flatMap(String line, Collector<String> out) throws Exception {
					for (String word : line.trim().split("\\s+")) {
						out.collect(word);
					}
				}
			})
			// 3-2. 转换二元组
			.map(new MapFunction<String, Tuple2<String, Integer>>() {
				@Override
				public Tuple2<String, Integer> map(String word) throws Exception {
					return new Tuple2<>(word, 1);
				}
			})
			// 3-3. 分组和组内求和
			.keyBy(0).sum(1);

		// 4.数据接收器-sink
		resultDataStream.print();

		// 5.触发执行-execute
		env.execute("StreamWordCount");
	}

}

修改流式程序,从应用程序传递参数:host和port,使用Flink中工具类:ParameterTool,解析参数,代码如下所示:
在这里插入图片描述

package cn.itqzd.flink;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

/\*\*
 \* 使用Flink计算引擎实现实时流计算:词频统计WordCount,从TCP Socket消费数据,结果打印控制台。
 \* 1.执行环境-env
 \* 2.数据源-source
 \* 3.数据转换-transformation
 \* 4.数据接收器-sink
 \* 5.触发执行-execute
 \*/
public class WordCount {

	public static void main(String[] args) throws Exception {

		// TODO: 构建参数解析工具类实例对象
		ParameterTool parameterTool = ParameterTool.fromArgs(args);
		if(parameterTool.getNumberOfParameters() != 2){
			System.out.println("Usage: WordCount --host <hostname> --port <port> .........");
			System.exit(-1);
		}
		final String host = parameterTool.get("host") ; // 直接传递参数,获取值
		final int port = parameterTool.getInt("port", 9999) ; // 如果没有参数,使用默认值

		// 1.执行环境-env
		StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
		env.setParallelism(2) ; // 设置并行度

		// 2.数据源-source
		DataStreamSource<String> inputDataStream = env.socketTextStream(host, port);

		// 3.数据转换-transformation
		SingleOutputStreamOperator<Tuple2<String, Integer>> resultDataStream = inputDataStream
			// 3-1. 分割单词
			.flatMap(new FlatMapFunction<String, String>() {
				@Override
				public void flatMap(String line, Collector<String> out) throws Exception {
					for (String word : line.trim().split("\\s+")) {
						out.collect(word);
					}
				}
			})
			// 3-2. 转换二元组
			.map(new MapFunction<String, Tuple2<String, Integer>>() {
				@Override
				public Tuple2<String, Integer> map(String word) throws Exception {
					return new Tuple2<>(word, 1);
				}
			})
			// 3-3. 分组和组内求和
			.keyBy(0).sum(1);

		// 4.数据接收器-sink
		resultDataStream.print();

		// 5.触发执行-execute
		env.execute("StreamWordCount");
	}

}


在这里插入图片描述

16-Flink入门案例之打包部署运行

Flink 程序提交运行方式有两种:

  • 1)、方式一:以命令行的方式提交:flink run
  • 2)、方式二:以UI界面方式提交
命令行提交

命令行方式提交Flink应用,可以运行至Standalone集群和YARN集群,以运行YARN Job分离模式为例演示提交Flink应用程序。

  • 1)、应用程序编译打包:flink-day01-1.0.0.jar,不包含其他依赖jar包,删除log4j配置文件。
  • 2)、启动HDFS集群和YARN集群
# 在node1上启动服务
start-zk.sh

start-dfs.sh

start-yarn.sh

mr-jobhistory-daemon.sh start historyserver 

  • 3)、上传作业jar包到linux服务器
cd /export/server/flink-yarn/
rz

  • 4)、提交运行
/export/server/flink-yarn/bin/flink run \
-t yarn-per-job \
-m yarn-cluster \
-yjm 1024 -ytm 1024 -ys 1 \
--class cn.itqzd.flink.WordCount \
/export/server/flink-yarn/flink-start-1.0-SNAPSHOT.jar \
--host node1 --port 9999

  • 5)、第三步、查看任务运行概述
    http://ndoe1:8088/

界面UI提交
UI 方式提交,此种方式提交应用,可以提交Flink Job在Flink Standalone集群和YARN Session会话模式下,此处以YARN Session为例演示。

  • 1)、第一步、启动HDFS集群和YARN集群
# 在node1上启动服务
start-zk.sh

start-dfs.sh

start-yarn.sh

  • 2)、第二步、启动YARN Session

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 2)、启动HDFS集群和YARN集群
# 在node1上启动服务
start-zk.sh

start-dfs.sh

start-yarn.sh

mr-jobhistory-daemon.sh start historyserver 

  • 3)、上传作业jar包到linux服务器
cd /export/server/flink-yarn/
rz

  • 4)、提交运行
/export/server/flink-yarn/bin/flink run \
-t yarn-per-job \
-m yarn-cluster \
-yjm 1024 -ytm 1024 -ys 1 \
--class cn.itqzd.flink.WordCount \
/export/server/flink-yarn/flink-start-1.0-SNAPSHOT.jar \
--host node1 --port 9999

  • 5)、第三步、查看任务运行概述
    http://ndoe1:8088/

界面UI提交
UI 方式提交,此种方式提交应用,可以提交Flink Job在Flink Standalone集群和YARN Session会话模式下,此处以YARN Session为例演示。

  • 1)、第一步、启动HDFS集群和YARN集群
# 在node1上启动服务
start-zk.sh

start-dfs.sh

start-yarn.sh

  • 2)、第二步、启动YARN Session

[外链图片转存中…(img-fWSczjnC-1715607750103)]
[外链图片转存中…(img-TxahEb38-1715607750103)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值