从 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_BITBOOL
SQL_TINYINT / SQL_SMALLINTSHORT
SQL_INTEGERINT
SQL_BIGINTLONG
SQL_REALFLOAT
SQL_FLOAT/SQL_DOUBLE/SQL_DECIMAL/SQL_NUMERICDOUBLE
SQL_DATE/SQL_TYPE_DATEDATE
SQL_TIME/SQL_TYPE_TIMESECOND
SQL_TIMESTAMP/SQL_TYPE_TIMESTAMPNANOTIMESTAMP
SQL_CHAR(len == 1)CHAR
其他数据类型STRING

本文中的实践案例利用 ODBC 插件迁移数据,选择了金融领域具有代表性的深交所数据作为数据源,提供了3日的逐笔成交数据(约3亿数据量),储存于 Redshift 中,真实地模拟用户情况。数据迁移过程中,要注意数据类型的转换,下表提供了从 Redshift 到 DolphinDB 相应表结构数据类型。

Redshift字段含义Redshift字段Redshift数据类型DolphinDB字段含义DolphinDB字段DolphinDB数据类型
频道代码channelnointeger频道代码channelnoINT
消息记录号applseqnuminteger消息记录号applseqnumINT
行情类别mdstreamidcharacter varying(256)行情类别mdstreamidSYMBOL
买方委托索引bidapplseqnuminteger买方委托索引bidapplseqnumINT
卖方委托索引offerapplseqnuminteger卖方委托索引offerapplseqnumINT
证券代码securityidcharacter varying(256)证券代码securityidSYMBOL
证券代码源securityidsourcecharacter varying(256)证券代码源securityidsourceSYMBOL
委托价格lastpxdouble precision委托价格lastpxDOUBLE
委托数量lastqtydouble precision委托数量lastqtyDOUBLE
成交类别extctypeinteger成交类别extctypeINT
成交时间transacttimetime without time zone成交时间transacttimeTIME
接收时间戳lacaltimetime without time zone接收时间戳lacaltimeTIME
接收序列号seqnointeger接收序列号seqnoINT
交易日期transactiondatedate交易日期transactiondateDATE

迁移步骤

环境配置

本次案例中使用了以下数据库及插件,各版本型号如下:

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 连接

  1. 下载 ODBC 驱动到本地

    Ubuntu 选择 Linux 操作系统 64 位 (.deb),CentOS 选择 Linux 操作系统 64 位 (.deb)



  2. 安装 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.iniodbcinst.ini

    将这两个文件复制到上文中提到的 ODBC 驱动路径 /etc/odbcinst.ini 和 /etc/odbc.ini

    cp /opt/amazon/redshiftodbc/Setup/odbcinst.ini /etc/
    cp /opt/amazon/redshiftodbc/Setup/odbc.ini /etc/
  3. ODBC URL 配置

    复制 ODBC URL 将其添加到 /etc/odbc.ini 文件中

    [Redshift]
    Driver=Amazon Redshift (x64); 
    Server=Your server; 
    Database=Your database
  4. 数据库安全组开放

    预设情况下,用户创建的任何集群对所有人关闭。IAM 凭证仅控制对 Amazon Redshift API 相关资源的访问 AWS Redshift 控制台、命令行界面 (CLI)、API 和开发工具包。要能够通过 JDBC 或 ODBC 从 SQL 客户端工具访问集群,用户可以使用安全组

    • 将安全组的 inbound 规则设置如下,开放5439端口给外部



    • 编辑集群的属性,修改网络和安全设置,设置 VPC 安全组为刚才创建的安全组,并启用可公开访问。



  5. 验证 ODBC 连接成功

    在终端输入以下命令(使用数据库的实际登录信息)

    isql redshift UID PWD

    期望返回

    +---------------------------------------+
    | Connected!                                   |
    |                                                    |
    | sql-statement                               |
    | help [tablename]                          |
    | quit                                             |
    |                                                    |
    +----------------------------------------+
    SQL>

利用 DolphinDB 脚本同步数据

  1. 运行以下命令加载 ODBC 插件

    login("admin","123456")
    loadPlugin("./plugins/odbc/PluginODBC.txt")
  2. 创建 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");
  3. 运行以下命令建立与 Redshift 的连接

    conn = odbc::connect("Driver={Amazon Redshift (x64)}; Server=Your server; Database=Your database;User=UID;Password=PWD;")
  4. 运行以下脚本将数据迁移到 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
  5. 查看表中数据

    select top 10 * from pt