sqlserver->clickhouse迁移数据

网上看了很多cdc的方案,说实在的,flink也不好弄,主要是驱动。

        flink sql中的方案,好不容易弄到了所有的驱动,结果,字段非常难搞,例如uuid对应flink的String,结果执行flink sql的时候,字段类型不对。导入布尔值的时候,提示true不合法,哎,也是醉了!

        换一个方法,flink-cdc,按网上的配置弄好了,结果,提示找不到驱动,sqlserver都没有。

        用java写?很直白说,我不会!

        于是暂时放弃所有flink的方法,用net6写了一个搬运工具,这个搬运工具有个缺陷,只能用mergaTree!这个东东从官方文档说,排序有点慢,感觉是很慢,非常慢!没关系,先摸索一下,主要是说说这个工具的思路。

        sqlserver好几个表都是千万级的,只是7天的部分数据,试试水。

        总体方法:sqlserver->IDataReader->queue->bulk insert->clickhouse

        不要尝试一次性把数据从sqlserver中读出来再写到目标库,这个方案是最不可接受的:

第一:读取千万数据级的表,需要的时间不少,返回结果后,内存爆了!

第二:浪费大量的时间读取数据,即使硬件支撑得起,时间也等不起!

dataReader设置每1000条记录就返回一个结果列表

protected override (IEnumerable<object[]>, int Length) GetRows(string table, int count)
{var list = new object[count][];var i = 0;var _reader = GetDatabaseReader(table);if(_reader == null)return (new object[0][], 0);while (_reader.Read()){object[] data = new object[_reader.FieldCount];_reader.GetValues(data);list[i] = data;i++;if (i >= count){break;}}return (list, i);
}

这里的reader是在读取完一个表之前,都是要保持的,通过GetDatabaseReader方法从内存中获取出来。list对象就是每次读取的数据包。

定义一个队列

var queue = new Queue<object[][]>();

 每读一个包,就往队列中推,这样就形成一个完整的数据队列。

注意的是,用多线程来执行GetRows方法,并没有什么用,速度不会快起来,于是就只用了单线程获取数据。

写入数据,驱动用的是clickhouse.client,nuget安装即可。文档也很清楚了,用bulk方法,支持object[]这样的数据,也支持DataTable对象。

用多线程从queue获取数据包,然后写入到ck,注意一下,有时候写入速度慢,例如网络,线程调度不优等各方面的问题,防止队列中的数据包过多占用内存,每次获取包的时候,如果队列数量大于5个包,就暂停一下获取数据,实际上,3个线程写一个线程读,是不会出现等待的情况的。

quue对象不需要线程安全,不会出问题的,放心。

        其实数据库之间迁移数据,最麻烦的就是字段类型的对应,所以需要建立一个映射对应表,理论上,把这个逻辑优化一下,大部分数据库的迁移都是可以的,只是驱动和字段不一样而已。

        这个工具写了两天,迁移了4个数据库,没报错,基本是一次成功,还是有点小满足的,有数据就可以玩一下clickhouse了,体验一下高速的查询。

        但是,还是要研究一下flink-cdc,否则自己写也很麻烦,主要是有点懒,呵呵,谁给个线程的库让我玩转flink-cdc,其实最理想的还是想sqlserver->flink cdc->rabbitmq->clickhouse,虽然同步会慢一点,但是这样更加灵活,可以同步到多个数据库中,中间环节用json传输。但是,也没搞定,flink官方的rabbitmq库不知道怎么用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/629020.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue的sync语法糖的使用

Vue的.sync语法糖是一个用于双向数据绑定的指令&#xff0c;可以在子组件中用来监听父组件传递下来的props的变化&#xff0c;并在需要的时候发出一个自定义事件来通知父组件进行数据更新。 在Vue中&#xff0c;.sync语法糖的使用方法如下&#xff1a; 在父组件中&#xff0c…

第十一部分 隐含规则 (一)

目录 一、使用隐含规则 二、隐含规则一览 1、编译 C 程序的隐含规则 2、编译 C程序的隐含规则 3、编译 Pascal 程序的隐含规则 4、编译 Fortran/Ratfor 程序的隐含规则 5、预处理 Fortran/Ratfor 程序的隐含规则 6、编译 Modula-2 程序的隐含规则 7、汇编和汇编预处理…

如何编译openssl的早期版本的共享库,如openssl 1.0

背景介绍 最近在为客户排查问题的时候&#xff0c;发现客户提供的日志是加密的&#xff0c;解密工具依赖到了openssl 1.0的共享库。可是手头没有这么老版本的openssl共享库。因此只好手动编译一个出来。 编译步骤 因为openssl 1.0是比较老的版本&#xff0c;很多系统上的库已…

常用Java代码-Java中的注解处理器(Annotation Processing)

注解处理器&#xff08;Annotation Processing&#xff09;是Java编译时的一种机制&#xff0c;它允许开发者在源代码上添加注解&#xff0c;并通过注解处理器生成源代码、报告编译器错误或警告、或者进行其他编译时操作。 在Java中&#xff0c;注解处理器通常使用Java的反射和…

新能源汽车智慧充电桩解决方案:智慧化综合管理与数字化高效运营

一、方案概述 TSINGSEE青犀&触角云新能源汽车智慧充电桩解决方案基于管理运营平台&#xff0c;覆盖业务与应用、数据传输与梳理、多端开发、搭建等模块&#xff0c;融合AI、5G、Wi-Fi 、移动支付等技术&#xff0c;实现充电基础设施由数字化向智能化演进&#xff0c;通过构…

