【发布时间】:2016-04-15 00:51:21
【问题描述】:
情况: 我开始了一份新工作,并被分配了弄清楚如何处理他们的传感器数据表的任务。它有 13 亿行传感器数据。数据非常简单:基本上只是一个传感器 ID、一个日期和那个时间点的传感器值(双精度)。
目前,数据存储在 MSSQL Server 数据库的表中。
到今年年底,我预计行数将增加到 2-30 亿。
我正在寻找一种更好的方式来存储和查询这些数据(按日期),并且由于我们那里有很多“大数据”产品,而我没有管理此类大数据集的实际经验,我'我在这里询问任何指针。
这不是一家大公司,我们的资源也不是无限的;)
关于我们的用例的更多细节:
- 数据以图表形式绘制,并显示传感器随时间变化的值。
- 我们计划创建一个 API,让我们的客户可以获取他们感兴趣的任何时间段的传感器数据(... 2 年前的数据与上个月的数据一样重要)。
到目前为止,我的研究使我考虑了以下解决方案:
-
将数据保存在 SQL Server 中
但是对表进行分区(它现在没有分区)。这需要企业版的 SQL Server,成本很高。
-
将数据移动到 Azure SQL Server。
在那里,我们将以更少的钱获得分区功能,但是一旦我们的数据库增长到 250GB 以上,它的成本就会高得多(而且超过 500GB 的成本太高了)。
-
使用多个数据库
我们可以为每位客户使用 1 个数据库。几个较小的 DB 会比 1 个大 DB 便宜,但我们有很多客户并计划更多,所以我不太喜欢考虑管理所有这些数据库。
-
Azure 存储表
这是迄今为止我最喜欢的选项。我们可以按公司/传感器/年/月对数据进行分区,使用日期作为行键并存储传感器值。
我还没有时间测试查询性能,但从我阅读的内容来看应该不错。但是有一个主要的缺点,那就是每个 HTTP 请求返回 1000 个项目的限制。如果我们需要获取一周内的所有传感器数据,我们需要发出大量的 HTTP 请求。我现在不确定这对我们的用例来说有多大的问题。
-
Azure HDInsight(Azure 中的 Hadoop)
如前所述,我没有使用大数据的经验,目前我对 Hadoop 的了解还不够好,无法知道它是否适合我们的情况(通过 API 在给定的时间跨度内公开传感器数据)。我应该深入挖掘并学习,还是将时间花在寻找另一种选择上更好?
有没有人有类似案例的经验。什么对你有用?请记住,价格很重要,“简单”的解决方案可能比非常复杂的解决方案更受欢迎,即使复杂的解决方案性能要好几秒钟。
更新 1: 回答下面cmets中的一些问题。
- 大约有 12,000 个传感器,它们可能每 15 秒报告一个值。这相当于每天约 7000 万。实际上,并非所有这些传感器都打开了“报告”功能,因此我们每天不会获得那么多数据,但是由于我们自然希望扩展更多的客户和传感器,我真的需要一个可以扩展到每天有数百万个传感器值。
- 分区是一种解决方案,虽然我可以使用多个数据库和/或多个表,但如果/当我用尽其他解决方案时,我认为这是一种后备方案。
- 我已经阅读了更多关于 HBase、http://opentsdb.net/ 和 google 的 https://cloud.google.com/bigtable/ 的内容,看起来 Hadoop 至少可以成为一个真正的替代品。
更新 2: 今天,我对 azure table storage 和 HDInsight (HDI) 都有了一些了解。我们对查询“灵活性”的要求并不高,因此我认为 Azure 表存储看起来很有前途。正如我提到的,由于每个请求的 1000 项限制,提取数据有点慢,但在我的测试中,我认为它对于我们的用例来说已经足够快了。
我还偶然发现了 OpenTSDB,这也是我最初尝试 HDI 的原因。按照 Azure (https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hbase-tutorial-get-started/) 上的教程,我能够非常快速地存储一百万条记录并测试一些查询。查询比 Azure 表存储快得多。我什至可以在一个 http 请求中拉下 300 000 条记录(不过需要 30 秒)。
但它的成本比 Azure 表存储高出不少,而且我认为我可以优化我的代码以提高 Azure 表存储的查询性能(更细粒度的分区键和并行运行请求)。因此,由于简单、价格和“足够好”的性能,我现在倾向于使用 Azure 表存储。
我很快将向外部顾问展示我的发现,因此我也很高兴了解他对事物的看法。
【问题讨论】:
-
在我尝试任何事情之前,请阅读 SQL Server 中的 partitioned tables。或者,如果您打算跨多个服务器存储数据,请阅读 partitioned views(参见 Partitioned Views 部分)。
-
您提到客户...如果您将传感器数据放在一个没有客户ID 的大表中,客户如何绑定到这个?是否有与传感器的映射?为什么我要问:我想,您的查询不会针对所有客户进行查询,而是始终针对一个特定客户的数据进行查询-对吗?如果是:每个客户有多少行?您可能会为每个客户考虑一张表,所有表都具有相同的结构、索引、约束……这需要一个带有动态 SQL 的 TVF,其余的可以保持不变……
-
此外,如果您经常需要报告一组标准聚合,请研究索引视图,它将完全管理在单独的索引中缓存各种预定义聚合的过程。
-
是否有任何类型的数据逻辑分组?传感器是分组的吗?时间段是分组的吗?您也许可以将所有这些存储在一个多维数据集中。在应用任何智能之前,您需要更彻底地了解数据的报告方式。
-
如果他们不想要非常低级别的细节(即一天中的每一秒),那么多维数据集可能不是答案。如果它肯定是按客户划分的,那么这绝对是您可以通过对客户数据进行分区并可能在时间段上进行聚类来处理的事情。这是一种以关系数据库为中心的方法。
标签: sql-server hadoop azure-table-storage azure-hdinsight bigdata