汇总表与实时分析

时间:2018-01-15 01:02:29

标签: amazon-web-services real-time analytics data-warehouse

我一直在研究将数据流式传输到实时仪表板的不同方法。我过去做过的一种方法是使用星型模式/维度和事实表。这将是聚合表的实现。例如,仪表板将包含多个图表,一个是当天的总销售额,按产品划分的总销售额,制造商的总销售额等等。

但如果这需要是实时的呢?如果数据需要流式传输到这些图表并实时进行分析处理怎么办?

我一直在寻找像Kinesis溪流和Kafka这样的解决方案,但我可能会遗漏一些明显的东西。例如,请考虑以下示例。一家公司经营着一家销售馅饼的网站。该公司有一个后端仪表板,用于跟踪与销售,用户,订单等相关的所有数据和分析。

  1. 通过网站自定义地点订购
  2. 关系(mysql)数据库收到此新订单
  3. 图表和分析数据在后端实时更新,例如当天的总销售额或用户的年度总销售额。
  4. 如果场景是需要流式传输此数据,那么最佳方法是什么?聚合表看起来很明显,但似乎是周期性的而不是实时的。 Kinesis / Kafka觉得它适合放在这里的某个地方。另一个选择就像Redshift,但它相当昂贵,但仍然可能不是解决问题和扩展的最佳方式。

    下面是一个需要实时更新的图表示例,当需要解析大量和大量行时,只需执行聚合SQL查询就可能会受到影响。

    enter image description here

3 个答案:

答案 0 :(得分:2)

这是大多数建筑师的典型权衡。 Amazon Redshift提供示例性读取优化,但AWS堆栈需要付出代价。您可以尝试使用Cassandra,但它带来了一系列挑战。在分析方面,我从不建议实时查看以下详细说明的原因。

  

不需要实时进行分析,特别是使用MySQL

上述解决方案是通过分离事务和分析的基础知识来实现​​的。这涉及成本,但一旦您扩展,将确保您不必花时间在家务管理。 MySQL是一种基于行的RDBMS,主要用于存储事务数据。基于行,它优化写入,即写入几乎是实时的,因此,它在读取时妥协。当我这样说时,我指的是每天运行数百万条记录的典型分析数据集。如果您的数据集不是那么庞大,您仍然可以渲染显示事务状态的图表。但由于您指的是Kafka,我认为数据集非常大。

  

具有可视化效果的实时信息中心会带来糟糕的客户体验

考虑到上述观点,即使你去仓库/阅读优化的基础设施,你也需要了解可视化的工作原理。如果100个人同时访问仪表板,将对数据库建立100个连接,所有连接都获取相同的数据,将它们放入内存,应用仪表板中定义的计算,参数和过滤器,调整可视化中的精炼数据集和然后渲染仪表板。直到这个时候,仪表板才会冻结。 构造不良的查询,索引的低效使用等将使事情变得更糟。

  

随着数据集的增加,上述问题会越来越多。实现您所需要的良好实践将是:

  1. 几乎实时(延迟1小时,30分钟,15分钟等)而不是绝对的实时系统。这将帮助您创建一个包含已在内存中提取的数据的平面文件。您的仪表板只会读取此数据,并且对过滤器的响应速度非常快。此外,将避免与数据库的多个连接。
  2. 拥有针对读取优化的数据结构,数据库/仓库。

答案 1 :(得分:1)

如果这样的“总是最新的”报告(销售,用户,订单等)不需要接近零延迟流处理的实时更新可能会过度,并且类似ROLAP的方法似乎在努力/结果的意义上更加优化。

您提到了Redshift,如果您已准备好镜像数据以进行分析,并且只有问题是一个代价,您可以考虑另一个可用于实时处理OLAP(聚合)查询的免费开源替代方案(比如Yandex ClickHouse,或者在某些情况下可能是MongoDb)。

很多都取决于数据集的大小;除非你有真正需要聚合的大数据(数百GB),你可以尝试继续使用mysql并使用一些技巧:

  • 使用具有高IOPS的独立slave mysql服务器进行分析,并仅复制构建报告所需的表;可能使用另一个表引擎,更适合分析查询。专门为这些查询设置索引,以避免表格完全扫描,如果您只需要获取过去几周的数字。
  • 预先计算以前期间的指标(使用物化视图式方法)并按计划(例如每日)刷新它们,然后将预先计算的聚合与实时聚合相结合,仅用于最后一段时间以获得实际报告数据,无需每次扫描整个事实表。
  • 使用数据可视化后端,可以有效地在内存中缓存报表数据,以防止SQL DB因许多类似查询而过载(如果为100个用户显示相同的报表或仪表板,则SQL DB加载与1相同) 。顺便说一句,我开发类似的解决方案(不能在这里提供,因为它是商业产品)。

