在 Azure 中使用 .Net 为大数据创建实时仪表板的最有效方法是啥?
Posted
技术标签:
【中文标题】在 Azure 中使用 .Net 为大数据创建实时仪表板的最有效方法是啥?【英文标题】:What's the most efficient way to create a live dashboard for Big Data using .Net in Azure?在 Azure 中使用 .Net 为大数据创建实时仪表板的最有效方法是什么? 【发布时间】:2020-02-15 18:06:12 【问题描述】:假设的简化场景:
我有一个 Asp.Net Core 3 API,它接收来自 javascript 的披萨订单。 订购了比萨饼,我在 C# API 中反序列化对象。 我现在有一个对象“Pizza”:
"name": "Margherita",
"date": "20201502",
"amount": "10"
"ingredients": ["tomato", "mozzarella"]
我每天收到 1 亿份披萨订单,我需要一个显示订单的实时仪表板,以及用于搜索“昨天”、“本月”、“去年”等历史数据的菜单。
我还需要一份在给定时间范围内订购次数最多的比萨饼的列表,或使用的***配料。
使用 Microsoft Azure 和 C# 实现这种结果的最现代、最有效的方法是什么?
有太多的队列、数据工厂、湖、存储、流等分析服务可供选择。
我能想到两种方法:
1)
将每个披萨订单发送到队列,例如 Service Fabric 队列、AzureStorage 队列或事件中心 出列对象,暂时将它们保存在内存中 在内存中有 10k 或更多元素后,以这种方式聚合它们以满足将来的查询并将它们保存到 CosmosDB,而不是保存每个订单 这会导致 CPU 效率低下,并且在未来的查询中受到限制,但可以节省存储成本,因为不存储单个对象而只是聚合数据2)
将每个披萨发送到事件中心或流分析等队列 将每个对象保存到“大数据”存储中 使用 Azure 上的 Apache Spark 或类似工具查询数据 创建一个工作角色,每分钟查询一次数据集并创建单个聚合记录,例如使用“日期”作为 PartitionKey 以显示在仪表板中 不确定删除数据以节省存储成本是否有意义我认为#2 是要走的路,但我不确定对于简单且具有成本效益的任务来说,最好的“堆栈”是什么。
【问题讨论】:
您能否在仪表板上描述您需要哪些指标和查询?例如,流分析不适用于运行“向我显示上个月 Fred 的所有订单”的查询,但它非常适合返回不断更新的“5 分钟滑动窗口中的订单计数”。基本上查询是固定的,数据是流式的(与典型的数据库查询相反,其中数据是相当静态的,查询可以更改) 指标/查询类似于“显示用户 X 昨天订购了多少披萨”或“显示上个月来自 XX 城市的所有订单的最常用食材”。 【参考方案1】:我建议您考虑实施一些遵循 Lambda 架构的技术。基本上这是分开的热路径和冷路径技术。这是一个很好的introduction,尽管我不会只关注詹姆斯提到的技术。
如果您有一些常规查询,例如“在滚动 5 分钟窗口中订购的比萨饼数量”,则 Azure 流分析可以输出这些聚合的恒定流。
然后,披萨订单事件也可以存档在 Blob 存储中,以便摄取到某些批处理技术中。例如,每天或每小时加载一次 Azure SQL 数据仓库(最近更名为 Azure Synapse Analytics)。然后,您的应用程序可以以特别的方式运行诸如“上个月最受欢迎的披萨配料”之类的查询。这些热路径和冷路径技术的组合应该比试图让一个工具来做所有事情更好。
另一种选择是 Spark。我建议查看 Azure Databricks 中的 Spark 流。您应该能够进行流式聚合,还可以为旧时间段的批量查询加载 Delta 表。这个article 可能会给你一个例子。
【讨论】:
以上是关于在 Azure 中使用 .Net 为大数据创建实时仪表板的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何在将 .net 核心项目发布到 azure 期间更改应用程序设置部分的值
使用 Elastic Stack 对 Azure Data Lake Storage Gen2 中的数据进行实时数据分析
带有 .NET 后端的 Azure 移动服务 - 数据库中已经存在一个对象