DolphinDB分区数据库教程(二)
文章提供标题、作者与发布日期信息,并概述本文将讲解 DolphinDB 分区原则与特殊分区方案。
Source: https://dolphindb.cn/blogs/45
What this page covers
- 分区原则:分区字段选择与分区粒度建议。
- 如何均匀分区:数据分布不均问题与 cutPoints 辅助方法。
- 时序类型分区:时间范围预留与类型兼容规则。
- 共存储位置分区:提升分布式 join 效率的方法与示例。
- 多副本机制:默认值、配置参数与可靠性等级建议。
- 事务机制:磁盘表事务支持、隔离机制与限制。
- 多 Writer 并行写入:并行加载思路与避免冲突注意事项。
技能认证特训营第二期正式开启(限时报名)
页面顶部提供活动报名提示与链接入口。
- 该区域包含“技能认证特训营第二期”的报名入口信息。
- 该区域提供外部报名链接。
DolphinDB分区数据库教程(二)
文章展示标题、作者与发布日期,并给出本文主题简介。
- 作者署名为 Junxi。
- 发布日期为 2021-08-05。
- 内容范围包括分区原则与特殊分区方案的讲解。
1. 分区原则
介绍分区的总体目标,并给出分区字段选择与分区粒度大小的建议及原因。
- 分区总体目标是提升数据管理效率与查询计算性能。
- 分区字段允许的数据类型包括整型、日期类型与 SYMBOL。
- STRING、FLOAT、DOUBLE 不可作为分区字段。
- TIME/SECOND/DATETIME 类型分区在实际使用中需谨慎。
- 单个分区最大记录条数为 20 亿条。
- 子任务以分区为单位划分。
- 分区粒度过大可能导致并行时内存不足或性能受影响。
- 分区粒度过小会增加通信与调度成本。
- 建议每分区未压缩前数据量不要小于 100M。
2. 如何把数据均匀分区
说明数据分布不均的影响,并给出使用 cutPoints 函数与示例代码辅助均匀分区。
- 数据分布不均会造成系统负荷不均衡。
- 作业延时可能增大,因为结果需等待最后子任务完成。
- cutPoints(X, N, [freq]) 用于根据数据分布生成分组边界。
- 该函数目标是使数据在 N 个组中更均匀分布。
- 函数返回一个包含 (N+1) 个元素的数组。
- 列表分区可作为解决数据分布不均的另一种方法。
3. 时序类型分区
讲解时间字段分区的范围预留、按天分区示例,以及分区字段类型与表字段时间类型的兼容规则。
- 以时间字段分区时,需要预留足够空间容纳将来数据。
- 示例展示按天分区的时间范围:2000.01.01 到 2030.01.01。
- 只有实际数据写入时,数据库才会创建需要的分区。
- 分区字段类型与表的实际时间类型可不一致。
- 兼容条件是分区字段类型精度不高于实际数据类型精度。
4. 不同表相同分区的数据存放于同一节点
介绍共存储位置分区机制以提升 join 效率,并给出示例与 OLAP/写入特性说明。
- 多个分区表 join 可能耗时,因为涉及跨节点复制数据。
- 共存储位置分区机制使相同分区的数据存储在相同节点。
- 该机制用于提升分布式连接效率。
- 当前版本不支持连接采用不同分区机制的多个分区表。
- 示例中 quotes 与 trades 采用相同分区机制(date 与 sym 作为分区键)。
5. 多副本机制
说明分区多副本的默认值与参数配置、目的、写入一致性机制,以及开发/生产环境的可靠性等级设置。
- DolphinDB 允许为每个分区保留多个副本。
- dfsReplicationFactor 默认值为 2。
- 可通过控制节点参数 dfsReplicationFactor 修改副本数量。
- 多副本用于在节点失效或磁盘损坏时提供容错。
- 多副本可在大量并发访问时提供负载均衡。
- 写入一致性通过两阶段事务提交机制实现。
- dfsReplicaReliabilityLevel 决定副本是否可驻留同一物理服务器。
- 生产阶段建议将 dfsReplicaReliabilityLevel 设置为 1。
6. 事务机制
说明基于磁盘表的事务支持、隔离机制,以及为优化性能设置的事务限制与并发写入规则。
- 基于磁盘(分布式文件系统)的表读写支持事务。
- 事务支持原子性、一致性、隔离性、持久化。
- 采用多版本机制实现快照级别隔离。
- 读操作与写操作互不阻塞以优化读性能。
- 一个事务只能包含写或读,不能同时包含写与读。
7. 多Writer并行写入
说明利用分区机制进行并行数据加载的思路,并给出 quotes 并行导入示例与避免同分区并发写入的注意事项。
- 单个数据表可支持几百万的分区数量。
- 并行数据加载适用于从其他系统导入海量数据或实时/准实时写入。
- 并行加载需要确保 writer 不会同时写同一个分区。
- 示例中每个 csv 文件保存一天的 quotes 数据。
- 示例使用按日期与股票代码的复合分区来组织数据。
官网与相关教程入口
提供官网链接、试用版下载提示与相关文章/教程入口。
- 页面提供 DolphinDB 官网链接。
- 页面提示可下载 DolphinDB 试用版。
- 页面提供相关教程入口。
Facts Index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| DolphinDB分区数据库教程(二) | 发布日期 | 2021-08-05 | high |
| DolphinDB分区数据库教程(二) | 作者署名 | Junxi | high |
| 本文内容范围 | 涵盖主题 | 详细讲解 DolphinDB 的分区原则与特殊分区方案,以加深对 DolphinDB 分区数据库的理解 | medium |
| 分区总体原则 | 目标 | 让数据管理更高效,提高查询和计算性能,达到低延时和高吞吐量 | medium |
| DolphinDB 分区字段 | 允许的数据类型 | 整型、日期类型、SYMBOL 类型 | high |
| DolphinDB 分区字段 | 不可以作为分区字段的数据类型 | STRING、FLOAT、DOUBLE | high |
| TIME/SECOND/DATETIME 类型分区使用建议 | 注意事项 | 实际使用中要谨慎使用,避免采用值分区,以免分区粒度过细导致创建/查询大量小分区耗时 | medium |
| 分区字段选择 | 业务相关性建议 | 分区字段应当在业务中相当重要;证券交易领域常用交易日期或股票代码分区 | medium |
| DolphinDB 单个分区 | 最大记录条数 | 20亿条 | high |
| 分区粒度过大 | 风险/影响 | 可能导致并行时内存不足或频繁在磁盘与内存间切换影响性能 | medium |
| 分区大小经验公式 | 建议上限 | 每个分区解压后在内存中的大小不超过 S/8W(S=数据节点可用内存,W=worker 数量) | high |
| 分区大小示例 | 建议上限(示例) | 工作内存上限 32GB、8 工作线程时,建议单个分区解压后大小不超过 512MB | high |
| DolphinDB 子任务划分 | 粒度 | 子任务以分区为单位 | high |
| 分区粒度过大与并行计算 | 影响 | 会导致无法有效利用多节点多分区优势,把可并行任务转化为顺序计算 | medium |
| DolphinDB 适用场景 | 删除/更新支持 | 支持添加数据,不支持对个别行进行删除或更新;修改数据需以分区为单位覆盖全部数据 | high |
| DolphinDB 副本复制单位 | 复制粒度 | 在节点之间复制副本数据以分区为单位 | high |
| 分区粒度建议(未压缩前) | 原始数据大小范围 | 建议控制在 100M~1G(可结合实际调整) | medium |
| 分区粒度过大时的调整方法 | 可选措施 | (1) 采用组合分区(COMPO);(2) 增加分区个数;(3) 将范围分区改为值分区 | high |
| 分区粒度过小 | 成本/影响 | 会生成大量子任务,增加数据节点与控制节点及其之间的通讯与调度成本;造成低效小文件磁盘访问;分区元数据驻留控制节点内存,分区数过多可能导致控制节点内存不足 | medium |
| 分区粒度建议(下限) | 每分区未压缩前数据量 | 建议不要小于 100M | medium |
| 高频交易数据分区示例 | 问题与解决思路 | 按交易日期+股票代码值做组合分区会产生许多极小分区;可将股票代码维度改按范围分区,将不活跃股票组合到一个分区以提升性能 | medium |
| 数据分布不均的影响 | 系统与作业表现 | 会造成系统负荷不均衡;作业延时可能增大(子任务对应分区,最后一个子任务完成才返回结果) | medium |
| cutPoints(X, N, [freq]) | 用途 | 根据数据分布生成分组边界,使数据均匀分布在 N 个组中 | high |
| cutPoints(X, N, [freq]) | 参数说明 | X 是数据;N 是产生的分组数;freq 为与 X 等长数组,元素为 X 中对应元素出现频率 | high |
| cutPoints(X, N, [freq]) | 返回值 | 返回具有 (N+1) 个元素的数组 | high |
| 股票报价数据分区示例 | 建议 | 若按股票代码首字母做范围分区易导致不均衡;建议用 cutPoints 基于样本数据划分分区 | medium |
| 列表分区 | 适用性 | 除范围分区外,列表分区也是解决数据分布不均的有效方法 | medium |
| 时序分区 | 建议 | 以时间字段分区时需预留足够空间容纳将来数据 | medium |
| DolphinDB 时间分区创建示例 | 按天分区范围 | 创建数据库按天分区:2000.01.01 到 2030.01.01(示例代码:database("dfs://testDate", VALUE, 2000.01.01 .. 2030.01.01)) | high |
| 时间分区创建行为 | 分区创建时机 | 只有当实际数据写入数据库时,数据库才会真正创建需要的分区 | high |
| 时间分区字段类型与表字段类型 | 兼容规则 | 数据库定义的分区字段类型与表实际时间类型可以不一致,只要分区字段类型精度 <= 实际数据类型精度;系统自动转换 | high |
| 按月分区示例的可用表字段类型 | 允许的时间类型 | 当数据库按月(month)分区时,表字段可为 month、date、datetime、timestamp、nanotimestamp | high |
| 分布式 join 的代价 | 原因 | 多个分区表 join 可能耗时,因为涉及分区可能在不同节点,需要跨节点复制数据 | medium |
| 共存储位置分区机制 | 机制描述 | 确保同一分布式数据库里所有表在相同分区的数据存储在相同节点,以提高连接效率 | high |
| DolphinDB 当前版本 join 支持 | 限制 | 对采用不同分区机制的多个分区表不提供连接功能 | high |
| quotes 与 trades 示例 | 分区机制 | quotes 和 trades 两个分区表采用同一个分区机制(示例创建均使用 `date` 与 `sym` 作为分区键) | high |
| DolphinDB | 设计定位 | 为 OLAP 场景优化设计,主要解决海量结构化数据的快速存储和计算,并通过内存数据库和流数据实现高性能数据处理 | medium |
| DolphinDB | 不适合的场景 | 不适合数据频繁更改的 OLTP 业务系统 | high |
| DolphinDB 写入方式 | 类比与方式 | 数据写入与 Hadoop HDFS 类似:快速在每个分区/文件末尾批量插入;插入数据压缩存储到磁盘 | medium |
| 数据压缩比例 | 一般范围 | 20%~25% | medium |
| 基于磁盘的数据表更新/删除 | 限制 | 数据追加到基于磁盘的数据表后,不能快速更新或删除某些符合条件记录;必须以分区为单位修改 | high |
| DolphinDB 分区多副本 | 支持情况 | 允许为每一个分区保留多个副本 | high |
| dfsReplicationFactor | 默认值 | 2(默认副本个数) | high |
| dfsReplicationFactor | 配置位置/方式 | 可修改控制节点参数 dfsReplicationFactor 设置副本数量 | high |
| 多副本目的 | 容错 | 数据节点失效或磁盘数据损坏时提供容错继续服务 | medium |
| 多副本目的 | 负载均衡 | 大量并发访问时提供负载均衡,提高系统吞吐量,降低访问延时 | medium |
| DolphinDB 数据写入一致性 | 机制 | 通过两阶段事务提交机制,确保写入时同一副本在多节点之间数据强一致性 | high |
| dfsReplicaReliabilityLevel | 作用 | 决定是否允许多个副本驻留在同一台物理服务器的多个数据节点上 | high |
| dfsReplicaReliabilityLevel(开发阶段) | 建议/设置 | development 阶段允许在一个机器上配置多个节点且允许多个副本驻留同一物理服务器(dfsReplicaReliabilityLevel=0) | high |
| dfsReplicaReliabilityLevel(生产阶段) | 建议/设置 | production 阶段需要设置为 1,否则起不到容错备份作用 | high |
| dfsReplicaReliabilityLevel | Level 0 含义 | 允许多个副本驻留在同一台物理服务器上 | high |
| dfsReplicaReliabilityLevel | Level 1 含义 | 不允许多个副本驻留在同一台物理服务器上(原文表述:不运行) | medium |
| dfsReplicaReliabilityLevel | 默认值 | 0 | high |
| DolphinDB 基于磁盘表事务 | 支持范围 | 对基于磁盘(分布式文件系统)的数据库表读写支持事务,确保原子性、一致性、隔离性、持久化 | high |
| DolphinDB 事务隔离 | 隔离级别/机制 | 采用多版本机制实现快照级别隔离;读操作与写操作互不阻塞以优化数据仓库读性能 | high |
| DolphinDB 事务限制 | 读写混合 | 一个事务只能包含写或者读,不能同时进行写和读 | high |
| DolphinDB 写事务并发限制 | 分区锁规则 | 写事务可跨多个分区,但同一分区不能被多个 writer 并发写入;若分区被事务 A 锁定,事务 B 再锁会抛异常并回滚失败 | high |
| DolphinDB 分区机制与分区数量 | 规模能力 | 单个数据表可以支持几百万的分区数量 | medium |
| 并行数据加载适用场景 | 场景 | 海量数据从其他系统导入 DolphinDB,或实时/准实时写入数据仓库 | medium |
| quotes 并行加载示例 | 数据组织方式 | 数据存储在 csv 文件中,每个文件保存一天的 quotes 数据;stockDB 按日期与股票代码复合分区 | high |
| 多 writer 并行加载 | 要求 | 需确保 writer 不会同时写同一个分区,否则事务失败 | high |
| 并行加载示例的避免冲突方式 | 依据 | 每文件存一天数据且分区字段包含日期,从而避免加载作业产生重叠事务 | high |
| 官网 | 链接 | https://link.zhihu.com/?target=https%3A//www.dolphindb.cn/ | high |
| DolphinDB 试用版 | 可获取性 | 页面提示可下载 DolphinDB 试用版 | low |
| 技能认证特训营第二期 | 报名链接 | https://www.qingsuyun.com/h5/e/217471/5/ | high |