1. 本际云推荐 - 专业推荐VPS、服务器,IDC点评首页
  2. 云主机运维
  3. VPS运维

Flink实现批处理离线计算

引言

本小编一直使用Flink进行流处理,但客户提出的新需求更适合使用批处理离线计算:客户不需要实时计算结果,认为实时结果对他们没有参考意义,他们需要计算一个月或更长时间内历史数据的基准值,才能更加准确地评估和预测未来趋势。

Flink实现批处理离线计算

批处理介绍

大数据计算分为离线计算和实时计算。批处理主要操作大容量静态数据集,并在计算过程完成后返回结果。批处理模式中使用的数据集通常符合以下特征:

  • 有界:批处理数据集代表数据的有限集合。
  • 持久:数据通常始终存储在某种类型的持久存储位置中。
  • 大量:海量数据集。

批处理非常适合需要访问全套记录才能完成的计算工作。需要处理大量数据的任务通常最适合用批处理操作进行处理。批处理在应对大量持久数据方面的表现极为出色,经常被用于对历史数据进行分析。

批处理VS流处理

批处理相比流处理有以下优点:

  1. 吞吐量大、资源利用率高:批处理的吞吐量更大、资源利用率更高、系统的开销更小。
  2. 容易实现精准计算:批处理数据有界,所有的数据全部都会加载,不用考虑数据源的顺序,不会出现忽略数据的情况,也不需要窗口(window)、时间、水印等机制。

而流处理则可以解决数据丢失和重复处理的问题,但需要引入各种机制,增加了系统消耗的资源。不同场景应该根据需求选择合适的处理方式。

Flink实现批处理离线计算

由于Flink是一个流处理框架,可以处理有边界和无边界的数据流。无边界的数据就是流数据,有边界的数据就是批数据,因此Flink也是支持批处理的。以下是核心代码:

Flink执行环境:

ExecutionEnvironment env=ExecutionEnvironment.getExecutionEnvironment();

从Kafka中获取DataSet数据源:

DataSet<String, String> recordsDataSet=env.createInput(KafkaInputFormat
	.buildKafkaInputFormat()
	.setBootstrapServers(KafkaServers)
	.setGroupId(xx)
	.setTopic(sourceTopic)
	.finish());

继承GenericInputFormat类实现自定义获取Kafka数据源KafkaInputFormat:

public class KafkaInputFormat extends GenericInputFormat<String, String>{

@Override
public void open(GenericInputSplit split) throws IOException{
consumer = new KafkaConsumer<String, String>(props);
initPartionMap();
}

//获取KafkaTopic每个分区的偏移量,用做Kafka消费结束的标识
void initPartionMap(){
Collection<PartitionInfo> partitionInfos = consumer.partitionsFor(topic);
List<TopicPartition> tp = new ArrayList<>();
partitionInfos.forEach(partitionInfo->{
tp.add(new TopicPartition(topic, partitionInfo.partition()));
consumer.assign(tp);
consumer.seekToEnd(tp);
partionOffsetMap.put(partitionInfo.partition(), consumer.position(new TopicPartition(topic, partitionInfo.partition())));
partionBooleanMap.put(partitionInfo.partition(), false);
//获取参数值后返回最初
consumer.seekToBeginning(tp);
});
}

//消费Kafka是否结束
@Override
public boolean reachedEnd() throws IOException{
return !partionBooleanMap.containsValue(false);
}

@Override
public ConsumerRecords<String, String> nextRecord

原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6020.html