我一直在研究将数据流式传输到实时仪表板的不同方法。我过去做过的一种方法是使用星型模式/维度和事实表。这将是聚合表的实现。例如,仪表板将包含多个图表,一个是当天的总销售额,按产品划分的总销售额,制造商的总销售额等等。
但如果这需要是实时的呢?如果数据需要流式传输到这些图表并实时进行分析处理怎么办?
我一直在寻找像Kinesis溪流和Kafka这样的解决方案,但我可能会遗漏一些明显的东西。例如,请考虑以下示例。一家公司经营着一家销售馅饼的网站。该公司有一个后端仪表板,用于跟踪与销售,用户,订单等相关的所有数据和分析。
答案 0 :(得分:2)
这是大多数建筑师的典型权衡。 Amazon Redshift提供示例性读取优化,但AWS堆栈需要付出代价。您可以尝试使用Cassandra,但它带来了一系列挑战。在分析方面,我从不建议实时查看以下详细说明的原因。
不需要实时进行分析,特别是使用MySQL
上述解决方案是通过分离事务和分析的基础知识来实现的。这涉及成本,但一旦您扩展,将确保您不必花时间在家务管理。 MySQL是一种基于行的RDBMS,主要用于存储事务数据。基于行,它优化写入,即写入几乎是实时的,因此,它在读取时妥协。当我这样说时,我指的是每天运行数百万条记录的典型分析数据集。如果您的数据集不是那么庞大,您仍然可以渲染显示事务状态的图表。但由于您指的是Kafka,我认为数据集非常大。
具有可视化效果的实时信息中心会带来糟糕的客户体验
考虑到上述观点,即使你去仓库/阅读优化的基础设施,你也需要了解可视化的工作原理。如果100个人同时访问仪表板,将对数据库建立100个连接,所有连接都获取相同的数据,将它们放入内存,应用仪表板中定义的计算,参数和过滤器,调整可视化中的精炼数据集和然后渲染仪表板。直到这个时候,仪表板才会冻结。 构造不良的查询,索引的低效使用等将使事情变得更糟。
随着数据集的增加,上述问题会越来越多。实现您所需要的良好实践将是:
答案 1 :(得分:1)
如果这样的“总是最新的”报告(销售,用户,订单等)不需要接近零延迟流处理的实时更新可能会过度,并且类似ROLAP的方法似乎在努力/结果的意义上更加优化。
您提到了Redshift,如果您已准备好镜像数据以进行分析,并且只有问题是一个代价,您可以考虑另一个可用于实时处理OLAP(聚合)查询的免费开源替代方案(比如Yandex ClickHouse,或者在某些情况下可能是MongoDb)。
很多都取决于数据集的大小;除非你有真正需要聚合的大数据(数百GB),你可以尝试继续使用mysql并使用一些技巧:
答案 2 :(得分:-1)
对于这些类型的数据实时性至关重要的操作分析用例,您完全正确地认为,大多数“传统”方法可能非常笨拙,尤其是随着数据量的增加。您的选择的简要概述:
直到大约5年前,事实上的方式看起来像
使用有关饼店的示例,OLTP数据库将用于存储所有馅饼的购买以及诸如客户ID,账单信息,交货信息等参考信息。相反,OLAP数据库可能仅维护带有模式的表
purchase_totals(day: Date, weekNumber: int, dayOfWeek: int, year: int, total: float)
虽然weekNumber
,dayOfWeek
和year
以及技术上冗余的它们使您的查询更快!在这些字段上使用适当的索引后,您的信息中心转换为5个简单(且快速!)的聚合查询,并以and和group为一组,然后可以在客户端计算每周或每周的差异。只要您的仪表板每分钟刷新一次,便可以触及近乎实时的数据。
计算,数据库技术和数据科学/分析的最新趋势已导致对上述过程的改进,即通过替换其中的某些组件。更改包括
事实是,您正在谈论的这种工作负载是如此普遍,并且在当前状态下理应如此笨拙。在当今和明天的世界中,您将拥有复杂的半结构化数据-嵌套包含混合类型,稀疏字段和空值。它太乱了,您不了解它的结构,并且经常出现新字段。您正在实现的应用程序需要分析此数据,并将其与其他数据集结合起来,以返回实时指标和建议的操作。
好消息是Rockset为这些(以及您的)问题提供了准确的答案!即使上面讨论了所有混乱情况,Rockset仍可以以当前形式提取数据。然后,您可以使用快速的SQL查询实时查询它,该查询可以自动插入您选择的仪表板或可视化工具中。
查看这些博客文章,逐步了解如何使用Rockset来设置实时分析系统,如您所想的那样
快乐馅饼销售!
完整披露:我是Rockset的一名软件工程师