解析:基于UDW的海量数据实时分析服务平台 | U刻
  • 解析:基于UDW的海量数据实时分析服务平台

    栏目:产品动态

    背景

    随着数据快速增量、现在很多实时计算都是针对海量数据进行的。实时计算最重要的一个功能是能够实时响应,一般要求为秒级别。实时计算普遍应用于以下两种应用场景:场景一,数据源是实时、不间断的(流数据)、要求对用户的响应时间也是实时的;场景二,数据量大且无法预处理,要求对用户的响应时间也是实时的。

    场景一主要针对流式数据处理,把数据看做数据流的形式来处理。例如,在精准广告投放的应用中,需要基于用户的实时点击、实时查询等调整推荐算法。针对这类场景,比较流行的方案如Strom、Spark streaming等。场景二主要针对数据服务平台,给线上产品提供计算和查询服务。下面将讨论场景二应用场景下结合UDW的一些实践。

    下面我看看构建场景二的数据服务平台有哪些需求。

    udw-2-1

    图1 海量数据实时分析服务平台的总体需求

    如上图所示,海量数据实时分析服务平台有帅选查询、聚合计算和关联分析的需求。对系统的要求则是实时/准实时、支持海量数据的存储和计算、高可用、线性扩展、较好的并发支持。

    UDW构建海量数据实时分析服务

    下面我们通过“APP运行过程异常分析”案例分析,UDW如何构建海量数据实时分析服务。

    需求分析

    业务功能:

    实时收集APP运行过程中的崩溃信息,一方面用于统计分析用户请求APP某个URL的错误详情信息,另一方面按地域、版本、接入方式等不同的维度去统计APP一段时间内错误的汇总数据。

    要求:

    • 一天的数据聚查询ms级响应
    • 全量数据聚合查询秒级响应
    • 按照ID检索单条数据ms级响应
    • 数据实时入库

    数据来源:

    nginx日志

    数据规模:

    历史数据75亿条,每天新增数据2亿多条

    原有方案:

    采用MySQL的分库分表

    原有方案的问题:

    • 数据倾斜严重
    • 随着业务数据量的增量,有些查询不能实时返回,严重影响用户体验
    • 管理,扩容比较麻烦

    现有方案:

    如下所示,新方案通过采用UDW的分区表、列存储、表压缩,合适的索引来来构建百亿条的实时分析系统。

    udw-2-3

    系统设计

    udw-2-2

    图2 APP运行异常分析平台

    如上图所示,该数据平台通过Kafka实时收集nginx日志,应用每隔一分钟把Kafka中最新的数据进行加工处理、然后导入到UDW中。用户可以实时查询到任意时间段内APP的崩溃汇总数据以及详情,对APP的异常进行分析汇总。

    UDW如何做到上百亿数据的实时加载和分析

    下面我们一步步分析上述场景中UDW如何实现百亿行的数据分析。

    数据的实时/准实时的加载

    该应用一天新增数据2亿行、每秒需要加载2320条左右的数据。

    下表是我们对有20个字段的表格测试数据如下:

    udw-2-4
    表1 UDW一次插入数据的性能测试

    如上表测试,如果开启8到12个线程,一次插入4000-10000条数据,性能达到最优,每秒最高可以插入17万条数据。这个性能充分满足了每秒2000多行的数据加载需求,如果每秒写入的数据增加10倍可以轻松应对。另外通过copy的方式导入数据比一次插入多条数据的性能更好。

    通过insert和copy的方式把数据导入到UDW,比较适合用户的应用直接实时的把数据写入到UDW,每秒上10W的数据写入速度、可以保证了UDW每天可以写入差不多百亿行的数据。

    数据分布式分布,任务的并行执行

    UDW数据仓库中所有的表都是分布式的,每张表都会被切片。切片规则可以选择按照指定的Key进行Hash分片或者选择随机分片。在进行数据分析的时候,所有的分片同时工作,每个分片只需计算一部分数据,所以计算效率会大大提升。UDW的MPP架构让其在数据分析尤其在海量数据分析方面表现极佳的性能,比传统的分库分表方案表现出更好的性能。通过我们的测试,百亿级别的表格在做复杂的筛选查询、聚合运算的时候,UDW比分库分表的方案性能有10倍以上的提升,可以让一个小时级的查询变成分钟级的查询。

    列存储

    当数据分析或者查询过程中扫描的数据量过大、这时候IO达到了瓶颈,即使是任务并行执行,还是不能够秒级返回用户的查。UDW提供了行列混合存储的方式,用户可以根据实际应用场景选择列存储。我们测试发现,一个50字段的表格,用一个int字段作为ID,其他字段为字符串类型、date类型。如果查询的字段小于15个的时候,和行存储表相比,性能可以到达5-10倍的提升。

    测试结果如下:

    udw-2-5 表2 UDW行存储表和列存储表的性能测试

    采用列存储,如果每次查询的字段越少,磁盘IO减少的就越多,性能提升越明显。在做数据分析的时候,我们大部分时间只是分析一个表格中的少许字段指标,这样使用列存储可以大大提升数据查询效率,可以让一个分钟级的查询变为秒级查询。

    索引

    索引是数据库的一个重要功能特性,UDW同样也提供索引功能,合适的索引也可以减少磁盘IO、大大提升查询效率。

    分区表

    数据平台的数据往往随着时间积累,数据量会越来越大,我们可以通过线性的扩展来增加数据处理能力。但是大多数我们只关心最近的数据,或者大部分分析和查询都是最近几天或者一月内的热数据。这时候我们可以通过UDW的分区表、对表格进行按时间分区。分区表在逻辑上把一个大表切割成小表,分区表可以优化查询性能,在查询的时候只查询部分分区的内容。另外分区表可以很方便的让数据仓库把一些比较老的数据移出数据仓库,我们提供了HDFS外部表和UFile外部表,用户很方便的把一些历史数据通过外部表的方式导入到HDFS和UFile中。

    总结

    数据分布式分布、任务并行执行、节点线性扩展是通过增加UDW的处理能力来轻松应对海量数据的查询和分析;列存储、分区、索引则是降低磁盘IO的方式减少查询和分析时处理的数据量。UDW利用这些特性,可以轻松的应对上百亿数据的实时分析平台。