新公司建网站,哪个网站可以免费学设计,做网站签订合同,wordpress主题汉化插件下载ClickHouse 是 Yandex 公司于2016年开源的 OLAP 列式数据库管理系统#xff0c;主要用于 WEB 流量分析。凭借面向列式存储、支持数据压缩、完备的 DBMS 功能、多核心并行处理的特点#xff0c;ClickHouse 被广泛应用于广告流量、移动分析、网站分析等领域。
DolphinDB 是一款…ClickHouse 是 Yandex 公司于2016年开源的 OLAP 列式数据库管理系统主要用于 WEB 流量分析。凭借面向列式存储、支持数据压缩、完备的 DBMS 功能、多核心并行处理的特点ClickHouse 被广泛应用于广告流量、移动分析、网站分析等领域。
DolphinDB 是一款国产高性能分布式时序数据库拥有图灵完备性的编程语言 DolphinDB Script 和高性能低延时的流计算框架为海量结构化数据的快速存储、检索、分析及计算提供一站式解决方案适用于量化金融及工业物联网等领域。自发布以来DolphinDB 凭借卓越的性能、低维护成本、操作简单、可扩展性高等优势吸引了大量的国内外用户。
本教程旨在为 ClickHouse 使用者提供一份迁移数据至 DolphinDB 的简明参考。
1. DolphinDB vs ClickHouse
1.1 DolphinDB 与 ClickHouse 的相同点
分布式存储和分析DolphinDB 和 ClickHouse 都设计为支持大规模数据的分布式存储和分析。它们可以处理海量数据并提供快速的查询和分析能力。列式存储两者都采用了列式存储结构更适合海量大数据场景中的写入和读取。这种存储方式在分析型数据库中通常能够提供更高的性能特别是对于聚合和分析查询。支持分布式计算两者都支持分布式计算可以横向扩展以处理大规模数据集。支持复杂的数据类型两者都支持处理复杂的数据类型包括数组、嵌套结构等使其适用于各种数据分析场景。
1.2 DolphiDB 与 ClickHouse 的区别
分布式能力DolphinDB 分布式更强支持事务和幂等性导数查询自动路由全面元数据管理。脚本语言两者都支持 SQL 查询ClickHouse 仅支持 SQL 语言而 DolphinDB 开发了图灵完备的脚本语言具备更强的数据处理能力。存储引擎DolphinDB 自研的 TSDB 存储引擎将分区内的多列数据 以 blocks 为存储形式block 是 DolphinDB 中最小的存储单位 顺序存为一个文件解决了数据分析中宽表查询和点查询性能上的痛点。压缩算法DolphinDB 当前仅支持 LZ4、Delta 和枚举类型的压缩而 ClickHouse 不仅支持 LZ4、ZSTD等通用压缩算法还针对不同的数据类型开发了不同的编码方法如 Delta、Gorilla、T64 等。生态支持ClickHouse 是一个开源项目拥有活跃的开源社区与各种第三方工具能很好的兼容整合生态支持完善。而 DolphinDB 是企业级方案在金融行业和物联网领域有更多的实际业务积累有专业的技术支持团队可以及时响应、解决客户在使用 DolphinDB 中遇到的各类问题。
1.3 为什么选择 DolphinDB?
运维成本ClickHouse 在设计之初没有考虑集群版本所以现在方案都是改良版。ClickHouse 的 shard 及replica 配置、扩缩容异常繁琐运维成本高。相比而言DolphinDB 设计并引入了 DFS 这一抽象文件系统使得 shardreplica负载均衡Failover 均交由 DFS 来实现用户无需关心基本没有运维成本。数据一致性ClickHouse 副本一致性通过 ZooKeeper 同步分布式日志Replicated Log来实现最终一致性即同步期间副本的数据是不一致的。而 DolphinDB 通过两阶段提交协议来保证副本一致性副本之间是强一致性。开发成本DolphinDB 提供了丰富的计算函数支持并内置了流数据处理框架仅需投入少量研发资源即可实现复杂业务场景。
2. 应用需求
对于有将数据由 ClickHouse 迁移到 DolphinDB 需求的客户而言其常规迁移方案通常基于 CSV 文件的导入导出实现。具体步骤是先将数据从 ClickHouse 中以 CSV 格式导出再使用 DolphinDB 导入 CSV 文件从而实现数据的迁移需求。但是这一方案有以下几点不足之处
数据量较大时需要较大的磁盘空间存储 CSV 文件实现增量同步困难数据迁移效率低
DolphinDB 提供了多种灵活的数据同步方法来帮助用户方便地把海量数据从多个数据源进行全量同步或增量同步。本文的实践案例基于这一需求根据 2021.01.04 一天的逐笔成交数据数据量约 2721 万提供将数据从 ClickHouse 迁移到 DolphinDB 的高性能解决方案。
3. 实现方法
由 ClickHouse 迁移到 DolphinDB 的方案主要有ODBC 插件、DataX、CSV 文件导入、HTTP Client zmq 插件等。本文选择使用 ODBC 插件、DataX 进行数据迁移主要基于以下几点原因
二者实现简单、数据流转链路短迁移效率更高无需额外空间存储中间文件增量同步方案实现简单
本文数据迁移的具体实现框架如下 ODBC 插件
ODBC(Open Database Connectivity) 插件是 DolphinDB 提供的通过 ODBC 接口访问 Oracle 的开源产品。使用插件配合 DolphinDB 脚本使用与服务器在同一个进程空间内运行能高效地完成 Oracle 数据到 DolphinDB 的数据写入。
ODBC 提供如下函数函数的具体使用请参考 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])
DataX 驱动
DataX 是可扩展的数据同步框架将不同数据源的同步抽象为从源头数据源读取数据的 Reader 插件以及向目标端写入数据的 Writer 插件理论上 DataX 框架可以支持任意数据源类型的数据同步工作。
DolphinDB 提供基于 DataXReader 和 DataXWriter 的开源驱动。DolphinDBWriter 插件实现了向 DolphinDB 写入数据使用 DataX 的现有 reader 插件结合 DolphinDBWriter 插件即可实现从不同数据源向 DolphinDB 同步数据。用户可以在 Java 项目中包含 DataX 的驱动包开发从 ClickHouse 数据源到 DolphinDB 的数据迁移软件。 4. 迁移案例与操作步骤
4.1 环境配置
本次案例中使用了以下数据库及插件各版本型号如下
ClickHouse 版本23.8.2.7
unixODBC 版本2.3.7
DolphinDB Server 版本2.00.10.1
DolphinDB GUI 版本1.30.21.4
2.00.10.1 版本 Server 自带 ODBC 插件位于 Server 的 HomeDir/plugins 目录可直接加载使用。如果 HomeDir/plugins 目录下不存在 ODBC 文件夹则通过如下链接下载
DolphinDBPlugin 分支release200.10
请注意DolphinDB ODBC 插件版本号必须与 Server 版本号一致否则可能出现报错。例如DolphinDB Server 版本号为 2.00.10.X则必须使用 release200.10 分支的 ODBC 插件。
如果想自行编译请参考 ODBC 插件 文章中的第2章。
4.2 建库建表
针对上面的测试数据我们需要在 DolphinDB 里创建对应的库表用于存储迁移过来的数据。对于实际的数据需要综合考虑被迁移数据的字段、类型、数据量在 DolphinDB 是否需要分区分区方案使用 OLAP还是 TSDB 引擎等情况去设计建库建表方案。一些数据存储库表设计实践可以参考 DolphinDB 数据库分区教程
本例建表文件 createTable.dos 内容如下:
create database dfs://TSDB_tick partitioned by VALUE([2023.02.01,2023.02.02]),HASH([SYMBOL,10]),engineTSDB
create table dfs://TSDB_tick.tick(SecurityID SYMBOL,TradeTime TIMESTAMP [compressdelta],TradePrice DOUBLE,TradeQty INT,TradeAmount DOUBLE,BuyNo INT,SellNo INT,ChannelNo INT,TradeIndex INT,TradeBSFlag SYMBOL,BizIndex INT
)
partitioned by TradeTime,SecurityID,
sortColumnsSecurityIDTradeTime
从 ClickHouse 迁移到 DolphinDB 的数据字段映射关系如下表
ClickHouse 字段含义ClickHouse 字段ClickHouse 数据类型DolphinDB 字段含义DolphinDB 字段DolphinDB 数据类型证券代码SecurityIDString证券代码SecurityIDSYMBOL交易时间TradeTimeDateTime64交易时间TradeTimeTIMESTAMP交易价格TradePriceDOUBLE交易价格TradePriceDOUBLE交易数量TradeQtyInt32交易数量TradeQtyINT交易金额TradeAmountDOUBLE交易金额TradeAmountDOUBLE买方委托索引BuyNoInt32买方委托索引BuyNoINT卖方委托索引SellNoInt32卖方委托索引SellNoINT成交编号TradeIndexInt32成交编号TradeIndexINT频道代码ChannelNoInt32频道代码ChannelNoINT成交方向TradeBSFlagString成交方向TradeBSFlagSYMBOL业务序列号BizIndexInt64业务序列号BizIndexINT
其部分数据示例如下
SecurityIDTradeTimeTradePriceTradeQtyTradeAmountBuyNoSellNoTradeIndexChannelNoTradeBSFlagBizIndex6000202021.01.04T09:25:00.6303.3921007,119.8596178316197191N1237136000202021.01.04T09:25:00.6303.3910003,390.12994578316197201N1237146000202021.01.04T09:25:00.6303.399003,051.15803978316197211N123715
4.3 通过 ODBC 插件迁移
本例中部署 DolphinDB 的服务器操作系统为 Centos。
4.3.1 安装 unixODBC 库
Centos 系统
# 安装 unixODBC 库
yum install unixODBC unixODBC-devel
如果是 Ubuntu 系统使用以下命令安装
# 安装 unixODBC 库
apt-get install unixodbc unixodbc-dev
4.3.2 下载 ClickHouse 的 ODBC 驱动并安装
第一步下载 clickhouse-odbc 并解压至自定义目录中假设安装目录为 savedir。
mkdir savedir
cd savedir
wget https://github.com/ClickHouse/clickhouse-odbc/releases/download/v1.2.1.20220905/clickhouse-odbc-linux.zip
unzip clickhouse-odbc-linux.zip
第二步在 /etc/odbcinst.ini 文件中添加以下内容
注意:需要替换 savedir 为实际的安装目录。
[ODBC Drivers]
ClickHouse ODBC Driver (ANSI) Installed
ClickHouse ODBC Driver (Unicode) Installed [ClickHouse ODBC Driver (ANSI)]
Description ODBC Driver (ANSI) for ClickHouse
Driver savedir/clickhouse-odbc-1.2.1-Linux/lib64/libclickhouseodbc.so
Setup savedir/clickhouse-odbc-1.2.1-Linux/lib64/libclickhouseodbc.so
UsageCount 1 [ClickHouse ODBC Driver (Unicode)]
Description ODBC Driver (Unicode) for ClickHouse
Driver savedir/clickhouse-odbc-1.2.1-Linux/lib64/libclickhouseodbcw.so
Setup savedir/clickhouse-odbc-1.2.1-Linux/lib64/libclickhouseodbcw.so
UsageCount 1
第三步在 /etc/odbc.ini 文件中添加以下内容
注意:若不存在该文件可自行创建。
[ODBC Data Sources]
ClickHouse DSN (ANSI)ClickHouse ODBC Driver (ANSI)
ClickHouse DSN (Unicode)ClickHouse ODBC Driver (Unicode) [ClickHouseAnsi]
DriverClickHouse ODBC Driver (ANSI)
DescriptionDSN (localhost) for ClickHouse ODBC Driver (ANSI)
Server localhost
Database default
UID default
PWD 123456
Port 8123
Proto http[ClickHouseUni]
DriverClickHouse ODBC Driver (Unicode)
DescriptionDSN (localhost) for ClickHouse ODBC Driver (Unicode)
Server localhost
Database default
UID default
PWD 123456
Port 8123
Proto http4.3.3 同步数据
运行以下命令加载 ODBC 插件 ServerPath 请自行修改
loadPlugin(ServerPath/plugins/odbc/PluginODBC.txt)
2. 运行以下命令建立与 ClickHouse 的连接 Dsn 的名称请自行修改
conn odbc::connect(DsnClickHouseAnsi, ClickHouse)
3. 运行以下命令开始同步数据
def syncData(conn, dbName, tbName, dt){sql select SecurityID, TradeTime, TradePrice, TradeQty, TradeAmount, BuyNo, SellNo, ChannelNo, TradeIndex, TradeBSFlag, BizIndex from migrate.tickshif(!isNull(dt)) {sql sql WHERE toDate(TradeTime) temporalFormat(dt,yyyy-MM-dd)}odbc::query(conn,sql, loadTable(dbName,tbName), 100000)
}
dbNamedfs://TSDB_tick
tbNametick
syncData(conn, dbName, tbName, NULL)
数据共 27211975 条同步数据耗时约158秒。
4. 同步增量数据
def scheduleLoad(conn,dbName,tbName){sqlQuery select SecurityID, TradeTime, TradePrice, TradeQty, TradeAmount, BuyNo, SellNo, ChannelNo, TradeIndex, TradeBSFlag, BizIndex from migrate.tickshsql sqlQuery WHERE toDate(TradeTime) temporalFormat(today()-1,yyyy-MM-dd)odbc::query(conn,sql, loadTable(dbName,tbName), 100000)
}
scheduleJob(jobIdtest, jobDesctest,jobFuncscheduleLoad{conn,dbName,tbName},scheduleTime00:05m,startDate2023.11.03, endDate2024.11.03, frequencyD)
4.4 通过 DataX 迁移
4.4.1 部署DataX
从 DataX 下载地址 下载 DataX 压缩包后解压至自定义目录。
注意2023年9月后发布的 datax 中才有 clickhousereader 插件, 如已安装老版本 datax则只需下载安装包中的 clickhousereader 复制到 DataX/plugin/reader 目录下即可使用。
4.4.2 部署 DataX-DolphinDBWriter 插件
将 DataX-DolphinDBWriter 中源码的 ./dist/dolphindbwriter 目录下所有内容拷贝到 DataX/plugin/writer 目录下即可使用。
4.4.3 执行 DataX 任务
配置 json 文件
配置文件 ClickHouseToDDB.json 的具体内容如下并将 json 文件置于自定义目录下本教程中方放置于 datax-writer-master/ddb_script/ 目录下。
{job: {content: [{writer: {parameter: {dbPath: dfs://TSDB_tick,userId: admin,tableName: tick,host: 127.0.0.1,pwd: 123456,table: [{type: DT_SYMBOL,name: SecurityID},{type: DT_TIMESTAMP,name: TradeTime},{type: DT_DOUBLE,name: TradePrice},{type: DT_INT,name: TradeQty},{type: DT_DOUBLE,name: TradeAmount},{type: DT_INT,name: BuyNo},{type: DT_INT,name: SellNo},{type: DT_INT,name: TradeIndex},{type: DT_INT,name: ChannelNo},{type: DT_SYMBOL,name: TradeBSFlag},{type: DT_INT,name: BizIndex}],port: 10001},name: dolphindbwriter},reader: {parameter: {username: default,column: [SecurityID, toString(TradeTime), TradePrice, TradeQty, TradeAmount, BuyNo, SellNo, ChannelNo, TradeIndex, TradeBSFlag, BizIndex],connection: [{table: [ticksh],jdbcUrl: [jdbc:clickhouse://127.0.0.1:8123/migrate]}],password: 123456,where: },name: clickhousereader}}],setting: {speed: {channel: 1}}}
}
注当前 clickhousereader 无法识别 DateTime64 类型故需转为字符串toString(TradeTime)取数。
2. Linux 终端中执行以下命令以执行 DataX 任务
python datax.py ../../datax-writer-master/ddb_script/ClickHouseToDDB.json
3. 查看 DataX 同步结果
任务启动时刻 : 2023-11-03 17:11:26
任务结束时刻 : 2023-11-03 17:14:57
任务总计耗时 : 210s
任务平均流量 : 8.93MB/s
记录写入速度 : 129580rec/s
读出记录总数 : 27211975
读写失败总数 : 04. 同步增量数据
使用 DataX 同步增量数据可在 ClickHouseToDDB.json 的 ”reader“ 中增加 where 条件对数据日期进行筛选如此每次执行同步任务时至同步 where 条件过滤后的数据以同步前一天的数据为例示例如下
reader: {parameter: {username: default,column: [SecurityID, toString(TradeTime), TradePrice, TradeQty, TradeAmount, BuyNo, SellNo, ChannelNo, TradeIndex, TradeBSFlag, BizIndex],connection: [{table: [ticksh],jdbcUrl: [jdbc:clickhouse://127.0.0.1:8123/migrate]}],password: 123456,where: toDate(TradeTime) date_sub(day,1,today())},name: clickhousereader,
} 5. 基准性能
分别使用 ODBC 插件和 DataX 驱动进行数据迁移 数据量 2721 万条迁移耗时对比如下表所示
ODBC插件DataX158s210s
综上ODBC 插件与 DataX 均能实现将 Oracle 中数据迁移到 DolphinDB 中但是各有优缺点
ODBC 使用简单适合灵活导入数据但是运维管理不便。DataX 需要编写复杂的导入配置但是其扩展灵活方便监控社区支持丰富。
用户可以根据需要自行选择合适的导入方式。
附录
DataX DolphinDB-Writer 配置项
配置项是否必须数据类型默认值描述host是string无Server Hostport是int无Server PortuserId是string无DolphinDB 用户名导入分布式库时必须要有权限的用户才能操作否则会返回pwd是string无DolphinDB 用户密码dbPath是string无需要写入的目标分布式库名称比如dfs://MYDB。tableName是string无目标数据表名称batchSize否int10000000datax每次写入dolphindb的批次记录数table是写入表的字段集合具体参考后续table项配置详解saveFunctionName否string无自定义数据处理函数。若未指定此配置插件在接收到reader的数据后会将数据提交到DolphinDB并通过tableInsert函数写入指定库表如果定义此参数则会用指定函数替换tableInsert函数。saveFunctionDef否string无数据入库自定义函数。此函数指 用dolphindb 脚本来实现的数据入库过程。 此函数必须接受三个参数dfsPath(分布式库路径), tbName(数据表名), data(从datax导入的数据,table格式)
table 配置详解
table 用于配置写入表的字段集合。内部结构为 {name: columnName, type: DT_STRING, isKeyField:true}
请注意此处列定义的顺序需要与原表提取的列顺序完全一致。
name 字段名称。isKeyField是否唯一键值可以允许组合唯一键。本属性用于数据更新场景用于确认更新数据的主键若无更新数据的场景无需设置。type 枚举值以及对应 DolphinDB 数据类型如下
DolphinDB 类型配置值DOUBLEDT_DOUBLEFLOATDT_FLOATBOOLDT_BOOLDATEDT_DATEMONTHDT_MONTHDATETIMEDT_DATETIMETIMEDT_TIMESECONDDT_SECONDTIMESTAMPDT_TIMESTAMPNANOTIMEDT_NANOTIMENANOTIMETAMPDT_NANOTIMETAMPINTDT_INTLONGDT_LONGUUIDDT_UUIDSHORTDT_SHORTSTRINGDT_STRINGSYMBOLDT_SYMBOL
完整代码及测试数据
ClickHouseToDDB.zip 附件中包含以下脚本及测试数据
DataX: ClickHouseToDDB.jsonDolphinDB: createTable.dos、ClickHouseToDDB_ODBC.dos 模拟数据gendata.dos