Flink基础学习(二)

Flink基础学习

1.入门案例

1.1Flink 批处理程序的一般流程

1) 获取 Flink 批处理执行环境

2) 构建 source

3) 数据处理

4) 构建 sink


1.2 示例

编写 Flink 程序,用来统计单词的数量。

1.3 步骤

1) IDEA 创建项目

2) 导入 Flink 所需的 Maven 依赖

3) 创建 scala 单例对象,添加 main 方法

4) 获取 Flink 批处理运行环境

5) 构建一个 collection 源

6) 使用 flink 操作进行单词统计

7) 打印


1.4 实现

1) 在 IDEA 中创建 flink-base 项目

2) 导入 Flink Maven 依赖

3) 分别在 main 和 test 目录创建 scala 文件夹

4) 添加 main 方法

5) 获取批处理运行环境

val env = ExecutionEnvironment.getExecutionEnvironment 

6) 构建一个 collection 源

val wordDataSet = env.fromCollection {
List("hadoop hive spark", "flink mapreduce hadoop hive", "flume spark spark hive")
 }

7) 导入 Flink 隐式参数

import org.apache.flink.api.scala._ 

8) 使用 flatMap 操作将字符串进行切割后扁平化

val words: DataSet[String] = wordDataSet.flatMap(_.split(" ")) 

9) 使用 map 操作将单词转换为,(单词,数量)的元组

val wordNumDataSet: DataSet[(String, Int)] = words.map(_ -> 1) 

10) 使用 groupBy 操作按照第一个字段进行分组

val wordGroupDataSet: GroupedDataSet[(String, Int)] = wordNumDataSet.groupBy(0) 

11) 使用 sum 操作进行分组累加统计

val wordCountDataSet: AggregateDataSet[(String, Int)] = wordGroupDataSet.sum(1) 

12) 打印

wordCountDataSet.print() 

13) 运行测试


1.5 将程序打包,提交到 yarn

上传 jar 包到服务器上,然后执行程序:

bin/flink run -m yarn-cluster -yn 2 /export/servers/flink-1.7.2/jar/day01-1.0-SNAPSHOT.jar cn.czxy.batch.BatchWordCount 

在 yarn 的 8088 页面可以观察到提交的程序:
在这里插入图片描述

2. 输入数据集 Data Sources

Data Sources 是什么呢?就字面意思其实就可以知道:数据来源。
Flink 做为一款流式计算框架,它可用来做批处理,即处理静态的数据集、历史的数据集;也可以用来做流处理,即实时的处理些实时数据流,实时的产生数据流结果,只要数据 源源不断 的过来,Flink 就能够一直计算下去,这个 Data Sources 就是数据的来源地。
flink 在批处理中常见的 source 主要有两大类。
1) 基于本地集合的 source(Collection-based-source)
2) 基于文件的 source(File-based-source)

2.1 基于本地集合的 source(Collection-based-source)

在 flink 最常见的创建 DataSet 方式有三种。

  1. 使用 env.fromElements(),这种方式也支持 Tuple,自定义对象等复合形式。
  2. 使用 env.fromCollection(),这种方式支持多种 Collection 的具体类型
  3. 使用 env.generateSequence()方法创建基于 Sequence 的 DataSet

2.2 基于文件的 source(File-based-source)

2.2.1 读取本地文件

2.2.2 读取 HDFS 数据

2.2.3 读取 CSV 数据

2.2.4 读取压缩文件

2.2.5 基于文件的 source(遍历目录)


3. DateSet 的 Transformation

3.1 map 函数

3.2 flatMap 函数

3.3 mapPartition 函数

3.4 filter 函数

3.5 reduce 函数

3.6 reduceGroup

3.7 Aggregate

3.8 minBy 和 maxBy

3.9 distinct 去重

3.10 Join

3.11 LeftOuterJoin

3.12 RightOuterJoin

3.13 fullOuterJoin

3.14 cross 交叉操作

3.15 Union

