【Flink流式计算框架】:Flink中的富函数

1.基础函数类

Flink 暴露了所有udf 函数的接口(实现方式为接口或者抽象类)。例如MapFunction, FilterFunction等等。这里以FilterFunction为例:

无参的如下:

val dataStream = inputStream
  .map(data => {
	val arr = data.split(",")
	SensorReading(arr(0), arr(1).toLong, arr(2).toDouble)
  })
  .filter(new MyFilter)


class MyFilter extends FilterFunction[SensorReading] {
  override def filter(value: SensorReading): Boolean =
    value.id.startsWith("sensor_1")
}

有参的如下:

val dataStream = inputStream
  .map( data => {
	val arr = data.split(",")
	SensorReading(arr(0), arr(1).toLong, arr(2).toDouble)
  } ).filter(new MyFilter("sensor"))
  
class MyFilter(name:String) extends FilterFunction[SensorReading]{
  override def filter(value: SensorReading): Boolean =
    value.id.startsWith(name)
}

等价于

val dataStream = inputStream
  .map( data => {
	val arr = data.split(",")
	SensorReading(arr(0), arr(1).toLong, arr(2).toDouble)
  } ).filter(new FilterFunction[SensorReading] {
  override def filter(t: SensorReading): Boolean = t.id.startsWith("sensor")
})

如下所示,FilterFunction只有传入参数的类型,返回类型为Boolan类型。MapFunction既有传入参数类型,又有传出参数类型

public interface FilterFunction<T> extends Function, Serializable {
    boolean filter(T var1) throws Exception;
}

public interface MapFunction<T, O> extends Function, Serializable {
    O map(T var1) throws Exception;
}

2.富函数

2.1基础富函数

“富函数”是DataStream API 提供的一个函数类的接口,所有Flink 函数类都有其Rich 版本。它与常规函数的不同在于,可以获取运行环境的上下文,并拥有一些生命周期方法,所以可以实现更复杂的功能。简单的可以概括如下:

在函数处理数据之前,需要做一些初始化的工作;或者需要在处理数据时可以获得函数执行上下文的一些信息;以及在处理完数据时做一些清理工作。

例如:RichMapFunction、RichFlatMapFunction、 RichFilterFunction......

Rich Function 有一个生命周期的概念。典型的生命周期方法有:

  • open()方法是rich function 的初始化方法,当一个算子例如map 或者filter被调用之前open()会被调用。
  • close()方法是生命周期中的最后一个调用的方法,做一些清理工作。
  • getRuntimeContext()方法提供了函数的RuntimeContext 的一些信息,例如函数执行的并行度,任务的名字,以及state 状态。

示例代码

// 富函数,可以获取到运行时上下文,还有一些生命周期
class MyRichMapper extends RichMapFunction[SensorReading, String]{
  // getRuntimeContext()方法提供了函数的RuntimeContext的一些信息,例如函数执行的并行度,当前子任务的索引,当前子任务的名字。同时还它还包含了访问分区状态的方法
  lazy val listState: ListState[Int] = getRuntimeContext.getListState(new ListStateDescriptor[Int]("liststate", classOf[Int]))
  lazy val mapState: MapState[String, Double] = getRuntimeContext.getMapState(new MapStateDescriptor[String, Double]("mapstate", classOf[String], classOf[Double]))
  override def open(parameters: Configuration): Unit = {
    // 做一些初始化操作,比如数据库的连接
//    getRuntimeContext
  }

  override def map(value: SensorReading): String = value.id + " temperature"
    
  override def close(): Unit = {
    //  一般做收尾工作,比如关闭连接,或者清空状态
  }
}

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink批量计算是指使用Apache Flink进行大规模数据处理和计算的一种方式。Flink是一个开源的流式处理框架,但它也提供了用于批量计算的API和功能。 在批量计算,数据通常是以有限的批次进行处理的。与实时流式计算相比,批量计算更注重在一组数据上进行高效的离线处理。使用Flink进行批量计算时,可以通过以下几个步骤实现: 1. 数据准备:首先,需要将输入数据加载到Flink的分布式文件系统或其他存储系统。这些数据可以是文本文件、数据库的数据等。 2. 数据转换和处理:使用Flink的批处理API来定义数据转换和处理的逻辑。Flink提供了丰的转换操作符和函数,可以对数据进行过滤、转换、聚合等。用户可以根据自己的需求自由地组合和定义这些操作符。 3. 并行执行:Flink可以将数据并行地划分为多个分区,并在分布式计算集群上并行执行数据处理任务。这样可以充分利用集群资源,提高计算速度。 4. 结果输出:处理完成后,可以将计算结果写入文件系统、数据库或其他存储系统,以供后续分析或使用。 Flink在批量计算方面具有以下特点和优势: 1. 高性能:Flink采用基于内存的计算模型,能够实现低延迟和高吞吐量的数据处理能力。 2. 容错性:Flink具备容错机制,能够在计算过程处理节点故障,并保证计算结果的正确性。 3. 可伸缩性:Flink可以通过添加更多的计算节点来扩展计算能力,适应数据量的增长。 4. 灵活性:Flink提供了丰的API和操作符,支持复杂的数据转换和处理需求。 总之,Flink的批量计算功能使得用户可以方便地在大规模数据集上进行高效的离线处理和计算。无论是批量计算还是实时流式计算Flink都是一个强大的数据处理框架,广泛应用于各种大数据场景

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值