被忽视的位图数据库:Pilosa查询十亿级出租车搭乘数据案例

2017-06-07 Jesse 译 高可用架构 高可用架构

Pilosa 是一个开源的分布式内存位图索引,可以针对海量数据集对查询进行加速,适合在用户数据查询以及用户画像等场景使用,但在另外一方面,非稀疏的关系型数据是否也可以使用 Pilosa 来查询?


本文阅读需要 4 分钟。


Pilosa 最初是为分析用户属性数据(稀疏并且高基数)而准备的。所以当我们准备围绕 Pilosa 创建一家公司时,第一步就是评估在其他类型数据上的效果。

虽然用户细分的属性数量非常多,但数据却非常稀疏,这是因为很多属性只与少数人相关联,大部分人只有几百个或几千个属性。 Pilosa 可以非常优雅地处理这种场景,它能够在几毫秒内筛选数百万个属性的任意组合,从而找到满足该条件的用户。


图片由 Umbel 提供


对于用户细分数据,我们可以使用 Pilosa 处理这类问题。然而,如果我们希望 Pilosa 成为通用索引,那么它将不仅能支持分段查询而且不仅再稀疏而高基数的数据上工作。


为了测试 Pilosa,我们需要一个具有密集的,较低基数的数据集,并最好是能通过其他解决方案进行探讨,以便评估我们如何处理该问题。


纽约市政府开放的十亿出租车搭乘数据集(下载请参阅文末链接 4)完美符合以上条件,有很多分析该数据的文章,下面列出的仅仅是少数几个链接:


(译者注:数据集中包含上下车时间、地点、距离、车费、支付方式、乘客人数等字段)


  • Analyzing 1.1 Billion NYC Taxi and Uber Trips, with a Vengeance [1]

  • Kx 1.1 billion taxi ride benchmark highlights advantages of kdb+ architecture [2]

  • Should I Stay or Should I Go? NYC Taxis at the Airport [3]


对我们特别有用的是 Mark Litwintschik 和他编制的性能比较表的系列文章,这是结果表格供参考,其中分别使用了 Spark, PostgreSQL, Elasticsearch 等数据库来查询。



我们对 Pilosa 执行了相同的四个查询,以便我们可以同其他解决方案的性能进行比较。

以下是每个查询的描述:

  1. 每个司机搭乘了多少位乘客?

  2. 对于每位乘客来说,打车平均花多少钱?

  3. 每一年,每位乘客会打几次车?

  4. 对于不同乘客人数,年份,旅行距离的组合,乘客数量有多少,结果按年度乘客数量降序排列。


现在我们有一个数据集和一组查询,都远远超出了 Pilosa 的最适合做的领域,以及对不同硬件/软件组合的长期性能对比。

如果您想了解如何在 Pilosa 中建模数据集并构建查询,请参阅我们的运输用例文章 [6]。

现在我们并非只有数千万的 boolean 属性,其中一些属性具有更复杂的类型:整数,浮点,时间戳等等。总而言之,相比之下这个数据集更适合用关系型数据库。

我们在 AWS c4.8xlarge 实例上架起了一个 3 节点的 Pilosa 集群,并附加了一个 c4.8xlarge 实例来加载数据。我们使用 pdk 工具将数据加载到 Pilosa 中,使用以下命令行参数:


pdk taxi -b 2000000 -c 50 -p <pilosa-host-ip>:10101 -f
<pdk_repo_location>/usecase/taxi/greenAndYellowUrls.txt


这个过程需要大约 2 小时 50 分钟,其中包括从 S3 下载所有的 csv 文件,解析它们,并将数据加载到 Pilosa 中。

如果我们将结果添加到 Mark 表中,它将如下所示:



请注意,每个组合的软硬件都不同,所以直接比较是很困难的。

我们应该注意到,Pilosa 在“查询1”上有一些“作弊”(由于其存储数据的方式,Pilosa 已经预先计算了此结果),因此查询时间大部分是网络延迟。

然而,对于其余的查询,Pilosa 表现非常出色 - 在某些情况下,可以胜过异构硬件,如多 GPU 配置。查询3 的 0.177s 时间特别令人吃惊,与 Nvidia Pascal Titan Xs 的表现相似。看起来 kdb+/q 也很好,但是请记住,Xeon Phi 7210 每个芯片有 256 个硬件线程,以及 16GB 的内存。这使它们的性能和内存带宽更接近于 GPU。当然价格也很贵,约 2400 美元。

