从 Redshift 迁移到 DolphinDB
AWS Redshift 是最早的云数据仓库之一,为用户提供完全托管的 PB 级云中数据仓库服务。用户可以使用标准 SQL 和现有的商业智能工具,经济高效地进行数据分析。但 AWS Redshift 上手难度较大,对知识储备要求较高,设计和优化相当复杂。作为云数据仓库,AWS Redshift 没有本地仓库操作快速便捷。
DolphinDB 是一款国产的高性能分布式时序数据库产品,其综合解决方案具有卓越的性能优势和低维护成本优势。客户无需集成不同供应商的多个系统,极大地降低了大数据管理和分析系统的综合成本。
与 AWS Redshift 相比,DolphinDB 具有以下优势:
- 操作简单,可扩展性强。具有良好的容错能力及优异的多用户并发访问能力。
- 部署灵活。可在 Linux 或 Windows 环境、本地或云端、终端设备或服务器上部署。
- 易于上手。DolphinDB 提供了丰富的文档和用户手册,且有专业技术支持团队在线解答,方便用户快速上手。
本文旨在为有从 Redshift 迁移数据到 DolphinDB 需求的用户提供一份简明的教程参考。
应用需求
AWS Redshift 2013年上线以来,凭借着使用各种创新技术,以快速、成本低、安全和兼容等优势吸引了大量用户。对于大小在 100 GB 到 1 PB 或更高的数据集,拥有很高的查询性能。具有很高的可扩展性,仅需在 AWS 管理控制台中点击几次即可完成配置扩展。对于金融大数据领域,Redshift 有大规模并行处理(MPP)架构,MPP 可以通过将数据分布到各个计算节点来解决海量数据的处理难题,并通过并发扩展与弹性调整处理突发工作负载。
与 Redshift 相比,2018年初发布的 DolphinDB,作为一款国产的高性能分布式数据库产品,凭借功能强大的编程语言和高容量高速度的流数据分析系统,能在满足低延时高吞吐量数据读写的要求的同时,轻松实现因子挖掘、流式计算、股票行情回放、实时计算高频因子等功能,成为国内大部分金融机构的首选方案。如今,如何将数据从其他数据库迁移同步到 DolphinDB 上成为大部分用户面临的一大难题。
实现方法
DolphinDB 的 ODBC (Open Database Connectivity) 插件可帮助用户方便快速地将数据导入,从而实现从 Redshift 迁移数据到 DolphinDB。
ODBC 插件是 DolphinDB 提供的通过 ODBC 接口访问 Redshift 的开源产品。插件配合 DolphinDB 脚本使用,与服务器在同一个进程空间内运行,可以高效快速地完成从 Redshift 导入数据到 DolphinDB。
ODBC 提供了如下函数:
odbc::connect(connStr, [dataBaseType])
odbc::close(conn)
odbc::query(connHandle or connStr, querySql, [t], [batchSize], [tranform])
odbc::execute(connHandle or connStr, SQLstatements)
odbc::append(connHandle, tableData, tablename, [createTableIfNotExist], [insertIgnore])
下表展示了 ODBC 与 DolphinDB 中数据类型的映射关系。
ODBC 数据类型 | DolphinDB 数据类型 |
SQL_BIT | BOOL |
SQL_TINYINT / SQL_SMALLINT | SHORT |
SQL_INTEGER | INT |
SQL_BIGINT | LONG |
SQL_REAL | FLOAT |
SQL_FLOAT/SQL_DOUBLE/SQL_DECIMAL/SQL_NUMERIC | DOUBLE |
SQL_DATE/SQL_TYPE_DATE | DATE |
SQL_TIME/SQL_TYPE_TIME | SECOND |
SQL_TIMESTAMP/SQL_TYPE_TIMESTAMP | NANOTIMESTAMP |
SQL_CHAR(len == 1) | CHAR |
其他数据类型 | STRING |
本文中的实践案例利用 ODBC 插件迁移数据,选择了金融领域具有代表性的深交所数据作为数据源,提供了3日的逐笔成交数据(约3亿数据量),储存于 Redshift 中,真实地模拟用户情况。数据迁移过程中,要注意数据类型的转换,下表提供了从 Redshift 到 DolphinDB 相应表结构数据类型。
Redshift字段含义 | Redshift字段 | Redshift数据类型 | DolphinDB字段含义 | DolphinDB字段 | DolphinDB数据类型 |
频道代码 | channelno | integer | 频道代码 | channelno | INT |
消息记录号 | applseqnum | integer | 消息记录号 | applseqnum | INT |
行情类别 | mdstreamid | character varying(256) | 行情类别 | mdstreamid | SYMBOL |
买方委托索引 | bidapplseqnum | integer | 买方委托索引 | bidapplseqnum | INT |
卖方委托索引 | offerapplseqnum | integer | 卖方委托索引 | offerapplseqnum | INT |
证券代码 | securityid | character varying(256) | 证券代码 | securityid | SYMBOL |
证券代码源 | securityidsource | character varying(256) | 证券代码源 | securityidsource | SYMBOL |
委托价格 | lastpx | double precision | 委托价格 | lastpx | DOUBLE |
委托数量 | lastqty | double precision | 委托数量 | lastqty | DOUBLE |
成交类别 | extctype | integer | 成交类别 | extctype | INT |
成交时间 | transacttime | time without time zone | 成交时间 | transacttime | TIME |
接收时间戳 | lacaltime | time without time zone | 接收时间戳 | lacaltime | TIME |
接收序列号 | seqno | integer | 接收序列号 | seqno | INT |
交易日期 | transactiondate | date | 交易日期 | transactiondate | DATE |
迁移步骤
环境配置
本次案例中使用了以下数据库及插件,各版本型号如下:
- Redshift 版本:
国际版 us-west-2区
- unixODBC 版本:
2.3.1
- DolphinDB Serve 版本:
2.00.8.7
- DolphinDB GUI 版本:
1.30.20.1
2.00.8.7
版本 Server 自带 ODBC 插件,位于 Server 的 <HomeDir>/plugins
目录,可直接加载使用。如果 <HomeDir>/plugins
目录下不存在 ODBC 文件夹,则通过如下链接下载:
DolphinDB ODBC 插件 版本:2.00.8
注意:DolphinDB ODBC 插件版本号必须与 Server 版本号一致,否则可能出现报错。例如,DolphinDB Server 版本号为 2.00.8.X,则必须使用 release200.8 分支的 ODBC 插件。
ODBC 配置
安装 ODBC
终端输入以下命令安装 ODBC 库
# Ubuntu 安装 ODBC
apt-get install unixodbc unixodbc-dev
# CentOS 安装 ODBC
yum install unixODBC unixODBC-devel
# 检查是否安装成功
odbcinst -j
期望输出
unixODBC 2.x.x
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: $HOME/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
可以查看到 ODBC 驱动路径(/etc/odbcinst.ini
)和系统数据源路径(/etc/odbc.ini
)
安装 Redshift.ODBC 驱动
Redshift 配置 ODBC 连接可参考配置 ODBC 连接
下载 ODBC 驱动到本地
Ubuntu 选择 Linux 操作系统 64 位 (.deb),CentOS 选择 Linux 操作系统 64 位 (.deb)
安装 ODBC 驱动
在终端输入以下语句进行安装
#Ubuntu dpkg -i ./AmazonRedshiftODBC-1.x.x.xxxx-x.x86_64.deb #CentOS yum --nogpgcheck localinstall AmazonRedshiftODBC-64-bit-1.x.xx.xxxx-x.x86_64.rpm
安装成功后,会在
/opt/amazon/redshiftodbc/Setup
下生成两个配置文件odbc.ini
和odbcinst.ini
将这两个文件复制到上文中提到的 ODBC 驱动路径 /etc/odbcinst.ini 和 /etc/odbc.ini
cp /opt/amazon/redshiftodbc/Setup/odbcinst.ini /etc/ cp /opt/amazon/redshiftodbc/Setup/odbc.ini /etc/
ODBC URL 配置
复制 ODBC URL 将其添加到
/etc/odbc.ini
文件中[Redshift] Driver=Amazon Redshift (x64); Server=Your server; Database=Your database
数据库安全组开放
预设情况下,用户创建的任何集群对所有人关闭。IAM 凭证仅控制对 Amazon Redshift API 相关资源的访问 AWS Redshift 控制台、命令行界面 (CLI)、API 和开发工具包。要能够通过 JDBC 或 ODBC 从 SQL 客户端工具访问集群,用户可以使用安全组
将安全组的 inbound 规则设置如下,开放5439端口给外部
编辑集群的属性,修改网络和安全设置,设置 VPC 安全组为刚才创建的安全组,并启用可公开访问。
验证 ODBC 连接成功
在终端输入以下命令(使用数据库的实际登录信息)
isql redshift UID PWD
期望返回
+---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +----------------------------------------+ SQL>
利用 DolphinDB 脚本同步数据
运行以下命令加载 ODBC 插件
login("admin","123456") loadPlugin("./plugins/odbc/PluginODBC.txt")
创建 DolphinDB 相应的分区表
db=database("dfs://redshift",HASH,[INT,10]); dt=table(300000000:0,["channelno","applseqnum","mdstreamid","bidapplseqnum","offerapplseqnum","securityid","securityidsource","lastpx","lastqty","exectype","transacttime","localtime","seqno","transactiondate"],[INT,INT,SYMBOL,INT,INT,SYMBOL,SYMBOL,DOUBLE,DOUBLE,INT,TIME,TIME,INT,DATE]); pt=createPartitionedTable(db,dt,"dfstable","channelno");
运行以下命令建立与 Redshift 的连接
conn = odbc::connect("Driver={Amazon Redshift (x64)}; Server=Your server; Database=Your database;User=UID;Password=PWD;")
运行以下脚本将数据迁移到 DolphinDB 中
# pt 为创建的分区表 odbc::query(conn, "select * from trades_sz",pt)
startTime endTime 2022.12.20 17:22:12.644 2022.12.20 17:48:09.618
最终迁移3亿条数据,耗时仅为1610秒。该迁移案例测试的硬件环境为:
- CPU:11th Gen Inter(R) Core(TM) i5-11500 @2.70GHz
- 处理器个数:12 个
- 单个处理器核数:6 核
- 内存大小:32 GB
- 网络传输速率:21508 MiB/s
查看表中数据
select top 10 * from pt