【算法题】57. 插入区间

题目 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可以合并区间&#xff09;。 示例 1&#xff1a; 输入&#xff1a;intervals …

翻译: Pyenv管理Python版本从入门到精通一

你是否经常在管理系统上多个Python版本时遇到困难&#xff1f;这可能是一个艰巨的任务&#xff0c;尤其是在处理需要不同Python版本的不同项目时。 但别担心&#xff0c;有一个解决方案&#xff1a;pyenv。就像一个熟练的杂技演员&#xff0c;pyenv可以轻松处理多个Python版本…

Vue插槽(slot)的使用

Vue插槽(slot)是一种强大的功能&#xff0c;它允许您在组件模板中插入自定义内容。插槽可以让你更灵活地构建组件&#xff0c;以满足不同的使用场景。 使用说明&#xff1a; 定义插槽&#xff1a;在组件模板中&#xff0c;使用<slot>标签来定义插槽。使用插槽&#xff…

连接超时的问题

连接超时的问题 通用第三方工具连接超时 connect timeout 方案一&#xff1a; /etc/ssh/sshd_config node1上操作&#xff0c;图是错的 方案二&#xff1a; windows上Hosts文件域名解析有问题 比如&#xff1a; 192.168.xx.100 node1 192.168.xx.161 node1 两个都解析成node…

绝地求生:【PC】未授权程序使用行为的相关公告

各位玩家大家好&#xff0c; 最近闲游盒通过PUBG玩家社区收到了关于未授权程序的举报&#xff0c;举报称有人在游戏内使用了能测量玩家间的距离并辅助迫击炮射击的未授权辅助程序。为此&#xff0c;我们想就该事项向大家进行如下公告&#xff1a; 使用此类未授权程序的行为违反…

23/76-LeNet

LeNet 早期成功的神经网络。 先使用卷积层来学习图片空间信息。 然后使用全连接层转换到类别空间。 #In[]LeNet,上世纪80年代的产物,最初为了手写识别设计from d2l import torch as d2l import torch from torch import nn from torch.nn.modules.loss import CrossEntropyLos…

无法加载操作系统,原因是关键系统驱动程序丢失或包含错误

bcdboot c:\windows /l zh-cn 用这个命令解决了,没有进入时候蓝屏了,不知道为什么 问题 无法加载操作系统,原因是关键系统驱动程序丢失或包含错误上午因为有点事就没有像往常一样打开电脑,下午回到家休息了一会本来准备打开电脑开始我愉快地下午生活,没想到一个自动恢复给…

工业平板定制方案_基于联发科、紫光展锐平台的工业平板电脑方案

工业平板主板采用联发科MT6762平台方案&#xff0c;搭载Android 11.0操作系统&#xff0c; 主频最高2.0GHz&#xff0c;效能有大幅提升;采用12nm先进工艺&#xff0c;具有低功耗高性能的特点。 该工业平板主板搭载了IMG GE8320图形处理器&#xff0c;最高主频为680MHz, 支持108…

Java设计模式之访问者模式详解

Java设计模式之访问者模式详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们一同踏上Java设计模式之旅&#xff0c;探索访问者模式&#x…

Flume 之自定义Sink

1、简介 前文我们介绍了 Flume 如何自定义 Source&#xff0c; 并进行案例演示&#xff0c;本文将接着前文&#xff0c;自定义Sink&#xff0c;在这篇文章中&#xff0c;将使用自定义 Source 和 自定义的 Sink 实现数据传输&#xff0c;让大家快速掌握Flume这门技术。 2、自定…

JVM与HotSpot

JVM和HotSpot 1、概念 JVM是虚拟机的规范&#xff0c;HotSpot是jvm的具体实现 HotSpot包括一个解释器和两个编译器&#xff08;client 和 server&#xff0c;二选一的&#xff09;&#xff0c;解释与编译混合执行模式&#xff0c;默认启动解释执行。 编译器&#xff1a;java源…

121_买卖股票的最佳时机

描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择某一天买入这只股票&#xff0c;并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…

Python - 深夜数据结构与算法之 Sort

目录 一.引言 二.排序简介 1.排序类型 2.时间复杂度 3.初级排序 4.高级排序 A.快速排序 B.归并排序 C.堆排序 5.特殊排序 三.经典算法实战 1.Quick-Sort 2.Merge-Sort 3.Heap-Sort 4.Relative-Sort-Array [1122] 5.Valid-anagram [242] 6.Merge-Intervals […

Java NIO (二)NIO Buffer类的重要方法(备份)

1 allocate()方法 在使用Buffer实例前&#xff0c;我们需要先获取Buffer子类的实例对象&#xff0c;并且分配内存空间。需要获取一个Buffer实例对象时&#xff0c;并不是使用子类的构造器来创建&#xff0c;而是调用子类的allocate()方法。 public class AllocateTest {static…

如何快速看懂一篇英文AI论文?

已经2024年了&#xff0c;该出现一个写论文解读AI Agent了。 大家肯定也在经常刷论文吧。 但真正尝试过用GPT去刷论文、写论文解读的小伙伴&#xff0c;一定深有体验——费劲。其他agents也没有能搞定的&#xff0c;今天我发现了一个超级厉害的写论文解读的agent &#xff0c…