资讯专栏INFORMATION COLUMN

实时计算框架Flink在教育行业的应用实践

FullStackDeveloper / 3055人阅读

摘要:宋体本文通过一个教育行业的应用案例,剖析业务系统对实时计算的需求场景,并分析了和两种实现方式的异同,最后通过运用产品中封装的模块,来加速开发效率,更快地完成需求。宋体中间的实时计算框架,则在和中选择。

如今,越来越多的业务场景要求 OLTP 系统能及时得到业务数据计算、分析后的结果,这就需要实时的流式计算如 Flink 等来保障。例如,在 TB 级别数据量的数据库中,通过 SQL 语句或相关 API 直接对原始数据进行大规模关联、聚合操作,是无法做到在极短的时间内通过接口反馈到前端进行展示的。若想实现大规模数据的 “即席查询”,就须用实时计算框架构建实时数仓来实现。

本文通过一个教育行业的应用案例,剖析业务系统对实时计算的需求场景,并分析了 Flink 和 Spark 两种实现方式的异同,最后通过运用 UCloud UFlink 产品中封装的 SQL 模块,来加速开发效率,更快地完成需求。

1.1 业务场景简述

在这个 K12 教育的业务系统中,学生不仅局限于纸质的练习册进行练习,还可以通过各类移动终端进行练习。基于移动终端,可以更方便地收集学生的学习数据,然后通过大数据分析,量化学习状态,快速定位薄弱知识点,进行查缺补漏。

在这套业务系统中,学生在手机 App 中对老师布置的作业进行答题训练,每次答题训练提交的数据格式如下表所示:

例如,传入到后台的单条答题记录数据格式如下:

  •  
{ "student_id": "学生ID_16", "textbook_id": "教材ID_1", "grade_id": "年级ID_1", "subject_id": "科目ID_2_语文", "chapter_id": "章节ID_chapter_2", "question_id": "题目ID_100", "score": 2, "answer_time": "2019-09-11 12:44:01", "ts": "Sep 11, 2019 12:44:01 PM"}

然后,基于上述实时流入的数据,需要实现如下的分析任务:

・实时统计每个题目被作答频次

・按照年级实时统计题目被作答频次

・按照科目实时统计每个科目下题目的作答频次

1.2 技术方案选型

针对上述几个需求点,设计了如下的方案。首先会将数据实时发送到 Kafka 中,然后再通过实时计算框架从 Kafka 中读取数据,并进行分析计算,最后将计算结果重新输出到 Kafka 另外的主题中,以方便下游框架使用聚合好的结果。

下游框架从 Kafka 中拿到聚合好的数据,并实时录入到 OLTP 的业务库中(例如:MySQL、UDW、HBase、ES 等),以便于接口将想要的结果实时反馈给前端。

中间的实时计算框架,则在 Flink 和 Spark 中选择。2018 年 08 月 08 日,Flink 1.6.0 推出,支持状态过期管理(FLINK-9510, FLINK-9938)、支持 RocksDB、在 SQL 客户端中支持 UDXF 函数,大大加强了 SQL 处理功能,同时还支持 DML 语句、支持基于多种时间类型的事件处理、Kafka Table Sink 等功能。随后推出的 Flink 1.6.x 系列版本中,进行了大量优化。这些使得 Flink 成为一个很好的选择。

早先 Spark 要解决此类需求,是通过 Spark Streaming 组件实现。为此需要先生成 RDD,然后通过 RDD 算子进行分析,或者将 RDD 转换为 DataSetDataFrame、创建临时视图,并通过 SQL 语法或者 DSL 语法进行分析。相比之下显得不够便捷和高效。后来 Spark 2.0.0 新增了 Structured Streaming 组件,具有了更快的流式处理能力,可达到和 Flink 接近的效果。

架构如下图所示:

本篇将省略下游框架的操作,重点介绍 Flink 框架进行任务计算的过程(虚线框中的内容),并简述 Spark 的实现方法,便于读者理解其异同。

1.3 实时计算在学情分析系统中的具体实现

1.3.1 Flink 实践方案

