OceanBase에서 DolphinDB로 데이터 마이그레이션

OceanBase는 금융 등급의 분산 관계형 데이터베이스로 강력한 데이터 일관성, 고가용성, 고성능, 온라인 확장성, SQL 표준 및 주류 관계형 데이터베이스와의 높은 호환성, 저렴한 비용 등의 특징을 가지고 있지만 높은 학습 비용과 재무 컴퓨팅 기능과 스트리밍 증분 계산 기능이 부족합니다.

DolphinDB는 국내 고성능 분산 시계열 데이터베이스 제품입니다. SQL을 지원하고 Python과 유사한 구문을 사용하여 데이터를 처리하며 학습 비용이 매우 낮습니다. 그리고 DolphinDB는 복잡한 데이터 처리 시나리오에 대한 강력한 표현 능력을 갖추고 사용자 개발 비용을 크게 절감하는 1,500개 이상의 기능을 제공합니다. 동시에 DolphinDB는 사용자의 실시간 데이터 처리 요구를 충족할 수 있는 강력한 스트리밍 증분 컴퓨팅 기능도 갖추고 있습니다.

이 문서는 OceanBase에서 DolphinDB로 마이그레이션해야 하는 사용자에게 간결하고 명확한 참조를 제공하는 것을 목표로 합니다 .전체 프레임워크는 다음과 같습니다.

1. 지원자격

이전에 OceanBase를 사용했던 많은 사용자는 필연적으로 DolphinDB로 데이터 마이그레이션을 동기화해야 합니다. DolphinDB는 사용자가 여러 데이터 소스의 대용량 데이터에 대한 전체 또는 증분 동기화를 쉽게 수행할 수 있도록 다양하고 유연한 데이터 동기화 방법을 제공합니다. 이 요구 사항을 기반으로 이 기사의 실제 사례는 OceanBase에서 DolphinDB로 틱 단위 데이터를 마이그레이션하기 위한 고성능 솔루션을 제공합니다.

2021.01.04의 현재 틱별 트랜잭션 데이터는 OceanBase에 저장됩니다. 일부 데이터 예는 다음과 같습니다.

보안 ID TradeTime 거래가 TradeQty 거래 금액 아니 구매 매도아니요 트레이드인덱스 채널번호 TradeBS플래그 비즈인덱스
600035 2021.01.04T09:32:59.000 2.9 100 290 574988 539871 266613 6 802050
600035 2021.01.04T09:25:00.000 2.91 2900 8439 177811 36575 8187 6 N 45204
600035 2021.01.04T09:25:00.000 2.91 2600 7566 177811 3710 8188 6 N 45205
600035 2021.01.04T09:32:59.000 2.9 100 290 574988 539872 266614 6 802051
600035 2021.01.04T09:25:00.000 2.91 500 1455년 177811 8762 8189 6 N 45206
600035 2021.01.04T09:32:59.000 2.9 100 290 574988 539873 266615 6 802052
600035 2021.01.04T09:30:02.000 2.9 100 290 18941 205774 44717 6 에스 252209
600035 2021.01.04T09:32:59.000 2.9 100 290 574988 539880 266616 6 802053
600035 2021.01.04T09:30:02.000 2.9 100 290 18941 209284 46106 6 에스 256679
600035 2021.01.04T09:32:59.000 2.9 200 580 574988 539884 266617 6 802054

2. 시행방법

OceanBase에서 DolphinDB로 데이터를 마이그레이션하는 세 가지 방법이 있습니다.

  • MySQL 플러그인

MySQL 플러그인은 MySQL 데이터 가져오기를 위해 DolphinDB에서 제공하는 플러그인으로 OceanBase의 MySQL 모드에도 적용할 수 있습니다. MySQL 플러그인은 DolphinDB 스크립트와 함께 작동하고 서버와 동일한 프로세스 공간에서 실행되며 OceanBase에서 DolphinDB로 데이터를 효율적으로 쓸 수 있습니다.