3.16 Rebalance

3.17 First


4. 数据输出 Data Sinks

flink 在批处理中常见的 sink

  1. 基于本地集合的 sink(Collection-based-sink)
  2. 基于文件的 sink(File-based-sink)
    flink 支持多种存储设备上的文件,包括本地文件,hdfs 文件等。 flink 支持多种文件的存储格式,包括 text 文件,CSV 文件等。 writeAsText():TextOuputFormat - 将元素作为字符串写入行。字符串是通过调用每个元 素的 toString()方法获得的。

5. Flink 的广播变量

Flink 支持广播变量,就是将数据广播到具体的 taskmanager 上,数据存储在内存中, 这样可以减缓大量的 shuffle 操作; 比如在数据 join 阶段,不可避免的就是大量的 shuffle 操作,我们可以把其中一个 dataSet 广播出去,一直加载到 taskManager 的内存 中,可以直接在内存中拿数据,避免了大量的 shuffle, 导致集群性能下降; 广播变量创 建后,它可以运行在集群中的任何 function 上,而不需要多次传递给集群节点。另外需要 记住,不应该修改广播变量,这样才能确保每个节点获取到的值都是一致的。
一句话解释,可以理解为是一个公共的共享变量,我们可以把一个 dataset 数据集广 播出去, 然后不同的 task 在节点上都能够获取到,这个数据在每个节点上只会存在一份。 如果不使用 broadcast,则在每个节点中的每个 task 中都需要拷贝一份 dataset 数据集, 比较浪费内存(也 就是一个节点中可能会存在多份 dataset 数据)。
注意:因为广播变量是要把 dataset 广播到内存中,所以广播的数据量不能太大,否则会 出 现 OOM 这样的问题。
Broadcast:Broadcast 是通过 withBroadcastSet(dataset,string)来注册的
Access:通过 getRuntimeContext().getBroadcastVariable(String)访问广播变量
可以理解广播就是一个公共的共享变量
将一个数据集广播后,不同的 Task 都可以在节点上获取到
每个节点 只存一份
如果不使用广播,每一个 Task 都会拷贝一份数据集,造成内存资源浪费

6 Flink 的分布式缓存

Flink 提供了一个类似于 Hadoop 的分布式缓存,让并行运行实例的函数可以在本地访 问。这 个功能可以被使用来分享外部静态的数据,例如:机器学习的逻辑回归模型等! 缓存的使用流程:
使用 ExecutionEnvironment 实例对本地的或者远程的文件(例如:HDFS 上的文件),为缓 存 文件指定一个名字注册该缓存文件!当程序执行时候,Flink 会自动将复制文件或者目 录到所有 worker 节点的本地文件系统中,函数可以根据名字去该节点的本地文件系统中检 索该文件!
【注意】广播是将变量分发到各个 worker 节点的内存上,分布式缓存是将文件缓存到各个 worker 节点上;

7 Flink Accumulators & Counters

Accumulator 即累加器,与 Mapreduce counter 的应用场景差不多,都能很好地观察 task 在运行期间的数据变化 可以在 Flink job 任务中的算子函数中操作累加器,但是只 能在任务执行结束之后才能获得累加器的最终结果。
Counter 是 一 个 具 体 的 累 加 器 (Accumulator) 实 现 IntCounter, LongCounter 和 DoubleCounter
步骤

  1. 创建累加器
private IntCounter numLines = new IntCounter(); 
  1. 注册累加器
getRuntimeContext().addAccumulator("num-lines", this.numLines); 
  1. 使用累加器
this.numLines.add(1); 
  1. 获取累加器的结果
myJobExecutionResult.getAccumulatorResult("num-lines")

Flink Broadcast 和 Accumulators 的区别: Broadcast(广播变量)允许程序员将一个只读的变量缓存在每台机器上,而不用在任务之间 传递变量。广播变量可以进行共享,但是不可以进行修改 Accumulators(累加器)是可以在不同任务中对同一个变量进行累加操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值