1. 发送数据到 Kafka

后台服务通过 Flume 或后台接口触发的方式调用 Kafka 生产者 API,实时将数据发送到 Kafka 指定主题中。

例如发送数据如下所示:

  •  
{"student_id":"学生ID_16","textbook_id":"教材ID_1","grade_id":"年级ID_1","subject_id":"科目ID_2_语文","chapter_id":"章节ID_chapter_2","question_id":"题目ID_100","score":2,"answer_time":"2019-09-11 12:44:01","ts":"Sep 11, 2019 12:44:01 PM"}………

提示:此处暂且忽略在 Kafka 集群中创建 Topic 的操作。

2. 编写 Flink 任务分析代码

使用 Flink 处理上述需求,需要将实时数据转换为 DataStream 实例,并通过 DataStream 算子进行任务分析,另外,如果想使用 SQL 语法或者 DSL 语法进行任务分析,则需要将 DataStream 转换为 Table 实例,并注册临时视图。

(1)构建 Flink

envenv(StreamExecutionEnvironment) 是 Flink 当前上下文对象,用于后续生成 DataStream。代码如下所示:

  •  
val env = StreamExecutionEnvironment.getExecutionEnvironmentenv.setParallelism(3)

(2)从 Kafka 读取答题数据

在 Flink 中读取 Kafka 数据需要指定 KafkaSource,代码如下所示:

  •  
val props = new Properties()props.setProperty("bootstrap.servers", "linux01:9092,linux02:9092,linux03:9092")props.setProperty("group.id", "group_consumer_learning_test01")
val flinkKafkaSource = new FlinkKafkaConsumer011[String]("test_topic_learning_1", new SimpleStringSchema(), props)val eventStream = env.addSource[String](flinkKafkaSource)

(3)进行 JSON 解析

这里通过 map 算子实现 JSON 解析,代码示例如下:

  •  
val answerDS = eventStream.map(s => { val gson = new Gson() val answer = gson.fromJson(s, classOf[Answer]) answer})

(4)注册临时视图

创建临时视图的目的,是为了在稍后可以基于 SQL 语法来进行数据分析,降低开发工作量。需要先获取 TableEnv 实例,再将 DataStream 实例转换为 Table 实例,最后将其注册为临时视图。代码如下所示:

  •  
val tableEnv = StreamTableEnvironment.create(env)val table = tableEnv.fromDataStream(answerDS)tableEnv.registerTable("t_answer", table)

(5)进行任务分析

接下来,便可以通过 SQL 语句来进行数据分析任务了,3 个需求对应的分析代码如下所示:

  •  
//实时:统计题目被作答频次val result1 = tableEnv.sqlQuery( """SELECT | question_id, COUNT(1) AS frequency |FROM | t_answer |GROUP BY | question_id """.stripMargin)
//实时:按照年级统计每个题目被作答的频次val result2 = tableEnv.sqlQuery( """SELECT | grade_id, COUNT(1) AS frequency |FROM | t_answer |GROUP BY | grade_id """.stripMargin)
//实时:统计不同科目下,每个题目被作答的频次val result3 = tableEnv.sqlQuery( """SELECT | subject_id, question_id, COUNT(1) AS frequency |FROM | t_answer |GROUP BY | subject_id, question_id """.stripMargin)

此时得到的 result1、result2、result3 均为 Table 实例。

(6)实时输出分析结果

接下来,将不同需求的统计结果分别输出到不同的 Kafka 主题中即可。

在 Flink 中,输出数据之前,需要先将 Table 实例转换为 DataStream 实例,然后通过 addSink 算子添加 KafkaSink 即可。

因为涉及到聚合操作,Table 实例需要通过 RetractStream 来转换为 DataStream 实例。

该部分代码如下所示:

  •  
