在优步,实时分析允许我们获得商业洞察力和运营效率,使我们能够制作数据驱动的决策来提高超级平台的经验。例如,我们的运营团队依赖于数据来监控我们平台上的市场健康和现货潜在问题;由机器学习模型供电的软件利用数据来预测骑车者供应和驾驶员需求;和数据科学家使用数据来改善机器学习模型以获得更好的预测。
在过去,我们已经利用了许多第三方数据库解决方案进行实时分析,但没有人能够同时解决我们所有的功能,可扩展性,性能,成本和运营要求。
aresdb是2018年11月发布的,是一个开源,实时分析引擎,利用非常规电源,图形处理单元(GPU),以使我们的分析能够以规模增长。GPU技术的实时分析的新兴工具在多年来显着提出,使其完全适合实时计算和并行数据处理。
在接下来的章节中,我们将描述AresDB的设计,以及这个强大的实时分析解决方案如何让我们更高效地统一、简化和改进Uber的实时分析数据库解决方案。在阅读了本文之后,我们希望您在自己的项目中试用AresDB,并发现该工具对您自己的分析需求也很有用!
优步的实时分析应用
数据分析对优步的业务成功至关重要。在其他函数中,这些分析用于:
我们可以将这些功能按照不同的需求分类如下:
| 仪表板 | 决策系统 | 特别的查询 | |
| 查询模式 | 众所周知 | 众所周知 | 随意的 |
| 查询QPS. | 高的 | 高的 | 低的 |
| 查询延迟 | 低的 | 低的 | 高的 |
| 数据集 | 子集 | 子集 | 所有数据 |
仪表板和决策系统利用实时分析系统,在高QPS和低延迟的情况下,对相对较小但高度有价值的数据子集(具有最大的数据新鲜度)进行类似的查询。
需要另一台分析引擎
实时分析在优步解决的最常见问题是如何计算时间序列聚合,从而为用户体验提供洞察的计算,以便相应地改善我们的服务。通过这些计算,我们可以在任意过滤(或有时加入)数据的时间范围内通过特定尺寸(例如日,小时,城市ID和跳闸状态)请求度量。多年来,优步已经部署了多种解决方案来以不同的方式解决此问题。
我们用于解决此类问题的一些第三方解决方案包括:
- Apache Pinot.,一个用Java编写的开源分布式分析数据库,可以用于大规模数据分析。Pinot内部使用lambda架构来查询柱状存储中的批量和实时数据,使用倒排位图索引进行过滤,并依赖星树进行聚合结果缓存。但是,它不支持基于密钥的重复数据删除、upsert、连接和高级查询功能,如地理空间过滤。此外,作为一个基于jvm的数据库,Pinot上的查询执行在内存使用方面的成本较高。
- Elasticsearch.用于优步使用各种流媒体分析需求。它建于ApacheLucene用于存储文档和倒排索引的全文关键字搜索。它已被广泛采用和推广到也支持聚集体。倒排索引支持过滤,但没有针对基于时间范围的存储和过滤进行优化。它将记录存储为JSON文档,增加了额外的存储和查询访问开销。和Pinot一样,Elasticsearch是一个基于jvm的数据库,因此不支持连接,并且它的查询执行需要较高的内存成本。
虽然这些技术具有自己的优势,但它们缺乏对我们用例的关键功能。我们需要一个统一,简化和优化的解决方案,并在禁区外(或者在GPU内)以外的解决方案来实现解决方案。
利用GPU进行实时分析
以高帧速率呈现图像的现实视图,GPU以高速处理大量的几何形状和像素。虽然在过去几年中,加工单元的时钟速率增加有奏效,但芯片上的晶体管的数量仅增加了每个摩尔定律.因此,以每秒十亿次浮点运算(gflops /s)为单位的GPU计算速度正在迅速增长。图1描述了NVIDIA gpu和Intel cpu在过去几年的理论gflops /s趋势:
在设计我们的实时分析查询引擎时,整合GPU处理是一个自然的选择。在优步,典型的实时分析查询处理数天的数据,其中包含数百万到数十亿条记录,然后在很短的时间内过滤和聚合这些数据。这个计算任务非常适合通用gpu的并行处理模型,因为它们:
- 并行处理数据很快。
- 提供更大的计算吞吐量(GFlops / s),使其适合可以并行化的重计算任务(每单位数据)。
- 与中央处理单元(CPU)相比,提供更大的计算到存储(ALU到GPU全局存储器)数据访问吞吐量(而不是延迟),使其成为处理需要大量数量的I / O(内存)的I / O(内存)的PASTALL任务数据的。
我们在使用基于GPU的分析数据库结算后,我们评估了一些现有的分析解决方案,为我们的需求提供了杠杆GPU:
- kinetica.这是一个基于gpu的分析引擎,最初于2009年面向美国军事和情报应用市场。虽然它展示了GPU技术在分析方面的巨大潜力,但我们发现许多关键功能缺失对于我们的用例,包括模式更改、部分插入或更新、数据压缩、列级内存/磁盘保留配置以及通过地理空间关系连接。
- OmniSci它是一个开源的、基于sql的查询引擎,看起来是一个很有前途的选择,但是当我们评估这个产品时,我们意识到它没有关键的功能优步使用案例的功能,例如重复数据删除。尽管OminiSci在2017年开放采购他们的项目,经过一些分析他们的C ++解决方案,我们得出结论,既没有贡献,也没有叉,他们的码级是可行的。
- 基于GPU的实时分析引擎,包括GPUQP那CoGaDB那GPUDB.那豹猫那OmniDB, 和弗吉尼亚人,经常被学术机构使用。然而,考虑到它们的学术目的,这些解决方案专注于开发算法和设计概念证明,而不是处理现实生产场景。因此,我们对它们的范围和规模进行了折扣。
全面的,这些引擎展示使用GPU技术的数据处理的巨大优势和潜力,并激发了我们为您的基于GPU的基于GPU的实时分析解决方案来调整我们的基于GPU的实时分析解决方案。考虑到这些概念,我们建造和开放了Sourced AresdB。
ARESDB架构概述
在较高的级别上,AresDB将其大部分数据存储在主机内存(连接到cpu的RAM)中,使用cpu处理数据摄取,并通过磁盘恢复数据。在查询时,AresDB将数据从主机内存传输到GPU内存,以便GPU并行处理。如图2所示,AresDB由一个内存存储、一个元数据存储和一个磁盘存储组成:
桌子
与大多数不同关系数据库管理系统(RDBMSS),ARESDB中没有数据库或架构范围。所有表属于相同的aresdb群集/实例中的相同范围,使用户能够直接引用它们。用户将其数据存储为事实表和维度表。
事实表
事实表存储了无限的时间序列事件流。用户使用事实表来存储实时发生的事件/事实,并且每个事件都与事件时间相关联,该表通常由事件时间查询。由事实表存储的信息类型的示例是TRIP,其中每个跳闸是事件,并且通常根据事件时间指定跳闸请求时间。如果事件具有与之相关的多个时间戳,则仅指定一个时间戳作为事实表中显示的事件的时间。
维度表
维度表存储实体的当前属性(包括城市,客户和驱动程序)。例如,用户可以在维度表中存储城市信息,例如城市名称,时区和国家/地区。与事实表相比,它无限地随着时间的推移而生长,尺寸表总是受大小的限制(例如,对于优步,城市表是由世界上实际城市的界限的限制)。维度表不需要特殊的时间表。
数据类型
下表详细说明了ARESDB中支持的当前数据类型:
| 数据类型 | 存储(以字节为单位) | 细节 |
| BOOL. | 1/8 | 布尔类型数据,存储为单位 |
| Int8, Uint8 | 1 | 整数类型。用户可以根据字段的基数和内存成本进行选择。 |
| Int16, Uint16 | 2 | |
| INT32,UINT32 | 4. | |
| Smallenum. | 1 | 字符串将自动翻译成枚举。Smallenum可以持有最多256的基数的字符串类型 |
| Bigenum | 2 | 与Smallenum类似,但持有高达65535的基数更高 |
| float32. | 4. | 浮点数。我们支持Float32,并打算根据需要添加Float64支持 |
| UUID | 16. | 普遍唯一的标识符 |
| 地理位点 | 4. | 地理分 |
| GeoShape | 可变长度 | 多边形或多多边形 |
使用aresdb,字符串转换为枚举类型(枚举)自动进入数据库之前,以获得更好的存储和查询效率。这允许区分大小写的平等检查,但不支持高级操作,例如连接,子字符串,globs和Regex匹配。我们打算在将来添加完整的字符串支持。
主要特征
ARESDB的架构支持以下功能:
- 基于列的存储带压缩存储效率(存储数据的字节数)和查询效率(查询时从CPU内存转移到GPU内存的数据更少)
- 使用主键重复数据删除的实时升级为高数据精度和接近实时的数据新鲜度在几秒内
- GPU支持的查询处理对于由GPU提供支持的高度并行化数据处理,渲染低查询延迟(子秒为秒)
柱状存储
向量
aresdb以柱状格式存储所有数据。每列的值存储为柱状值向量。每列中值的有效性/空心存储在单独的空向量中,具有一位表示的每个值的有效性。
住商店
aresdb.在动态存储中存储未压缩和未排序的列数据(动态向量).实时存储中的数据记录被分割为配置容量的(Live)批次。新批次在摄入时创建,而旧批次被归档后填写。主键索引用于定位重复数据删除和更新的记录。下面的图3展示了我们如何组织Live Records并使用主键值来定位它们:
批处理中的每列的值被存储为柱状矢量。每个值向量中的值的有效/空性被存储为单独的空向量,其中每个值的有效性由一位表示。在下面的图4中,我们提供一个具有五个值的示例city_id柱子:
归档存储
ARESDB还通过事实表存储存档商店中的成熟,排序和压缩柱状数据(存档向量)。存档商店中的记录也分为批次。与实时批次不同,一个归档批处理包含一个特定的协调世界时(UTC)日的记录。归档批处理使用自Unix Epoch以来的天数作为它的批处理ID。
记录按照用户配置的列排序顺序排序。如图5所示,下面,我们排序city_id第一个,然后是状态列:
配置用户配置的列排序顺序的目标是:
- 通过先前分类低基数列来最大化压缩效果。最大化的压缩会提高存储效率(存储数据所需的较少字节)和查询效率(从CPU传输到GPU内存的小字节)。
- 允许廉价的基于范围的预过滤的普通等滤波器,如city_id = 12..预热使我们能够最小化从CPU存储器转移到GPU存储器所需的字节,从而最大限度地提高查询效率。
仅当它以用户配置的排序顺序出现时,才会压缩列。我们不试图压缩高基数柱,因为压缩高基亚基列的储存量可忽略不计。
排序后,使用运行长度编码的变型压缩每个限定列的数据。除了值矢量和空向量之外,我们还介绍计数矢量以表示重复相同的值。
利用Upsert支持实时摄取
客户端通过发布Upsert Batch来通过摄取HTTP API进行摄取数据。UPSERT批处理是一种自定义序列化二进制格式,可最大限度地减少空间开销,同时仍然保持数据随机可访问。
当AresDB接收到一个用于注入的upsert批处理时,它首先将该upsert批处理写入重做日志,以便恢复。当一个upsert批处理被添加到重做日志的末尾之后,AresDB会识别并跳过事实表上的延迟记录,以便输入到实时存储中。如果一个记录的事件时间比归档的截止事件时间早,那么它就被认为是“晚了”。对于不被认为是“晚”的记录,AresDB使用主键索引在活动存储中定位应该应用它们的批。如下图6所示,全新的记录(之前根据主键值没有看到过)将被应用到空白区域,而现有的记录将被直接更新:
存档
在摄入时,记录要么被添加/更新到活动存储中,要么被添加到等待放置在归档存储中的回填队列中。
我们会定期对实时存储记录运行一个计划进程(称为归档),以将新记录(以前从未归档过的记录)合并到归档存储中。归档将只处理实时存储中的记录,其事件时间处于旧的截止时间(来自上次归档过程的截止时间)和新的截止时间(基于表模式中的归档延迟设置的新的截止时间)的范围内。
事件的记录将用于确定记录应该合并到日常批量中的记录应合并为哪些存档批处理。归档不需要在合并过程中重复数据删除,因为只存档旧截止和新截止范围之间的记录。
图7,下面,根据给定的记录的事件时间描述了时间轴:
在这个场景中,存档间隔是两次存档运行之间的时间,而存档延迟是在事件时间之后但在事件可以存档之前的持续时间。两者都在AresDB的表模式配置中定义。
回填
如上面的图7所示,事实表的旧记录(事件时间比归档截止时间更早)被附加到回填队列中,并最终由回填流程处理。当回填队列达到其阈值时,该进程也由时间或大小触发。与被实时存储摄取相比,回填是异步的,并且在CPU和内存资源方面相对更昂贵。回填用于以下场景:
- 偶尔处理非常迟到的抵达
- 手动固定来自上游的历史数据
- 填充最近添加的列的历史数据
与存档不同,回填是幂等的,需要基于主键值的重复数据删除。已回填的数据最终会对查询可见。
回填队列在具有预配置大小的内存中保持在内存中,并且在大量回填负载期间,客户端将被阻止在通过回填运行清除队列之前的程序。
查询处理
通过当前实现,用户需要使用阿瑞斯的查询语言(aql)由优步创建以运行针对aresdb的查询。AQL是一个有效的时间序列分析查询语言,不遵循从其他SQL类似的语言中选择的标准SQL语法。相反,AQL在结构化字段中指定,可以用JSON,YAML和GO对象携带。例如,而不是通过City_ID从TRIPS组中选择COUNT(*),其中status =“完成”和request_at > = 1512000000那JSON中等效的AQL写为:
{
“表”:“旅行”,
“维度”:[
{“sqlExpression”:“city_id”}
],
“措施”:[
{“sqlexpression”:“count(*)”}
],
“rowFilters”:(
“状态=‘完成’”
],
" timeFilter ": {
“列”:“Request_at”,
“来自”:“2天前”
}
}
在JSON格式中,AQL提供比仪表板和决策系统开发人员的SQL更好的编程查询体验,因为它允许它们使用代码轻松地撰写和操作查询,而无需担心SQL注入等问题。它是Web浏览器,前端服务器和后端服务器的典型体系结构上的通用查询格式,一直返回数据库(aresdb)。此外,AQL提供方便语法糖用于时间过滤和托管,具有本机时区支持。语言也支持这样的功能隐式子查询为避免常见的查询错误,并对后端开发人员进行查询分析和重写容易。
尽管AQL提供了各种好处,但我们充分意识到大多数工程师更熟悉SQL。公开用于查询的SQL接口是我们将研究的增强AresDB用户体验的下一步之一。
我们描绘了下面的图8中的AQL查询执行流程:
查询编译
将AQL查询编译为内部查询上下文.过滤器,尺寸和测量中的表达式被解析为抽象语法树(AST),以便通过GPU进行后续处理。
数据喂养
aresdb.使用预过滤器在将存档数据发送给GPU进行并行处理之前,可以对它们进行廉价的过滤。由于归档数据是根据配置的列顺序排序的,一些过滤器可以通过应用二叉搜索来定位相应的匹配范围来利用这个排序的顺序。特别地,所有第一个X排序列上的等过滤器和排序X+1列上的可选范围过滤器可以作为预过滤器处理,如下图9所示:
在预过滤后,只需要将绿色值(满足过滤条件)被推到GPU以进行并行处理。输入数据被馈送到GPU并一次执行一批。这包括实时批处理和存档批次。
aresdb利用CUDA溪流用于流水线数据馈送和执行。在每个查询中交替使用两条流,以便在两个重叠阶段处理。在下面的图10中,我们提供了这个过程的时间线图示:
查询执行
为简单起见,aresdb利用了推力图书馆实现查询执行过程,它提供了在当前查询引擎中快速实现的微调并行算法构建块。
在Thrust中,使用随机访问迭代器访问输入和输出向量数据。每个GPU线程将输入迭代器查找到其工作负载位置,读取值并执行计算,然后将结果写入输出迭代器的对应位置。
AresDB遵循每内核一个操作符(OOPK)模型来计算表达式。
下面的图11演示了从维度表达式生成的示例AST上的这个过程Request_at - Request_at % 86400.在查询编译阶段:
在OOPK模型中,ARESDB查询引擎遍历AST树的每个叶节点并返回其父节点的迭代器。在根节点也是叶的情况下,根动作直接在输入迭代器上拍摄。
在每个非根非叶节点(Modulo操作在该示例中,分配临时划痕空间矢量以存储由此产生的中间结果request_at % 86400表达。杠杆推出,启动内核功能以计算GPU上此运算符的输出。结果存储在临时空间迭代器中。
在根节点处,以与非根非叶节点相同的方式启动内核函数。根据表达式拍摄不同的输出操作,如下所示:
- 过滤作用,以减少输入向量的基数
- 将尺寸输出写入尺寸向量以获取以后的聚合
- 将测量值输出到稍后聚合的测量向量
表达评估后,排序和减少执行以进行最终聚合。在排序和约简操作中,我们使用维向量的值作为排序和约简的关键值,度量向量的值作为聚集的值。通过这种方式,具有相同维值的行将被分组并聚合在一起。下面的图12描述了这个排序和约简过程:
AresDB还支持以下高级查询功能:
- 加入:目前ARESDB支持哈希从事实表到尺寸表
- HyperLoglog基数估计:ARESDB实现HyperLoglog算法
- Geo相交:目前AresDB只支持geoppoint和GeoShape之间的交叉操作
资源管理
作为基于内存的数据库,AresdB需要管理以下类型的内存使用情况:
| 分配 | 管理模式 | |
| 实时商店向量(Live Store ColumarAl数据) | C | 追踪 |
| 归档存储向量(归档存储列数据) | C | 管理(负载和驱逐) |
| 主键索引(用于重复数据删除的哈希表) | C | 追踪 |
| 回填队列(商店“迟到”到达数据等待回填) | 戈兰 | 追踪 |
| 归档/回填过程临时存储(存档期间分配的临时内存和回填过程) | C | 追踪 |
| 摄入/查询临时存储; 过程开销; 分配破碎 |
Golang和C | 静态配置估计 |
当aresdb进入生产时,它会利用配置的总内存预算。此预算由所有六种内存类型共享,也应留出足够的空间用于操作系统和其他流程。此预算还涵盖了静态配置的架空估计,由服务器监视的实时数据存储,以及服务器可以决定加载和驱动的存档数据,具体取决于剩余的内存预算。
下面的图13描述了AresDB主机内存模型:
aresdb允许用户在列级别配置在列级别的预装载天和优先级,并且只在预装载天内预加载存档数据。非预加载数据从磁盘加载到内存中。完整后,AresdB还会从主机内存中逐出存档数据。ARESDB的驱逐政策基于预加载天数,列优先级,批次的日期以及列大小的数量。
AresDB同时管理多个GPU设备,将设备资源建模为GPU线程和设备内存,跟踪GPU内存使用情况,作为处理查询。AresDB通过设备管理器管理GPU设备,该设备管理器以两个维度建模GPU设备资源——GPU线程和设备内存——并在处理查询时跟踪使用情况。在查询编译之后,AresDB允许用户估计执行查询所需的资源量。在允许开始查询之前,必须满足设备内存需求;如果此时任何设备上没有足够的内存,则查询必须等待运行。目前,AresDB可以在同一GPU设备上同时运行一个或多个查询,只要该设备满足所有的资源需求。
在当前实现中,ARESDB不缓存设备存储器中的输入数据以用于跨多个查询重用。ARESDB针对支持在实时更新的数据集上的查询,并且难以正确缓存。我们打算在aresdb的未来迭代中实现数据缓存功能GPU内存,这将有助于优化查询性能的步骤。
用例:Uber的总结仪表盘
在优步,我们使用AresDB来构建仪表盘,提取实时业务见解。AresDB扮演的角色是通过不断更新来存储新鲜的原始事件,并使用GPU以较低的成本在几秒内计算关键指标,这样用户就可以交互地使用仪表板。例如,匿名旅行数据在数据存储中寿命很长,它由多个服务进行更新,包括我们的调度、支付和评级系统。为了有效利用起下钻数据,用户将数据分割成不同的维度,以获得实时决策的洞察力。
Leveraging AresdB,优步的摘要仪表板是一家广泛使用的分析仪表板,由整个公司杠杆杠杆,以检索相关产品指标并实时响应以提高用户体验。
要构建模拟仪表板,我们建模了以下表:
旅行(事实表)
| trip_id | Request_at. | city_id | 地位 | driver_id. | 票价 |
| 1 | 1542058870. | 1 | 完全的 | 2 | 8.5 |
| 2 | 1541977200 | 1 | 拒绝了 | 3. | 10.75 |
| ...... |
城市(维度表)
| city_id | city_name | 时区 |
| 1 | 旧金山 | 美国/ Los_Angeles. |
| 2 | 纽约 | 美国/ New_York |
| ...... |
Aresdb中的表格架构
要创建上述两个建模表,我们将首先需要在以下模式中创建aresdb中的表:
| 旅行 | 城市 |
| { “姓名”:“旅行”, “列”: [ { “名称”:“request_at”, “类型”:“Uint32”, }, { “名称”:“trip_id”, “类型”:“UUID” }, { “名称”:“city_id”, “类型”:“Uint16”, }, { “姓名”:“状态”, “类型”:“SmallEnum”, }, { “名称”:“driver_id”, “类型”:“UUID” }, { “姓名”:“票价”, “类型”:“float32”, } ], “primaryKeyColumns”:[ 1 ], “isFactTable”:没错, "配置":{ “批量化”:2097152, “ArchivingDelayminutes”:1440, “archivingIntervalMinutes”:180年, “RecordretentionInday”:30 }, “archivingSortColumns”:[2,3] } |
{ “名称”:“城市”, “列”: [ { “名称”:“city_id”, “类型”:“Uint16”, }, { “姓名”:“city_name”, “类型”:“Smallenum” }, { “名称”:“时区”, “类型”:“SmallEnum”, } ], “primaryKeyColumns”:[ 0. ], “isfacttable”:假, "配置":{ “批量化”:2097152 } } |
如架构中所述,TRIPS表创建为事实表,表示实时发生的事件,而城市表将创建为维度表,存储有关实际城市的信息。
创建表后,用户可以利用ARESDB客户端库从事件总线(如Apache)摄取数据卡夫卡,或流或批处理处理平台,如apachefl或Apache火花.
对ARESDB的示例查询
在模拟仪表板中,我们选择两个指标作为示例,总旅行票价和活动驱动程序。在仪表板中,用户可以为指标过滤城市,例如。旧金山。要为仪表板中显示的最后24小时绘制这两个度量标准的时间序列,我们可以在AQL中运行以下查询:
| 在过去24小时的旧金山班级班车总数 | 旧金山的活跃司机在最后24小时的小组逐个小组 |
| { “表”:“旅行”, “加入”:[ { “别名”:“城市”, “名称”:“城市”, “使适应”: [ “城市.ID = trips.city_id” ] } ], “维度”:[ { “sqlexpression”:“请求_AT”, “TimeBucketizer”:“小时” } ], “措施”:[ { :“sqlExpression总和(票价)” } ], “rowFilters”:( “状态='完成'”, “cites.city_name ='旧金山'” ], " timeFilter ": { “列”:“Request_at”, " from ": " 24小时前" }, “TimeZone”:“America / Los_Angeles” } |
{ “表”:“旅行”, “加入”:[ { “别名”:“城市”, “名称”:“城市”, “使适应”: [ “城市.ID = trips.city_id” ] } ], “维度”:[ { “sqlexpression”:“请求_AT”, “TimeBucketizer”:“小时” } ], “措施”:[ { “sqlexpression”:“countdistinthll(driver_id)” } ], “rowFilters”:( “状态='完成'”, “cites.city_name ='旧金山'” ], " timeFilter ": { “列”:“Request_at”, " from ": " 24小时前" }, “TimeZone”:“America / Los_Angeles” } |
查询的示例结果:
上面的模型查询将在以下时间序列结果中产生导致,这可以很容易地绘制到时间序列图中,如下所示:
| 在过去24小时的旧金山班级班车总数 | 旧金山的活跃司机在最后24小时的小组逐个小组 |
| { “结果”:[ { “1547060400”:1000.0, “1547064000”:1000.0, “1547067600”:1000.0, “1547071200”:1000.0, “1547074800”:1000.0, ...... } ] } |
{ “结果”:[ { “1547060400”:100, “1547064000”:100, “1547067600”:100, 100年“1547071200”: 100年“1547074800”: ...... } ] } |
在上面的例子中,我们演示了如何利用AresdB在几秒钟内进行实时发生的原始事件,并立即向数据进行任意用户查询,以计算子秒中的度量。ARESDB帮助工程师轻松构建提取对企业至关重要的数据产品,这些产品需要对人类或机器决策的实时见解的实时洞察力。
下一个步骤
AresDB在优步被广泛应用于我们的实时数据分析仪表盘,使我们能够就我们业务的无数方面做出大规模的数据驱动决策。通过开源这个工具,我们希望社区中的其他人能够利用AresDB进行自己的分析。
未来,我们打算在以下方面加强该项目:
- 分布式设计:我们正在努力构建ARESDB的分布式设计,包括复制,分片管理和架构管理,以提高其可扩展性并降低运营成本。
- 开发人员支持和工具:自2018年11月开放采购aresdb以来,我们一直在努力建立更直观的工具,重构代码结构和丰富文档以提高船上体验,使开发人员能够将AresDB快速集成到其分析堆栈中。
- 扩展功能集:我们还计划展开“查询功能”设置为包含窗口函数和嵌套循环连接等功能,从而允许该工具支持更多用例。
- 查询引擎优化:我们还将展望开发更高级的方式来优化查询性能,例如低级虚拟机(LLVM)和GPU内存缓存。
aresdb是开放的在Apache许可下。我们鼓励您试用AresDB并加入我们的社区。
如果建立大规模的,实时数据分析技术对您来说兴趣,请考虑在我们的团队中申请职位。
确认
特别感谢汉字张,珍妮弗安德森,尼克尔·乔什,阿比··昆明,盛悦吉,朱曼索曼,祥芙,大卫陈,以及李宁,使这个项目的成功很棒!