MySQL 플러그인은 다음과 같은 기능을 제공합니다. 기능의 구체적인 사용법은 DolphinDB MySQL 플러그인을 참조하십시오. 

  1. mysql::connect(호스트, 포트, 사용자, 비밀번호, db)
  2. mysql::showTables(연결)
  3. mysql::extractSchema(연결, 테이블 이름)
  4. mysql::load(연결, table_or_query, [스키마], [startRow], [rowNum], [allowEmptyTable])
  5. mysql::loadEx(연결, dbHandle,tableName,partitionColumns,table_or_query,[스키마],[startRow],[rowNum],[변환])
  • ODBC 플러그인

ODBC(Open Database Connectivity) 플러그인은 ODBC 인터페이스를 통해 ODBC 프로토콜에 액세스하는 DolphinDB에서 제공하는 오픈 소스 제품입니다. 사용법은 MySQL 플러그인과 유사하므로 본 글에서는 설명하지 않겠으며 관심 있는 독자는 ODBC 플러그인 사용법 가이드를 참고하면 된다 . 

  • DataX 드라이버

DataX는 다양한 데이터 소스의 동기화를 소스 데이터 소스에서 데이터를 읽는 Reader 플러그인과 대상 끝에 데이터를 쓰는 Writer 플러그인으로 추상화하는 확장 가능한 데이터 동기화 프레임워크입니다. 이론적으로 DataX 프레임워크는 다음을 수행할 수 있습니다. 모든 유형의 데이터 소스 지원 데이터 동기화가 작동합니다.

DolphinDB는 DataXReader 및 DataXWriter 기반의 오픈 소스 드라이버를 제공합니다. DolphinDBWriter 플러그인은 DolphinDB에 데이터 쓰기를 구현합니다. DolphinDBWriter 플러그인과 결합된 DataX의 기존 리더 플러그인을 사용하여 데이터를 다양한 데이터 소스에서 DolphinDB로 동기화할 수 있습니다. 사용자는 Java 프로젝트에 DataX 드라이버 패키지를 포함하여 OceanBase 데이터 소스에서 DolphinDB로 데이터 마이그레이션 소프트웨어를 개발할 수 있습니다.

DataX 기반 개발은 Java SDK를 기반으로 하며 고가용성을 지원합니다.

달성하는 방법 데이터 쓰기 효율성 고가용성
MySQL 플러그인 높은 지원하지
DataX 드라이버 가운데 지원하다

3. 마이그레이션 사례 및 작업 단계

3.1 DolphinDB에 테이블 생성

위의 테스트 데이터의 경우 마이그레이션된 데이터를 저장하기 위해 DolphinDB에 해당 데이터베이스 테이블을 생성해야 합니다. 실제 데이터는 마이그레이션된 데이터의 필드, 유형, 데이터 볼륨, DolphinDB의 파티션 여부, 파티션 스키마, OLAP 또는 TSDB 엔진 사용 여부 등을 종합적으로 고려하여 데이터베이스를 설계해야 합니다. 및 테이블 구성 체계. 일부 데이터 저장소 테이블 디자인 사례는 DolphinDB 데이터베이스 파티션 자습서를 참조할 수 있습니다. 

이 예제에서 테이블 생성 파일 createTable.dos 의 내용은 다음과 같습니다.  

def createTick(dbName, tbName){
	if(existsDatabase(dbName)){
		dropDatabase(dbName)
	}
	db1 = database(, VALUE, 2020.01.01..2021.01.01)
	db2 = database(, HASH, [SYMBOL, 10])
	db = database(dbName, COMPO, [db1, db2], , "TSDB")
	db = database(dbName)
	name = `SecurityID`TradeTime`TradePrice`TradeQty`TradeAmount`BuyNo`SellNo`ChannelNo`TradeIndex`TradeBSFlag`BizIndex
	type = `SYMBOL`TIMESTAMP`DOUBLE`INT`DOUBLE`INT`INT`INT`INT`SYMBOL`INT
	schemaTable = table(1:0, name, type)
	db.createPartitionedTable(table=schemaTable, tableName=tbName, partitionColumns=`TradeTime`SecurityID, compressMethods={TradeTime:"delta"}, sortColumns=`SecurityID`TradeTime, keepDuplicates=ALL)
}

dbName="dfs://TSDB_tick"
tbName="tick"
createTick(dbName, tbName)