对于我们来说,这些结果足以让我们花费更多的时间优化 Pilosa 用于其他方面。由于 Pilosa 的内部位图压缩格式没有针对密集数据进行优化,我们在这方面进行了更多的研究,并获得了令人振奋的结果,所以我们有理由认为这些数字还有很大的改进空间。


更多了解 Pilosa 源代码:

https://github.com/pilosa/pilosa


相关链接:


  1. http://toddwschneider.com/posts/analyzing-1-1-billion-nyc-taxi-and-uber-trips-with-a-vengeance/

  2. https://kx.com/2017/01/25/kx-1-1-billion-taxi-ride-benchmark-highlights-advantages-kdb-architecture/

  3. http://chriswhong.com/open-data/should-i-stay-or-should-i-go-nyc-taxis-at-the-airport/

  4. billion taxi ride datase http://www.nyc.gov/html/tlc/html/about/trip_record_data.shtml

  5. pilosa 项目地址:https://github.com/pilosa/pilosa

  6. https://www.pilosa.com/use-cases/taming-transportation-data/


推荐阅读



本文作者 Matt Jaffee 及 Alan Bernstein,由 Jesse 翻译,转载请注明出处,技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。


高可用架构

改变互联网的构建方式


长按二维码 关注「高可用架构」公众号

高可用架构最近文章:

解读来自Google的程序必备最新高科技-从 F1 Query 论文看 SQL 查询的执行模式10月17日

F1是Google的分布式数据库,问世以来一直受到大家的关注。其中分布式查询引擎怎么实现,也一直是数据库界最关心的问题之一。F1团队在VLDB2018上发表了论文详细论述该话题。本文是对该问题的详细剖析,十分值得架构师和数据库从业人员学习。

技术迭代这么快,技术人在下半年应该学习什么?10月16日

技术人过了35岁(或者40岁)是不是就失去了竞争力,只能选择转岗?面临越来越大的压力,技术人需要注意什么?怎样让职业发展更加顺利?如果你有这些疑问,到了你需要阅读本文的时候了。

Memcache/Redis集群管理探索与实现:美图开源PaaS平台资源网关10月10日

本文首次详细介绍美图在Memcache/Redis PaaS化的过程中的思考与经验。

大规模MySQL运维陷阱:使用MyCat踩坑篇9月29日

MyCat是最常见的数据库代理之一。在MySQL数据库碰见容量或者性能极限问题的时候,可以使用MyCat来做分库分表。使用MyCat需要注意什么,怎样灵活使用它,这些问题都在本文中有对应答案。

5分钟学会Java 9~Java11的七大新特性9月28日

经过数月开发,Java 11 终于发布了,然而很多人还在用Java 8,我们一起来看一看 Java 9 - 11中的新特性。本文简要介绍了这些新特性,并有代码样例,十分适合工程师,架构师,技术经理阅读。

热门文章:

G20微笑助跑,健康炫腹行2016年5月24日

小蛮腰,小蛮腰,初夏必露,减肥了这么久,好身材终于有机会露一露了!

桐学会——"岳家军"12晋4小组PK赛第一场2016年5月25日

      今天中午12点,2016宏宝莱·加悠棒“校园好声音”小组晋级赛迎来最后一支战队“岳家军”,导师岳

没想到!决定寿命长短不是运动,而是……2016年5月30日

2009年诺贝尔生理学奖得主伊丽莎白等总结出的长寿之道是:人要活百岁,合理膳食占25%,其它占25%,而心理

二胎妈妈的肺腑之言:有了老二后才明白,孩子就得“糙”着养!2016年5月30日

优妈身边有不少二胎妈妈,大家平日聚一起,话题总扯不开孩子。家里有两个孩子,肯定就有各种对比嘛:我怀大宝的时候

火速扩散!6月7日至9日,赣州中心城区这些路段实行交通管制!2016年6月3日

注意啦!6月7日至9日中心城区部分道路将实行交通管制!2016年全国普通高等学校招生考试于6月7日至9日

(┯_┯)广告君被屏蔽了~~~

感谢您的支持,请按照如下步骤取消屏蔽ABBAO的广告(详细步骤):