作为数据科学家,我想把行业新的知识图谱总结并分享给技术专家们,让大数据知识真正转化为互联网生产力!大数据与人工智能、云计算、物联网、区块链等技术日益融合,成为全球最热的战略性技术,给大数据从业者带来了前所未有的发展机遇,同时也对大数据工程师提出了高标准的技能要求。大数据具有海量性、多样性、高速性和易变性等特点,映射到大数据平台建设要求,不仅要具备海量数据采集、并行存储、灵活转发、高效调用和智能分析的通用Paas服务能力,而且能快速孵化出各种新型的Saas应用的能力。
要实现这个目标,架构设计至少要满足三个总体技术要求:
- 一是把分布式大数据平台的基础数据服务能力建设摆在首位。规划出支撑PB级规模数据运营能力的云平台架构,运用经典设计原则和设计模式的架构之美,吸纳业内主流分布式技术的思想精髓,深耕主流平台服务模式到现代微架构的演变内涵;
- 二是用系统架构设计和微服务建设思想武装团队,持续撰写多维度的架构蓝图,推动团队协同作战;
- 三是围绕大数据全栈技术体系解决项目实战中的各类难题,制定主流技术规范和设计标准,通过平台核心组件方式快速迭代出新型业务。从设计要求来讲,大数据平台服务的整体设计要具备全面、全局、权衡的关键技术要求,不仅能全面提炼国内外优秀架构和解决方案的精华,而且要理解分布式技术的底层设计思想;不仅能全局了解上下游技术生态和业务结合的设计过程,而且要游刃有余的处理系统功能和性能问题;不仅能权衡新技术引入和改造旧系统的成本估算,而且要推动作战团队轻松驾驭新技术。
- 第一个总体技术要求:把分布式大数据平台的基础数据服务能力建设摆在首位。规划出支撑PB级规模数据运营能力的创新云平台架构,运用经典设计原则和设计模式的架构之美,吸纳业内主流分布式技术的思想精髓,深耕主流平台服务模式到现代微架构的演变内涵。
- 第二个总体技术要求:用系统架构设计和微服务建设思想武装团队,持续撰写多维度的架构蓝图,推动团队协同作战。架构师不仅要具备大型云平台架构的实战经验之外,更要有大智慧和战略思维,通过蓝图来推动和管理好每一个产品的全生命周期。
- 第三个总体技术要求:围绕大数据全栈技术体系解决项目实战中的各类难题,制定主流技术规范和设计标准,通过平台核心组件方式快速迭代出新型业务。针对设计规范的重要性,我们不妨用《孙子兵法》的大智慧来分析一下。
从系统整体技术能力出发,提出物联网大数据平台的八个通用微服务的技术要求,包括大数据的高并发采集服务、灵活分发服务、高可扩展海量存储服务、高并发展海量存储服务、高可靠海量存储服务、自定义迁移服务、基于机器学习的智能分析服务和基于Spark生态的实时计算服务,具体如下:
高并发采集服务:
- 支持多种移动终端和物联网数据的可扩展接入,并具备大规模接入并发处理能力。能够兼容主流行业通用的可扩展协议和规范,并采用高可靠的集群或者负载均衡技术框架来解决。如引入Mina或者Netty技术框架后适配各种多种移动终端接入。标准化接入要求常用的字节流、文件、Json等数据格式符合主流标准格式。
灵活分发服务:
- 按照分析应用需求,转发不同的数据类型和数据格式,交互方式之一是主流的消息中间件MQ或者Kafka,保证高效的转发并转换数据给数据服务运营方。交互的方式之二是Restful 方式,保证数据可以按照协议规范进行安全可靠的数据转发和传输。
高可扩展海量存储服务:
- 支持数据类型和数据表可扩展,对物联网大数据进行海量存储和计算,尤其适用于初创公司研发百万级用户之内的大数据平台。
高可并发海量存储服务:
- 支持数据类型和数据量的高速增长,对物联网大数据进行批处理,适合构建PB级数据量和千万级用户量的云平台。
高可靠海量存储服务:
- 支持物联网多源异构数据的统一高效和海量存储,并提供易于扩展的行业数据的离线计算和批处理架构,适合构建ZB级数据量和亿级用户量的分布式大平台。
基于Spark生态的实时计算服务:
- 支持对物联网大数据智能分析能力,通过企业级中间件服务框架提供安全可靠接口,实现数据实时统计和计算。
基于机器学习的智能分析服务:
- 支持安全高效的机器学习算法,通过支持分布式分类、聚类、关联规则等算法,为用户和物联网机构提供个性化的智能分析服务。
自定义迁移服务:
- 支持对物联网大数据的整体迁移和同步,通过数据转换和数据迁移工具对不同数据类型和数据格式进行整体迁移,实现数据集的自定义生成。
01高并发采集微服务
面对千倍用户量和万倍数据量的增长速度,如何保证物联网大数据在比较快的时间内进入平台?应对用户量的增长,如何在规定的时间内完成采集?在硬件设备处理能力之外,让数据更快的汇聚到平台是核心需求。具体考虑如下:
满足采集来自不同的厂家、移动设备类型、传输协议的行业数据的需求。我们在接口设计中完全可以针对不同设备和传输协议来设计,就是借用“分而治之”的用兵之道,“分而治之” 就是把一个复杂的算法问题按一定的“分解”方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的解,把各部分的解组成整个问题的解,这种朴素的思想也完全适合于技术设计,软件的体系结构设计、模块化设计都是分而治之的具体表现。其中策略模式就是这个思想的集中体现。策略模式定义了一个公共接口,各种不同的算法以不同的方式实现这个接口。
满足高并发需求。需要借助消息队列、缓存、分布式处理、集群、负载均衡等核心技术,实现数据的高可靠、高并发处理,有效降低端到端的数据传输时延,提升用户体验。借用“因粮于敌”的思想。“因粮于敌”的精髓是取之于敌,胜之于敌,以战养战,动态共存。我们常说的借用对手优势发展自己并整合资源就是这个思想的集中体现。正式商用的系统需要借助高性能中间件来并行处理数据,达到不丢包下的低延迟。我们采用商用的Mina 负载均衡技术框架,可以支持多种设备和传输协议(HTTP、TCP、UDP)的数据接入,可以满足每秒上万并发数的数据接入需求。针对以上的核心需求分析和技术定位,我们可以借助第三方中间件和采用设计模式实现个性化业务,来解决接口的集中化、可扩展性、灵活性等问题,借助Mina的Socket NIO技术魅力,适配高并发的数据接口IOFilterAdapter进行反序列化编码,适配高并发的数据接口IOHandlerAdapter进行业务处理。
02 灵活转发微服务
灵活转发能力的总体设计中要考虑接口和消息中间件两种方式,其中消息中间件可支撑千万级用户规模的消息并发,适用于物联网、车联网、移动 Apps、互动直播等领域。它的应用场景包括:
- 一是在传统的系统架构,用户从注册到跳转成功页面,中间需要等待系统接口返回数据。这不仅影响系统响应时间,降低了CPU吞吐量,同时还影响了用户的体验。
- 二是通过消息中间件实现业务逻辑异步处理,用户注册成功后发送数据到消息中间件,再跳转成功页面,消息发送的逻辑再由订阅该消息中间件的其他系统负责处理。
- 三是消息中间件的读写速度非常的快,其中的耗时可以忽略不计。通过消息中间件可以处理更多的请求。
主流的消息中间件有Kafka、RabbitMQ、RocketMQ,我们来对比一下它们性能,Kafka是开源的分布式发布-订阅消息系统,归属于Apache顶级项目,主要特点是基于Pull模式来处理消息消费,追求高吞吐量,主要用于日志收集和传输。自从0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务;RabbitMQ是Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。RocketMQ是阿里开源的消息中间件,由Java语言开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ设计思想源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。结合上述服务优势对比,在第三章我们会使用最主流的ActiveMQ消息中间件来处理数据转发,在第六章我们采用分布式的Kafka实现数据转发。
03 高可扩展海量存储服务
高可扩展是大数据处理的核心需求之一。实际工作中,当用户量在100万以内,而且数据量在TB级别以内,常常可以选择用Mysql数据库,灵活、成熟和开源的Mysql数据库是初创公司的首选。我们考虑使用纵表实现系统灵活可扩展,让经常使用的数据放在一个数据表中,让灵活变化的字段实现字典表模式,让内容常发生变化的数据对象尽量采用JSON格式。著名的OpenMRS系统在Mysql数据库中实现了自定义表格,让医生可以实现灵活自定义表格,收集自己的临床试验数据,让用户自己每天可以记录自己的饮食信息。这样的设计就能实现了应用场景的普适性。我们借鉴OpenMRS的核心思想来构建一个基于Mysql的小规模的物联网大数据模型。应用场景就是:一个患者到多个医院,进行体检并记录了各个生理指标。我们根据应用场景来建立数据模型。患者表构建为Patient表,医院表构建为Location表,体检构建为Encounter表,测量构建为Observation表,体检类型描述构建为Concept表,采用五张表的多表关联实现了普适的可扩展数据模型,在第三章节会详细阐述。
高可扩展的另外一个接口实现就是Restful架构。Restful接口是安全开放平台的主流接口风格。一般的应用系统使用Session进行登录用户信息的存储和验证,而大数据平台的开放接口服务的资源请求则使用Token进行登录用户信息的验证。Session主要用于保持会话信息,会在客户端保存一份cookie来保持用户会话有效性,而Token则只用于登录用户的身份鉴权。所以在移动端使用Token会比使用Session更加简易并且有更高的安全性。Restful架构遵循统一接口原则,统一接口包含了一组受限的预定义的操作,不论什么样的资源,都是通过使用相同的接口进行资源的访问。接口应该使用预先定义好的主流的标准的Get/Put/Delete/Post操作等。在第三章节会详细阐述。
04 高并发海量存储服务
MongoDB是适用于垂直行业应用的开源数据库,是我们高并发存储和查询的首选的数据库。MongoDB能够使企业业务更加具有扩展性,通过使用MongoDB来创建新的应用,能使团队提升开发效率。
我们具体分析一下关系模型和文档模型的区别。关系模型是按照数据对象存到各个相应的表里,使用时按照需求进行调取。举例子来说,针对一个体检数据模型设计,在用户管理信息中包括用户名字、地址、联系方式等。按照第三范式,我们会把联系方式用单独的一个表来存储,并在显示用户信息的时候通过关联方式把需要的信息取回来。但是MongoDB的文档模式,存储单位是一个文档,可以支持数组和嵌套文档,这个文档就可以涵盖这个用户相关的所有个人信息,包括联系方式。关系型数据库的关联功能恰恰是它的发展瓶颈,尤其是用户数据达到PB级之后,性能和效率会急速下降。
我们采用MongoDB设计一个高效的文档数据存储模式。首先考虑内嵌, 把同类型的数据放在一个内嵌文档中。内嵌文档和对象可以产生一一映射关系,比如Map可以实现存储一个内嵌文档。如果是多表关联时,可以使用在主表里存储一个id值,指向另一个表中的 id 值,通过把数据存放到两个集合里实现多表关联, 目前在MongoDB的4.0之后开始支持多文档的事务处理。
我们采用AngularJS框架设计一个高并发调用系统。一提到数据调用就想到了JQuery框架,JQuery框架的设计思想就是在静态页面基础上进行DOM元素操作。目前最成熟的数据调用的主流框架之一是AngularJS框架,AngularJS特别适合基于CRUD的Web应用系统。它简化了对Web开发者的经验要求,同时让Web本身变得功能更强。AngularJS对DOM元素操作都是在Directive中实现的,而且一般情况下很少自己直接去写DOM操作代码,只要你监听Model,Model发生变化后View也会发生变化。AngularJS框架强调UI应该是用Html声明式的方式构建,数据和逻辑由框架提供的机制自动匹配绑定。AngularJS有着诸多优势的设计思想,最为核心的是:数据理由、依赖注入、自动化双向数据绑定、语义化标签等。依赖注入思想实现了分层解耦,包括前后端分离和合理的模块化组织项目结构,让开发者更关注于每一个具体的逻辑本身,从而加快了开发速度,提升了系统的质量。双向绑定是它的精华所在,就是从界面的操作能实时反映到数据,数据的变更能实时展现到界面,数据模型Model和视图View都是绑定在了内存映射$Scope上。
下面是我设计的AngularJS 的项目框架,可以应用于所有业务系统,在第四章的体检报告可视化展示中详细阐述。建立MVC的三层框架,先建立一个单页视图层Main.html, 然后创建一个模型层Service.js, 最后创建一个控制层App.js, App.js中包括多个模块的JS和Html文件,这样就构建了一个完整的AngularJS MVC框架。
05 高可靠海量存储服务
高可靠海量存储是大数据处理的核心需求之一。实际工作中,常常需要实现多模态、不同时间颗粒度的行业数据的统一高效和海量存储,并提供易于扩展的离线计算和批处理架构,例如,引入 Hadoop和Spark的大数据存储与计算方案。高可靠数据海量存储的总体设计中要吸纳主流的Hadoop架构,Hadoop集群是一个能够让用户轻松架构和使用的分布式计算平台,用户可以在Hadoop上开发和运行处理海量数据的应用程序。它主要有以下几个优点:
- 高可靠性。Hadoop按列存储和处理数据的能力值得信任。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
- 高扩展性。Hadoop是在可用的列簇中分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。
- 高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。
数据海量存储的弹性设计中要吸纳主流的HBase架构。它是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,适用于结构化的存储,底层依赖于Hadoop的HDFS,利用HBase技术可在廉价PCServer上搭建起大规模结构化存储集群。因此HBase被广泛使用在大数据存储的解决方案中。从应用场景分析,因为HBase存储的是松散的数据,如果应用程序中的数据表每一行的结构是有差别的,使用HBase最好,因为HBase的列可以动态增加,并且列为空就不存储数据,所以如果你需要经常追加字段,且大部分字段是NULL值的,那可以考虑HBase。因为HBase可以根据Rowkey提供高效的查询,所以你的数据都有着同一个主键Rowkey。具体实现见第六章节。
06 实时计算服务
实时计算的总体设计中要考虑Spark生态技术框架。Spark 使用 Scala 语言进行实现,它是一种面向对象、函数式编程语言,能够像操作本地集合对象一样轻松地操作分布式数据集(Scala 提供一个称为 Actor 的并行模型)。Spark具有运行速度快、易用性好、通用性。Spark 是在借鉴了 MapReduce 思想之上发展而来的,继承了其分布式并行计算的优点并改进了 MapReduce 明显的缺陷,具体优势分析如下:
Spark 把中间数据放到内存中,迭代运算效率高。MapReduce 中计算结果需要落地,保存到磁盘上,这样势必会影响整体速度,而 Spark 支持 DAG 图的分布式并行计算的编程框架,减少了迭代过程中数据的落地,提高了处理效率。
Spark 容错性高。Spark 引进了弹性分布式数据集 RDD (Resilient Distributed Dataset) 的抽象,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统“对它们进行重建。另外在 RDD 计算时可以通过 CheckPoint 来实现容错。
Spark 具备通用性。在Hadoop 提供了 Map 和 Reduce 两种操作基础上,Spark 又提供的很多数据集操作类型有,大致分为:Transformations 和 Actions 两大类。Transformations 包括 Map、Filter、FlatMap、Sample、GroupByKey、ReduceByKey、Union、oin、Cogroup、MapValues、Sort 和 PartionBy 等多种操作类型,同时还提供 Count, Actions 包括 Collect、 Reduce、Lookup 和 Save 等操作。
强大的SparkMLlib机器学习库,旨在简化机器学习的工程实践工作,并方便扩展到更大规模。MLlib由一些通用的学习算法和工具组成,包括分类、回归、聚类、协同过滤、降维等,同时还包括底层的优化原语和高层的管道API。具体实现见第六章节。
07 基于机器学习的智能分析服务
智能分析服务的总体设计中要考虑Spark MLlib工具。当今主流的建模语言包括R语言,Weka,Mahout和Spark等,我们来分析一下它们的基因和应用场景。
R是一种数学语言,里面封装了大量的机器学习算法,但是它是单机的,不能够很好的处理海量的数据。Weka和R语言类似,里面包含大量经过良好优化的机器学习和数据分析算法,可以处理与格式化数据转换相关的各种任务,唯一的不足就是它对高内存要求的大数据处理遇到瓶颈。
Mahout是hadoop的一个机器学习库,有海量数据的并发处理能力,主要的编程模型是MapReduce。而基于MapReduce的机器学习在反复迭代的过程中会产生大量的磁盘IO,即本次计算的结果要作为下一次迭代的输入,这个过程中只能把中间结果存储磁盘,然后在下一次计算的时候从新读取,这对于迭代频发的算法显然是致命的性能瓶颈。所以计算效率很低。现在Mahout已经停止更新MapReduce算法,向Spark迁移。另外,Mahout和Spark ML并不是竞争关系,Mahout是MLlib的补充。
MLlib是Spark对常用的机器学习算法的实现库,同时包括相关的测试和数据生成器。Spark的设计就是为了支持一些迭代的Job, 这正好符合很多机器学习算法的特点。在逻辑回归的运算场景下,Spark比Hadoop快了100倍以上。Spark MLlib立足于内存计算,适应于迭代式计算。而且Spark提供了一个基于海量数据的机器学习库,它提供了常用机器学习算法的分布式实现,工程师只需要有 Spark基础并且了解机器学习算法的原理,以及方法中相关参数的含义,就可以轻松的通过调用相应的 API 来实现基于海量数据的机器学习过程。
数据迁移能力的总体设计中要考虑Sqoop框架。Sqoop是一个目前Hadoop和关系型数据库中的数据相互转移的主流工具,可以将一个关系型数据库(MySQL ,Oracle ,Postgres等)中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导入到关系型数据库中。作为ETL工具,使用元数据模型来判断数据类型,并在数据从数据源转移到Hadoop时确保类型安全的数据处理。Sqoop框架可以进行大数据批量传输设计,能够分割数据集并创建Hadoop任务来处理每个区块。