本文介绍了在星环大数据平台TDH中实现实时数据处理的原理.
1. 什么是流数据?
流式处理中假定流入系统的数据是持续不断的。它具有以下几个特点:
数据实时到达;
数据到达次序独立,不受应用系统所控制;
数据规模宏不能预知其最大值;
数据一经处理,除非特意保存,否则不能被再次取出处理,或者再次提取数据代价昂贵。
流数据在网站监控和网络监控;、信息系统异常检测、网页监控和金融服务等应用领域广泛出现,通过对流数据研究可以进行卫星云图监测、股市走向分析、网络攻击判断等。
在实际应用中,流数据的来源繁多,包括:TCP socket,Kafka,Flume,Twitter等。流数据通过Spark核心API、DataFrame SQL或者机器学习API处理,并可以持久化到本地文件、HDFS、数据库或者其它任意支持Hadoop输出格式的形式。
图:数据流向示意图
2.流数据处理框架
在Spark技术被广泛接受之前,数据处理中的一大难题就是如何将批处理和实时处理结合起来。为了解决这个难题,人们提出了很多解决方案。随着Spark技术的发展,流数据计算系统和全量计算系统的统一成为了可能。Spark本身可以用于批处理,而构建在Kappa架构之上的Spark Streaming又可以用于实时计算,因此利用一套系统来应对批处理和实时计算相结合的业务完全是可行的。Kappa架构的核心思想包括以下三点:
用Kafka或者类似的分布式队列系统保存数据,可以任意指定数据量保存的天数。
当需要全量重新计算时,重新建立一个流计算实例,从头开始读取数据进行处理,并输出到一个新的结果存储中。
当新的实例做完后,停止原有的流计算实例,并把原有的一些结果删除。
图:Kappa架构图
如上图所示,假设系统通过Kafka接入实时数据(日志数据、json数据等),不同类型的实时数据通过Topic区分。在系统进行流数据处理时,指定不同的处理方法StreamJob给各个Topic。通过配置每隔一定时间会从Kafka消息队列中接收一批时序数据。这一批数据中包含了多个数据单元。当前批次的数据会被映射成一张二维关系表。通过流数据引擎处理的结果可以存在HBase等数据库中,也可以使用内存列式存储。应用程序可以通过SQL查询到处理结果,进行统计分析。
图:流数据处理流程
3. 实时数据和批量数据混合处理方案
目前,大部分的实时信息分析系统的主要任务是要在不断产生的、海量的、格式多样的日常交易数据中快速发现问题,最好可以在问题发生时就发出预警。传统的数据库由于本身结构的限制,主要通过预设的条件,例如按月或按周的形式形成报表。这样就无法作到实时报警,快速反应。另一方面,单一使用流数据也无法利用所有有用的信息。一个高效的系统需要能够在综合利用历史存量数据的情况下,快速得到分析结果。
UDF (User-Defined Functions)是便于用户创建处理存储在Apache Hive中的数据的一种机制。用户可以自定义函数的输入输出参数。将UDF与StreamJob结合在一起使用可以实时的查询历史数据中相关内容用于实时数据的计算处理。随着UDF的不断演化,它可以被利用在其他Hadoop生态圈中的数据库上,例如:Hyperbase,Holodesk。虽然它的效率越来越高。在实际使用过程中,工程人员也要注意UDF的优化。
图:实时数据和批量数据的混合处理
参考: