【实战】Flink实现统计每个小时的各类日志条数

本文介绍了如何使用Flink进行实时数据处理,具体场景为统计每个小时各类日志的数量。通过设置合适的触发器和窗口,实现对海量日志的高效聚合分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flink实现统计每个小时的各类日志条数

import java.text.SimpleDateFormat
import java.util.{Date, Properties}
import org.apache.flink.api.scala._
import com.google.gson.{JsonObject, JsonParser}
import com.iflytekzunhong.util.RedisPoolUtil
import org.apache.flink.api.common.functions.{AggregateFunction, ReduceFunction}
import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.api.common.state.{ValueState, ValueStateDescriptor}
import org.apache.flink.api.scala.typeutils.Types
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.api.scala.function.WindowFunction
import org.apache.flink.streaming.api.windowing.assigners.{TumblingEventTimeWindows, TumblingProcessingTimeWindows}
import org.apache.flink.streaming.api.windowing.evictors.TimeEvictor
import org.apache.flink.streaming.api.windowing.time.Time
import org.apache.flink.streaming.api.windowing.triggers.{ContinuousEventTimeTrigger, Trigger, TriggerResult}
import org.apache.flink.streaming.api.windowing.windows.TimeWindow
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer010
import org.apache.flink.util.Collector
import org.apache
### Flink 实战教程与实际应用案例 #### YARN 运行模式下的作业提交 Flink 支持通过 YARN 集群来运行应用程序,这种方式非常适合大规模分布式计算场景。以下是基于 YARN 的作业提交命令及其解释: ```bash root@node-1:/opt/module/flink-1.17.0# bin/flink run-application -t yarn-application -c cn.konne.un.WordCountUn lib/Flink-First-Demo-1.0-SNAPSHOT.jar ``` 此命令的核心参数如下: - `-t yarn-application` 表示以 YARN 应用程序模式运行。 - `-c cn.konne.un.WordCountUn` 指定主类路径。 - `lib/Flink-First-Demo-1.0-SNAPSHOT.jar` 是打包后的 JAR 文件位置。 这一步骤展示了如何将 Flink 作业部署到 YARN 上并执行[^1]。 --- #### 日志统计实战案例 在实际业务中,日志分析是一个常见的应用场景。假设需要统计用户在过去五分钟内的文件操作行为(如创建、删除、更新),可以设计一个简单的流处理逻辑。输入数据可能类似于以下形式: ``` 1001,delete 1002,update 1001,create 1002,delete ``` 经过处理后,输出应为每种操作的数量汇总: ``` 1001,2 1002,2 ``` 实现该功能的关键在于利用 Flink 提供的时间窗口和聚合算子。具体代码片段如下所示: ```java DataStream<String> inputStream = env.socketTextStream("localhost", 9999); inputStream .keyBy(value -> value.split(",")[0]) // 按照用户 ID 分组 .timeWindow(Time.minutes(5)) // 定义时间窗口为 5 分钟 .apply((window, values) -> { int count = (int) values.spliterator().estimateSize(); return String.format("%s,%d", window.getKey(), count); }) .print(); ``` 这段代码实现了按用户分组的日志计数,并限定在最近 5 分钟范围内完成统计[^2]。 --- #### Flink 批处理环境设置 对于批处理任务,Flink 提供了灵活的本地运行机制。开发者可以选择启动完整的 Flink 环境或者直接在 Java 集合上运行程序。以下是两种主要方式的具体说明: ##### 方式一:完整 Flink 环境 如果希望模拟真实的集群环境,则可以通过 `LocalExecutionEnvironment` 启动整个框架实例。例如: ```java Configuration conf = new Configuration(); conf.setFloat(ConfigConstants.TASK_MANAGER_MEMORY_FRACTION_KEY, 0.5f); // 设置 TaskManager 内存比例 final ExecutionEnvironment env = ExecutionEnvironment.createLocalEnvironment(conf); ``` 此处配置允许调整内存分配策略以及其他性能优化选项[^3]。 ##### 方式二:轻量化集合运算 当仅需验证算法逻辑而无需考虑资源调度时,可采用更高效的 `CollectionEnvironment` 方法。它会直接作用于现有的 Java 数据结构之上,而不涉及复杂的底层组件初始化过程。样例演示如下: ```java List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); ExecutionEnvironment env = ExecutionEnvironment.createCollectionsEnvironment(); DataSet<Integer> dataSet = env.fromCollection(numbers); dataSet.map(new MapFunction<Integer, Integer>() { @Override public Integer map(Integer value) throws Exception { return value * 2; } }).print(); ``` 这种方法特别适合单元测试阶段或快速原型开发需求[^3]。 --- #### 使用 MySQL-CDC 插件构建实时同步方案 随着数据库变更捕获技术的发展,越来越多的企业倾向于借助工具自动捕捉源表的变化记录并向下游目标端推送增量更新消息。针对这一领域,阿里巴巴开源项目提供了专门适配器——`flink-connector-mysql-cdc` ,其 Maven 坐标声明如下: ```xml <dependency> <groupId>com.alibaba.ververica</groupId> <artifactId>flink-connector-mysql-cdc</artifactId> <version>1.1.0</version> </dependency> ``` 集成完成后即可轻松读取 Binlog 流并将结果写入 Kafka 或其他存储介质之中[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值