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.rhkb.cn/news/91841.html

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

相关文章

selenium.webdriver Python爬虫教程

文章目录 selenium安装和使用 selenium安装和使用 pip install selenium 下载对应的浏览器驱动 实例化浏览器 from selenium import webdriverbrowser webdriver.Chrome()元素定位 控制浏览器

浪潮信息赵帅:多元算力时代 开源开放的OpenBMC成为服务器管理优先解

“多元算力时代下,大规模的异构服务器设备面临多种处理器架构、多种设备协议、不同管理芯片兼容的系统化设计挑战,管理固件也迎来新的变革。开源开放的OpenBMC,以创新的分层解耦软件架构,兼容不同处理器架构、算力平台和管理芯片&…

JS导出复杂多级表头的Excel

使用方式 1、安装依赖 npm install xlsx-js-style2、复制代码文件exportExcel.js至工程 https://github.com/EnthuDai/export-excel-in-one-line 3、在引入excel.js后调用 Excel.export(columns, dataSource, 导出文件名)4、代码demo 5、效果 页面excel 适用范围 对于使…

视频汇聚平台EasyCVR视频监控播放平台WebRTC流地址无法播放的问题解决方案

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多…

excel入门

上下左右移动 enter:换行,向下移动 shiftenter:向上移动 tab:向右移动 shifttab:向左移动 合并居中操作 开始-》合并居中 CtrlM 内容过长盖过了下一个单元格内容 双击列与列之间线 同时修改多行或者多列宽度或者高度 修改单行高度宽度 选中某一行拉取指定高…

三维直方图

三维直方图更直观,借助matlab的bar3,可以绘制三维直方图。 clc; clearvars; cimread(lena.jpg); width 0.8; %默认值是0.8,根据需要修改。 % hbar3(c,width,r); hbar3(c); set(h,EdgeColor,r) % set(h,facecolor,b) % set(h(1),facecolor…

LeetCode150道面试经典题--判断子序列(简单)

1.题目 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序…

Android布局【TableLayout】

文章目录 说明常见属性子控件设置属性 项目结构主要代码 说明 TableLayout也称为表格布局 常见属性 android:collapseColumns:设置需要被隐藏的列的序列号,从0开始android:stretchColumns:设置允许被拉伸的列的列序号,从0开始&…

自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”

各位CSDN的uu们好呀,今天是小雅兰来到CSDN创作的第256天啦,是一个极具纪念意义的日子,在这个神圣的日子里,也不影响小雅兰继续创作博客!!!下面,让我们进入西嘎嘎类和对象的世界吧&am…

java面试强基(16)

目录 clone方法的保护机制 Java中由SubString方法是否会引起内存泄漏? Java中提供了哪两种用于多态的机制? 程序计数器(线程私有) 如何判断对象是否是垃圾? clone方法的保护机制 clone0方法的保护机制在Object中是被声明为 protected的。以User…

数字化车间mes生产执行管理系统

数字化车间mes是一款基于B/S结构的生产执行管理系统,主要目的是为中小企业提供了高效率、低成本、通用性强的一个MES系统解决方案,能够实时监控当前完成进度。 功能简介: 生产管理 大屏展示:可以从大屏展示页面看到任工序…

Redis专题-队列

Redis专题-队列 首先,想一想 Redis 适合做消息队列吗? 1、消息队列的消息存取需求是什么?redis中的解决方案是什么? 无非就是下面这几点: 0、数据可以顺序读取 1、支持阻塞等待拉取消息 2、支持发布/订阅模式 3、重…

Java自学网站推荐,专业教学快速提升

Java自学网站可以是学习Java的有用资源之一。它们通常提供了丰富的教学材料、在线课程、编程练习和实例项目,帮助初学者系统地学习Java编程语言和相关技术。 动力节点是一家专业的Java培训机构,他们提供在线视频学习平台,你可以参考他们的官方…

Deep Learning With Pytorch - 最基本的感知机、贯序模型/分类、拟合

文章目录 如何利用pytorch创建一个简单的网络模型?Step1. 感知机,多层感知机(MLP)的基本结构Step2. 超平面 ω T ⋅ x b 0 \omega^{T}xb0 ωT⋅xb0 or ω T ⋅ x b \omega^{T}xb ωT⋅xb感知机函数 Step3. 利用感知机进行决策…

Postman 的简单使用

什么是Postman 在程序开发中用于调试网络程序或者跟踪网页请求。可以对网页进行简单的基本信息调试。Postman最早是作用chrome浏览器插件存在的,但是2018年初Chrome停止对Chrome应用程序的支持。所以现在Postman提供了独立的安装包,不再依赖于Chrome浏览…

菜单和内容滚动的联动原理及代码

之前写代码有个需求:左侧是一个菜单,右边是内容,点击左侧菜单右边内容滚动到对应位置,右边内容滚动到某位置时,左侧菜单也会选中对应的菜单项。UI如下:这是大多网站的移动端都会有的需求。 解决方案一&…

2023最新版本Activiti7系列-源码篇-初始化过程

源码分析 1.设计模式 1.1 命令模式 https://dpb-bobokaoya-sm.blog.csdn.net/article/details/89115420 1.2 责任链模式 https://dpb-bobokaoya-sm.blog.csdn.net/article/details/89077040 2.初始化过程 2.1 入口代码 我们在SpringBoot项目中来看Activiti7的源码。首先要…

机器学习:特征工程之特征预处理

目录 特征预处理 1、简述 2、内容 3、归一化 3.1、鲁棒性 3.2、存在的问题 4、标准化 ⭐所属专栏:人工智能 文中提到的代码如有需要可以私信我发给你😊 特征预处理 1、简述 什么是特征预处理:scikit-learn的解释: provide…

希尔排序【Java算法】

文章目录 1. 概念2. 思路3. 代码实现 1. 概念 希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分…

客达天下项目案例

本资料转载于传智播客https://www.itheima.com/ https://space.bilibili.com/3493265607232348 黑马程序员主办的全日制统招大学——大同互联网职业技术学院 预计2024年开始招生,敬请持续关注! B站视频入口:002_接口项目介绍_哔哩哔哩_bili…