OceanBase에서 DolphinDB로 마이그레이션된 데이터 필드의 매핑 관계는 다음과 같습니다.

OceanBase 필드 의미 OceanBase 필드 OceanBase 데이터 유형 DolphinDB 필드 의미 DolphinDB 필드 DolphinDB 데이터 유형
증권코드 보안 ID varchar(10) 증권코드 보안 ID 상징
거래시간 TradeTime 타임스탬프 거래시간 TradeTime 타임스탬프
거래 가격 거래가 더블 거래 가격 거래가 더블
트랜잭션 수 TradeQty 정수(11) 트랜잭션 수 TradeQty 지능
거래 금액 거래 금액 더블 거래 금액 거래 금액 더블
구매자 주문 지수 아니 구매 정수(11) 구매자 주문 지수 아니 구매 지능
판매자 주문 색인 매도아니요 정수(11) 판매자 주문 색인 매도아니요 지능
거래 번호 트레이드인덱스 정수(11) 거래 번호 트레이드인덱스 지능
채널 코드 채널번호 정수(11) 채널 코드 채널번호 지능
거래 방향 TradeBS플래그 varchar(20) 거래 방향 TradeBS플래그 상징
비즈니스 일련 번호 비즈인덱스 정수(11) 비즈니스 일련 번호 비즈인덱스 지능

3.2 MySQL 플러그인을 통한 마이그레이션

3.2.1 MySQL 플러그인 설치

MySQL 플러그인 설치는 DolphinDB MySQL Plugin을 참조하십시오. 

3.2.2 데이터 동기화

1. 다음 명령을 실행하여 MySQL 플러그인을 로드합니다.

loadPlugin("ServerPath/plugins/mysql/PluginMySQL.txt")

2. 다음 명령을 실행하여 OceanBase와의 연결을 설정합니다.

conn = mysql::connect(`127.0.0.1,2881,`root,`123456,`db1)

3. 다음 명령을 실행하여 데이터 동기화를 시작합니다.

