实时分析大数据 #1
F1 如何开始使用 StreamInsight 向您的屏幕实时广播数据分析。
引言
本文基于我与 McLaren Electronic Systems、Formula 1 Management 的谈话和咨询,以及我自己在 Microsoft StreamInsight 方面的经验和公开信息。
观看 F1 比赛时,你是否曾想过,车内的所有数据是如何传输到你的电视屏幕上的,或者车队是如何根据比赛的进展来改变策略和做出决定的?如果你的答案是肯定的,那么请继续阅读……
背景
如今,大多数电视体育转播都伴随着大量的统计数据。无论是网球比赛中的发球速度,还是足球比赛中的跑动距离和传球准确率,及时将这些数据传递给观众正变得越来越重要,因为它极大地提升了观众的观赛体验。一辆平均的 F1 赛车包含大约 80,000 个 组件,并配备多达 300 个 传感器,通过 ECU 传输遥测数据,并通过无线电波发送出去。在一场比赛中,这可以产生 15 亿个数据点,即使经过压缩,也代表着几个 GB 的数据。
这是一个需要处理和分析的海量动态数据!
如果你是一个 F1 车队,如何管理和解读这些数据,可能决定你是做出能赢得比赛的战略决策,还是做出代价数百万赞助费的失误。而对于观众来说,知道你喜欢的车手正在追赶前方的赛车(由于燃油消耗过高而不得不减速以完成比赛),只会增加比赛的刺激感和理解度。
F1 使用 McLaren Electronic Systems 开发的名为 Advanced Telemetry Linked Acquisition System (ATLAS) 的系统,将赛车信息传递到赛道旁的天线,然后再传给维修站墙上的车队和电视广播公司。
客户端连接到以太网骨干网,通过 TCP 和 UDP 接收信息。但这些是原始的非结构化数据,接收它们就像盯着水龙头,而有人正在打开水龙头一样。
那么,有什么技术可以用来从这些海量信息中提取有意义的见解呢?事实上,面对类似的情况,您可以使用什么来为您的客户提供价值呢?
介绍 Microsoft StreamInsight
本赛季,F1 的广播公司开始引入一个使用 Microsoft StreamInsight 的新系统,该系统可以过滤原始遥测数据并从中提取有用的统计数据。例如,如果一个典型的燃油传感器每秒只测量当前油量,那么如果您已经知道体积和密度,就可以计算出流量或使用量。
StreamInsight 属于一类称为复杂事件处理 (CEP) 的应用程序,是微软提供的实时数据流处理解决方案。目前已更新至 2.3 版本,StreamInsight 是最易于配置和使用的 CEP 系统。
对于熟悉 LINQ 和 Observables 等概念的 C# 开发人员来说,将能够轻松地迁移他们的技能。此外,只要您拥有 Microsoft SQL Server 许可证,StreamInsight 就可以免费使用和部署。
由于 StreamInsight 是免费的,微软没有动力去销售它,这可能也是它鲜为人知的原因之一。但通过定制现成的 CEP 系统,我们可以利用那些原本会被忽略的数据和数据模式。
CEP 概念
所有 CEP 系统都共享一些共同的概念,如果您以前处理过数据库,那么这些概念应该都比较熟悉。以下是您需要了解的内容,以便将思维从静态数据查询转移到过滤动态数据。
事件流
任何数据序列,无论是静态的还是动态的,都可以被视为一个流。就像 FileStream
(它只是一个字节序列)一样,汽车的速度可以表示为随着时间推移而增长的数字序列。为每个数据点打上时间戳,您就得到了一个复杂事件的时间序列,也称为事件流。
查询、过滤器、源和接收器
使用 SQL 等语言,我们可以查询数据库源表,并返回一部分数据给我们(接收器)。例如:
SELECT * FROM Speedometer WHERE lap = 10
同样,对于事件流,我们可以使用 Linq 实时过滤源流,并将结果输出到新的流中。
var sinkEventStream = from datapoint in speedometerEventStream
where datapoint.lap = 10
select datapoint;
在此示例中,我们创建了一个名为 sinkEventStream
的接收器,每次有新事件进入源(speedometerEventStream
)时,如果其“lap”属性为 10,则它会被添加到接收器中。
连接、窗口和分区
窗口本质上是对 静态
数据(SQL)的动态视图,或者是对动态数据(CEP)的固定长度视图。在 CEP 中,窗口可以是滑动(即连续移动)的,也可以是分段的(以离散的量移动)。
例如,假设我们有两个传感器向以下 SQL 表提供数据:
燃油液位
单圈时间
您可以使用 SQL 窗口函数连接和分区数据,以跟踪单圈的平均燃油量。
SELECT l.Lap , f.Fuel, AVG(f.Fuel )
OVER(PARTITION BY l.Lap ) AS "Average Fuel This Lap" FROM
FuelLevel f
Join LapTime l
on f.Time = l.Time
同样,使用 StreamInsight,我们可以连接流、对它们进行分组,然后根据时间或任意值对它们进行分区。
CepStream<Fuel> FuelLevel;
CepStream<Lap> LapTime;
var joined = from f in FuelLevel
join l in LapTime
on f.Time equals l.Time
select new LapAndFuel() { FuelLevel = f.FuelLevel, Lap = l.Lap};
var AverageFuelStream = from win in
joined
group win by win.Lap into eachGroup
from window in eachGroup.SnapShotWindow()
select new {Average = window.Avg(), Lap = window.Lap};
因此,本质上,StreamInsight
提供了与 SQL Server 相同的许多功能,并且具有一切都在实时发生的额外优势。将其与轻松调用其他子系统的能力相结合,您就拥有了一个可以监控数据并做出智能决策的系统的雏形。
未来文章
这只是对 CEP 和 MS StreamInsight 的简要介绍,但在未来的文章中,我计划演示一些实际示例,并描述您在现实生活中可能使用的各种工具和部署场景。
历史
- 创建
- 图片大小
- 文章系列链接