答案 2 :(得分:-1)

对于这些类型的数据实时性至关重要的操作分析用例,您完全正确地认为,大多数“传统”方法可能非常笨拙,尤其是随着数据量的增加。您的选择的简要概述:

历史方法(TLDR– Meh)

直到大约5年前,事实上的方式看起来像

  1. 设置一个主要的OLTP数据库,该数据库将以其原始格式处理数据,并对性能或ACID属性具有更严格的保证。通常,这是一种SQL风格的东西,即MySQL,PostgreSQL。
  2. 设置辅助OLAP数据库,该数据库用于提供离线(也称为非面向用户)查询。这也可以是SQL式的db,但是其架构会大不相同,因为它以丰富的形式存储数据。
  3. 设置一些机制,使这2个机制保持同步。这可以归结为a)更改您的应用程序以始终写入两个数据库并执行必要的数据扩充,或b)构建一个独立的应用程序,该应用程序从您的OLTP数据库中读取,执行必要的转换和扩充并写入您的OLAP数据库
  4. 将仪表板插入到OLAP数据库中,该数据库将具有针对所需查询类型进行了优化的架构和索引。

使用有关饼店的示例,OLTP数据库将用于存储所有馅饼的购买以及诸如客户ID,账单信息,交货信息等参考信息。相反,OLAP数据库可能仅维护带有模式的表

purchase_totals(day: Date, weekNumber: int, dayOfWeek: int, year: int, total: float)

虽然weekNumberdayOfWeekyear以及技术上冗余的它们使您的查询更快!在这些字段上使用适当的索引后,您的信息中心转换为5个简单(且快速!)的聚合查询,并以and和group为一组,然后可以在客户端计算每周或每周的差异。只要您的仪表板每分钟刷新一次,便可以触及近乎实时的数据。

当前方法(TLDR–确定)

计算,数据库技术和数据科学/分析的最新趋势已导致对上述过程的改进,即通过替换其中的某些组件。更改包括

  1. 创建OLTP数据库,OLAP数据库或NoSQL数据库(通常是Mongo最流行)。这里的优点是您有一个更灵活的架构,如果上游发生某些变化(例如,您除了出售馅饼以外,还开始销售蛋糕),它不会中断。
  2. 保留SQL数据库,但转而使用AWS RDS或Google Cloud SQL之类的云提供程序解决方案。从根本上讲,这不会改变体系结构的任何内容,但可以显着减轻您的运营负担。
  3. 在Kafka或AWS Kinesis等流平台上使用难以维护的ETL管道作为OLAP和OLTP之间的中间层。
  4. 在计划如何进行ETL时,使用专用工具进行数据清理和转换
  5. 在OLAP数据库的顶部使用专用的可视化工具(请考虑Tableau
  6. 使用基于拉的方法将数据直接从OLTP数据库或应用程序中获取,而不是等待数据最终到达OLAP数据库。这对在线服务很有帮助,因为它实际上为您提供了所需的数据,并确认了该服务是否正常运行并且运行良好(因为它刚刚满足了您的数据请求)。像Prometheus之类的系统现在很受欢迎。

未来方法(TLDR– AWESOME)

事实是,您正在谈论的这种工作负载是如此普遍,并且在当前状态下理应如此笨拙。在当今和明天的世界中,您将拥有复杂的半结构化数据-嵌套包含混合类型,稀疏字段和空值。它太乱了,您不了解它的结构,并且经常出现新字段。您正在实现的应用程序需要分析此数据,并将其与其他数据集结合起来,以返回实时指标和建议的操作。

好消息是Rockset为这些(以及您的)问题提供了准确的答案!即使上面讨论了所有混乱情况,Rockset仍可以以当前形式提取数据。然后,您可以使用快速的SQL查询实时查询它,该查询可以自动插入您选择的仪表板或可视化工具中。

查看这些博客文章,逐步了解如何使用Rockset来设置实时分析系统,如您所想的那样

快乐馅饼销售!

完整披露:我是Rockset的一名软件工程师