mysql::loadEx(conn, database('dfs://TSDB_tick'), `tick, `TradeTime`SecurityID,"tick")

총 27211975개의 데이터가 있으며 데이터를 동기화하는 데 약 52초가 걸립니다.

4. 증분 데이터 동기화

증분 동기화를 위해서는 mysql::loadEX원본 데이터 테이블의 이름을 쿼리문으로 바꾸고 DolphinDB에서 제공하는 기능을 사용하여 scheduleJob증분 동기화를 달성하기 위한 시간 작업을 설정하면 됩니다. 매일 00:05:

def scheduleLoad(){
  sqlQuery = "select * from tick where date(TradeTime) =  '" +temporalFormat(today()-1, 'y-MM-dd') +"' ;"
  mysql::loadEx(conn, database('dfs://TSDB_tick'), `tick, `TradeTime`SecurityID,sqlQuery)
}
scheduleJob(jobId=`test, jobDesc="test",jobFunc=scheduleLoad,scheduleTime=00:05m,startDate=2023.04.04, endDate=2024.01.01, frequency='D')

참고: 노드 재시작 시 타이밍 태스크 구문 분석 실패를 방지하기 위해 구성 파일에 미리 추가하십시오. preloadModules=plugins::mysql

3.3 DataX에 의한 마이그레이션

3.3.1 DataX 배포

DataX 다운로드 주소 에서 DataX 압축 패키지를 다운로드한 후 사용자 지정 디렉터리에 압축을 풉니다.  

3.3.2 DataX-DolphinDBWriter 플러그인 배포

 DataX-DolphinDBWriter 中源码的 ./dist/dolphindbwriter 目录下所有内容拷贝到 DataX/plugin/writer 目录下。

3.3.3 执行 DataX 任务

1. 根据实际环境配置json文件。详情参考:#DataX DolphinDBWriter插件配置项,配置 json 文件

配置文件 OceanBase_tick.json 的具体内容如下,并将 json 文件置于自定义目录下,本教程中方放置于 datax-writer-master/ddb_script/ 目录下。

{
    "job": {
        "setting": {
            "speed": {
                "channel":1
            }
        },
        "content": [
            {
                "writer": {
                    "parameter": {
                        "dbPath": "dfs://TSDB_tick",
                        "tableName": "tick",
                        "userId": "admin",
                        "pwd": "123456",
                        "host": "127.0.0.1",
                        "batchSize": 200000,
                        "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": 8800
                    },
                    "name": "dolphindbwriter"
                },
                "reader": {
                    "name": "oceanbasev10reader",
                    "parameter": {
                        "username": "root",
                        "password": "123456",
                        "batchSize":10000,
                        "column": [
                            "*"
                        ],
                        "connection": [
                            {
                                "table": [
                                    "tick"
                                ],
                                "jdbcUrl": [
                                    "jdbc:oceanbase://127.0.0.1:2883/db1"
                                ]
                            }
                        ]
                    }
                }
            }
        ]
    }
}

2. Linux 终端中执行以下命令以执行 DataX 任务

cd ./dataX/bin/
python datax.py ../../datax-writer-master/ddb_script/ocean.json

3. 查看 DataX 同步结果

任务启动时刻                    : 2023-04-03 14:58:52
任务结束时刻                    : 2023-04-03 15:00:52
任务总计耗时                    :                120s
任务平均流量                    :           12.32MB/s
记录写入速度                    :         226766rec/s
读出记录总数                    :            27211975
读写失败总数                    :                   0

4. 同步增量数据

使用 DataX 同步增量数据,可在 ocean.json 的 ”reader“ 中增加 "where" 条件对数据日期进行筛选,如此每次执行同步任务时至同步 where 条件过滤后的数据,以同步前一天的数据为例,示例如下:

"reader": {
    "name": "oceanbasev10reader",
    "parameter": {
        "username": "root",
        "password": "123456",
        "batchSize":10000,
        "column": [
            "*"
        ],
        "connection": [
            {
                "table": [
                    "tick"
                ],
                "jdbcUrl": [
                    "jdbc:oceanbase://127.0.0.1:2883/db1"
                ]
            }
        ],
        "where":"date(TradeTime) = (SELECT DATE_ADD(CURDATE(), INTERVAL -1 DAY))"
    }
}

4. 基准性能

分别使用 MySQL 插件和 DataX 驱动进行数据迁移, 数据量 2721 万条,迁移耗时对比如下表所示:

MySQL插件 DataX
52s 120s

综上,MySQL 插件与 DataX 均能实现 将 OceanBase 中数据迁移到 DolphinDB中,但是各有优缺点:

  • MySQL 插件性能较好,适合批量数据的导入,但是运维管理不便。
  • DataX 导入数据较慢,适合千万级别以下数据集导入,但是其日志追踪,可扩展性以及管理比较方便。

用户可以根据自己数据量的大小以及工程化的便捷性进行选择导入方式,同时,由于篇幅有限,涉及到DolphinDB 和 DataX 框架的一些其它操作未能更进一步展示,用户在使用过程中需要按照实际情况进行调整。也欢迎大家对本教程中可能存在的纰漏和缺陷批评指正。

附录

DataX DolphinDB-Writer 配置项

配置项 是否必须 数据类型 默认值 描述
host string Server Host
port int Server Port
userId string DolphinDB 用户名导入分布式库时,必须要有权限的用户才能操作,否则会返回
pwd string DolphinDB 用户密码
dbPath string 需要写入的目标分布式库名称,比如"dfs://MYDB"。
tableName string 目标数据表名称
batchSize int 10000000 datax每次写入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 类型 配置值
DOUBLE DT_DOUBLE
FLOAT DT_FLOAT
BOOL DT_BOOL
DATE DT_DATE
MONTH DT_MONTH
DATETIME DT_DATETIME
TIME DT_TIME
SECOND DT_SECOND
TIMESTAMP DT_TIMESTAMP
NANOTIME DT_NANOTIME
NANOTIMETAMP DT_NANOTIMETAMP
INT DT_INT
LONG DT_LONG
UUID DT_UUID
SHORT DT_SHORT
STRING DT_STRING
SYMBOL DT_SYMBOL

完整代码及测试数据

{{o.name}}
{{m.name}}

Supongo que te gusta

Origin my.oschina.net/u/4865736/blog/9106164
Recomendado
Clasificación