tableEnv.toRetractStream[Result1](result1) .filter(_._1) .map(_._2) .map(new Gson().toJson(_)) .addSink(new FlinkKafkaProducer011[String]("linux01:9092,linux02:9092,linux03:9092", "test_topic_learning_2", new SimpleStringSchema()))
tableEnv.toRetractStream[Result2](result2) .filter(_._1) .map(_._2) .map(new Gson().toJson(_)) .addSink(new FlinkKafkaProducer011[String]("linux01:9092,linux02:9092,linux03:9092", "test_topic_learning_3", new SimpleStringSchema()))
tableEnv.toRetractStream[Result3](result3) .filter(_._1) .map(_._2) .map(new Gson().toJson(_)) .addSink(new FlinkKafkaProducer011[String]("linux01:9092,linux02:9092,linux03:9092", "test_topic_learning_4", new SimpleStringSchema()))

(7)执行分析计划

Flink 支持多流任务同时运行,执行分析计划代码如下所示:

  •  
env.execute("Flink StreamingAnalysis")

至此,编译并运行项目后,即可看到实时的统计结果,如下图所示,从左至右的 3 个窗体中,分别代表对应需求的输出结果。

1.3.2 Spark 基于 Structured Streaming 的实现

Spark 发送数据到 Kafka,及最后的执行分析计划,与 Flink 无区别,不再展开。下面简述差异点。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/117605.html

相关文章

  • 实时计算有赞实践 - 效率提升之路

    摘要:目前实时计算在有赞的整体技术架构如下图未来规划首先要落地并的是实时任务化,提高化任务可以覆盖的业务场景目标是,从而通过提高业务开发效率的角度赋能业务。 1. 概述 有赞是一个商家服务公司,提供全行业全场景的电商解决方案。在有赞,大量的业务场景依赖对实时数据的处理,作为一类基础技术组件,服务着有赞内部几十个业务产品,几百个实时计算任务,其中包括交易数据大屏,商品实时统计分析,日志平台,调...

    Maxiye 评论0 收藏0
  • 中国优秀架构师是不是出现了严重断层?

    摘要:经过近两个小时的讨论,很不幸我们得出了最后的结论在国内互联网发展的这年间,短平快的发展模式造成了中国软件工程领域架构师的严重断层。中国真正的架构师在哪里在和产品组里的同学的讨论过程中。 点击上方蓝色字体,选择设为星标 回复面试获取更多惊喜 背景 我先说下这篇文章的背景。 放假前的晚上,...

    tabalt 评论0 收藏0
  • 袋鼠云研发手记 | 开源·数栈-扩展FlinkSQL实现流与维表join

    摘要:所以要用实现流与维表的分两步一用实现维表的功能要实现维表功能就要用到这个功能,是由阿里巴巴贡献给的。是由阿里巴巴贡献给社区的,于版本引入,主要目的是为了解决与外部系统交互时网络延迟成为了系统瓶颈的问题。 showImg(https://segmentfault.com/img/bVbqZJE?w=583&h=123); 作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%...

    张红新 评论0 收藏0
  • 你公司到底需不需要引入实时计算引擎?

    摘要:再如通过处理流数据生成简单的报告,如五分钟的窗口聚合数据平均值。复杂的事情还有在流数据中进行数据多维度关联聚合塞选,从而找到复杂事件中的根因。因为各种需求,也就造就了现在不断出现实时计算框架,而下文我们将重磅介绍我们推荐的实时计算框架。 前言 先广而告之,本文摘自本人《大数据重磅炸弹——实时计算框架 Flink》课程第二篇,内容首发自我的知识星球,后面持续在星球里更新,这里做个预告,今...

    HackerShell 评论0 收藏0
  • Apache Flink,流计算?不仅仅是流计算

    摘要:基于流处理机制实现批流融合相对基于批处理机制实现批流融合的思想更自然,更合理,也更有优势,因此阿里巴巴在基于支持大量核心实时计算场景的同时,也在不断改进的架构,使其朝着真正批流融合的统一计算引擎方向前进。 阿里妹导读:2018年12月下旬,由阿里巴巴集团主办的Flink Forward China在北京国家会议中心举行。Flink Forward是由Apache软件基金会授权的全球范围...

    KoreyLee 评论0 收藏0

发表评论

0条评论

FullStackDeveloper

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<