如何将个性化需求变成大数据解决方案

前言

大数据的技术日新月异,解决了很多传统的方法所无法解决的问题,为软件实现上提供了新思路。目前已经有很多企业已经基于大数据的相关技术已经搭建了很多系统。
在系统的搭建过程中,需要解决一个的问题:“我的这个需求,用大数据的技术如何实现”。这个问题需要个同时对业务和大数据技术都比较了解的人来做设计。本文就我在平时工作中总结出来的一些思路,希望对大家能有所帮助。

需求分析

在此之前首先需要先考虑,这个需求是否有必要用大数据手段来解决。一些大数据的典型场景,比如大规模离线计算、周期性的报表、机器学习算法等,目前大数据已经有非常成熟的方案,在考虑实现的时候,我们可以用通用的大数据技术来实现。但是大数据也不是万能的,有一些场景可能用其他的方法更加合适。也有一些场景,看起来和大数据似乎没啥关系,但是细细分析下来,这个需求是大数据擅长解决的场景。所以我们只是需要把大数据当成解决问题的一种工具。在找对工具之前,我们需要先对需求做一些分析。

这里举个例子,地铁站里的人流,不停有人进来和出去。需要统计当前的地铁站的人数,从而判断是否启动紧急措施进行分流限流,从而实现智能调度(这个需求是我自己想的,不过我确实在杭州看到人流高峰有一些地铁站只准出不准入,另外也可以动态增加一些班次)。地铁有运营时间,假设到晚上11时30分结束,所以0点可以近似认为地铁里没有乘客。

流程梳理

每天0定初始化人数为0,然后人数增加时(乘客从入口增加或者从地铁上下来)增加人数,在人数减少时(乘客从出口离开或者乘坐地铁离开)减少人数,最终实时或者近似实时得统计当前的站点内的人数。
这个需求的实现包含以下几个部分功能模块:

  1. 数据采集。包括人员增加和减少场景下相关数据的采集。从入口进入和从出口离开比较容易,闸机上比较容易获得通过人数,当人员通过闸机时,根据闸机的类型(出口还是入口)写一条记录。而上下地铁可能需要用到一些诸如传感器或者摄像头配合图像识别算法来实现。
  2. 数据计算。根据数据的增加和减少,在满足时效性需求的前提下,计算出当前的人数。这个典型的实现方法有两种。一种是用数据库的SQL来实现,把数据增减写到数据库里,最后通过计算时间做过滤后,对增加人数和减少人数分别求和后相减得到最终的人数。这个计算方式比较容易被理解,实现上比较简单,但是缺点是每次计算当前的人数需要把当天全部的人数重新统计一次,计算量比较大。另外一种方法是计算的时候,对于实时数据进入系统的时候,在原来的计算结果的基础上,再做增量计算。比如当前有100人,增加1个,那就是100+1=101,又出去两个人,就是101-2=99。中间的计算只涉及增量的数据计算,而不会把全部的数据重新算一次。
  3. 数据消费。计算出来的结果,可能需要对接到业务系统里,这个需要看业务系统的对接方式。一个比较通用的方法是把计算结果实时写入到数据库里供业务系统对接。另外也可能是需要以图表的形式进行展示以便直观地对数据进行理解。

功能实现

功能实现上,我比较喜欢从计算引擎上入手设计实现方法。就如这里的数据计算部分,考虑到地铁的人流量比较高(城市有多个地铁站,而在人流高峰的时候进出较多),为了保证计算性能,我比较偏向于用相对计算复杂度较低的流式计算的方案从而获得高并发和高性能。但是如果人流量比较少而且时效性要求很低,比如把这个场景变成某饭店/门诊科室的人流量统计/排队量统计,我可能会考虑用数据库查询+缓存的方式来实现。
计算引擎确定用流计算的方案后,对应的数据写入就需要使用流计算引擎支持的流式数据上传方式进行写入。而流计算后的结果,可以通用的写入到数据库供后续调用,或者写到消息中间件进行业务系统调用。

产品方案

以阿里云的云产品为例,流计算产品(StreamCompute)能比较好的满足计算引擎的需求。而数据可以用SDK写入到Datahub。考虑到可能用到传感器,这时候可以使用物联网套件。最终的数据消费,可以写入到RDS供业务系统调用/供DataV做可视化展示,也可以写入到消息队列/函数计算。

基于这个梳理,最终的架构图可以使用IOT的标准架构图
如何将个性化需求变成大数据解决方案

上一篇:用Java代码调用MaxCompute


下一篇:gradle打包MyBatis的xml