Clickhouse快速上手 使用篇

2023-05-16

接着clickhouse原理篇,下面来介绍他的具体使用场景,包括数据导入,更新等

文章目录

    • 1. 数据导入
      • 调研
      • 计划
      • 实施
        • 1. cos文件系统集成
        • 2. 编码获取
    • 2. 数据更新和使用

1. 数据导入

根据官方介绍,Clickhouse的分布式表数据导入有两种形式,一种是在外部将数据划分好分片,分别并行的加载到各个节点的本地表,这种速度是最快的,同时也不需要分布式引擎处理网络发送各个节点数据;另外一种是直接将数据批量插入分布式表,由分布式表引擎处理数据到各节点的写入,需要节点间的网络通信,速度稍慢,但是在实际观察中,也还好,更重要的是操作方便,重跑容易;

调研

目前见过的几种写入形式:

1. 这里我参考过一些大厂的方法,其中我感觉最有效的是,k8s动态创建出一个新的clickhouse 集群,写入数据利用这个集群生成对应的分区文件,然后直接将文件attach到生产集群上的clickhouse各节点,并销毁用来生成分区文件的clickhouse集群。这才是终极操作,直接加载目的文件!
2. 使用阿里云的产品的话,他们有提供专门的spark + waterdrop 对接clickhouse, 这里他们使用虚拟ip 加上spark多进程写入clickhouse集群
3. 自己使用jdbc 写入,如果是向单点分布式表写入再由它分发的话,速度可想而知了,不过也可以自己整多线程 + vip写入集群,速度理论和2 差不多

我这里使用的是腾讯云的Ck产品,由于才刚上不久缺乏对应完善的配套,导入数据就比较麻烦了,由于需要替换greenplum,自然想到继承原来的集群间数据中转方式: 腾讯云对象存储cos。这里我们将在gp中计算好的数据通过外表方式写入到cos文件系统中以csv存储;然后下一步就需要clickhouse 中导入cos数据了,这里我测试了clickhouse 集成的COSN表引擎,从该表读取数据向分布式表插入, 但是这么做,首先是单点写入,性能不足,其次,cosn引擎实现的并不好,insert into xx select * from cosn_tb时,需要将cos指定的全部文件载入内存,轻易就OOM了,根本无法使用,腾讯云那边似乎也拿不出解决方式。

计划

由于时间拖的非常久了,领导说数据导入的事情该要了结了。。
此时我这里就只能用上老本行spark了,花了一天的时间搭建和调试,在买来的cvm搭建了5个节点的hadoop + spark 集群(这里不敢尝试太高版本,hadoop 2.7.6 + spark 2.4.7 ),然后参考了阿里云那边spark 导入数据到clickhouse 的代码,通过自己调节并行度,+ 虚拟ip 直接使用spark-shell 粘贴代码做不同并行度的写入测试。

数据源: cos上的csv
schema: jdbc读取pg表后df.schema
数据目的地:clickhouse集群的分布式表(主要是因为vip进入的节点不可控,不如让分布式表自己根据规则分配数据所在分片)

实施

1. cos文件系统集成

为了让spark能读取cos上的csv文件,需要给hadoop集成cos文件系统,类似于hdfs:// ,cos支持 cosn://, 这里参考hadoop集成cos文件系统
除了以上配置,还需要将spark配置中加上hadoop中存放这些jar包的类路径,以便spark也能访问cos文件系统

2. 编码获取

// 1. 从pg那里获取csv文件的schema
val table_schema = spark.jdbc("jdbc:postgres://xxx/xxx",table_name,pg_perproties).schema

//2. 读取csv文件并应用schema
val df = spark
        .read
        .schema(schema_df.schema)
        .csv(s"cosn://ad-cdwxxxxx")

//3. jdbc并发写入,因为这里的jdbcs使用的vip,所以并发时候其实是多节点写入的,不用担心

  val properties = new Properties()
  properties.put("driver", "ru.yandex.clickhouse.ClickHouseDriver")
  properties.put("user", "<your-user-name>")
  properties.put("password", "<your-password>")
  properties.put("batchsize","100000")
  properties.put("socket_timeout","300000")
  properties.put("numPartitions","8") //此处调节并行度要和任务启动的num-executor * executor-cores相对应,此处任务会直接调用coalesce(numPartitions),任务会在一个stage完成
  properties.put("rewriteBatchedStatements","true")
df.write.mode(SaveMode.Append)
.option(JDBCOptions.JDBC_BATCH_INSERT_SIZE, 100000)
.jdbc(url, table, properties)

我们当前的4节点集群(2分片 ,每个分片2副本)经过测试并行度12写入是最稳定的,并行度越高速度是会越快,但是有一定几率会使得clickhouse返回内存不足的错误,任务失败了重跑又会耽误一倍的时间,且会导致数据重复,需要依赖于表的特性来去重;

2. 数据更新和使用

由于各种不可预料的情况,任务失败重试等,会导致数据的重复写入,以及每15分钟的数据刷新等,此处为了用户使用的连续性,也不能删除数据再写入,而是直接写入数据并去重更新数据,此时依赖表引擎的去重设计就比较重要了。
这里介绍我们线上将要使用的

ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/local_table_name', '{replica}')
PARTITION BY toYYYYMMDD(stat_datetime)
PRIMARY KEY field1
ORDER BY (field1, field2,field3,...)

其中副本机制依靠zookeeper实现,这里不介绍,主要介绍ReplacingMergeTree表引擎,除了拥有MergeTree那些共有特性,它还有个额外功能,根据Order by指定的字段,在单机器,单分区内部去重。(为什么说单机器呢,如果一个数据写入了两个节点的同一个分区,那也是没办法去重的,所以数据根据规则额每次落于固定的分片相当重要)。

数据完全写入后,需要执行optimize进行去重,如果数据量很大,且集群负载较高不能执行的话,需要对有重复数据的分区进行final查询,然后union上其他分区的数据在进行运算,形如

select 
k1,k2,k3
sum(xxx),
count(xxx)
from (
select * from report_table_name where stat_datetime <={old_statime}
union all
select * from report_table_name FINAL where stat_datetime > {old_stattime}
) raw
group by k1,k2,k3

--也可以创建视图使用
CREATE VIEW IF NOT EXISTS dn_name.view_tablename_update_1day on cluster default_cluster
as
select * from dn_name.tablename
where stat_datetime <= yesterday()
union all
select * from dn_name.tablename final where stat_datetime = today()
;

以这种方式,即使更新数据的分去重复,也能得出正确的结果,就是会比普通查询会慢些,而且有oom风险,具体还要看使用情况。

以上就是我对于clickhouse目前使用上的理解,后续有新的内容会再补充

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Clickhouse快速上手 使用篇 的相关文章

  • GTSAM:使用gtsam的C++

    GTSAM 是一个在机器人领域和计算机视觉领域用于平滑 xff08 smoothing xff09 和建图 xff08 mapping xff09 的C 43 43 库 它与g2og2o不同的是 xff0c g2og2o采用稀疏矩阵的方式求
  • ROS - 用POSE展示方向或向量 vector - pose

    昨天想在rviz里用pose表示一个vector xff0c 搞了半天 Pose的属性 xff0c point是起点 xff0c orientation是表示由坐标系原点将 1 0 0 这个向量旋转到想要显示的方向所需的旋转的四元数表示 假
  • 目录导读

    SLAM基础 xff1a SLAM基础 xff1a 计算相机运动 SLAM基础 xff1a 单目初始化问题 SLAM基础 xff1a 计算相机运动 3D 2D SLAM基础 xff1a 计算相机运动 3D 3D SLAM基础 xff1a I
  • 特定标志检测算法流程-棋盘格

    ROS标定工具是采用棋盘格 xff0c 具体实现是OPENCV 将输入图像降采样到大约VGA分辨率 xff0c 并在全尺寸图像中检测校准目标角点 结合这些明显正交的职责作为一个优化 棋盘式检测在大图像上太昂贵 xff0c 所以最好在较小的显
  • 无人驾驶——激光雷达篇

    激光雷达技术简介 无人驾驶技术是多项技术的集成 xff0c 包括传感器 定位与深度学习 高精地图 路径规划 障碍物检测与规避 机械控制 系统集成与优化 能耗与散热管理等 无人车系统的感知端由不同的传感器组成 xff0c 其中包括GPS xf
  • simulink搭建简单的陷波滤波器

    simulink搭建简单的陷波滤波器 陷波滤波器的设计模型的搭建通过matlab自带软件设计的滤波器与simulink自带滤波器模块对比 陷波滤波器的设计 具体设计方法可参见这篇 xff1a 算法学习笔记之50HZ陷波滤波器设计 下面给出各
  • docker——常用指令

    docker pull url 从url拉取容器 docker run d url 后台运行镜像 xff0c 如果不存在该镜像 xff0c 则会自动下载 docker exec it 容器id bash 进入镜像容器 xff0c 容器的id
  • Realsense、kinect在ROS环境下的骨骼识别(基于NuiTrack)

    ps 出售我购买的nuitrack liecense xff0c 支持月付 在弄不明白ROS Kinectic之后的openNI之后终于还是向Nuitrack骨骼识别屈服了 xff1a 那么先看看NuiTrack是啥 xff1a https
  • 深度图像帧差法处理以及CV16UC1深度图像的存储方式

    最近为了拾取桌面上的任务目标 xff0c 采用了实时图像与背景图像相减的方法来进行 xff0c 因为采用彩色图像相减会有影子的干扰 xff0c 所以采用了深度图像 但是深度图像的Mat是CV16UC1格式的 矩阵内部数据采用uint 16格
  • Couldn't find executable named joy_node below /opt/ros/kinetic/share/joy解决方法

    最近想用joy node这个节点 xff0c 然后就通过 sudo apt get install ros kinetic joy 去安装 xff0c 然后运行rosrun joy joy node时候一直错误显示Segmentation
  • ros修改map_server地图发布的map关联的坐标系frame_id(多机器人联合建图用)

    帮师弟做多机器人联合建图的时候 遇到了map的坐标系问题如下 map server发布的 map话题包含了frame坐标系关联 想要正确的让多个机器人共同建图导航需要修改 map话题以及其绑定的frame坐标系 防止机器人之间的相互冲突 下
  • ROS传输图像带宽不够用的解决方法(realsenseD415压缩图像)

    最近在做图像的深度学习识别 xff0c 但是移动机器人上的电脑配置不够 xff0c 只能用我的电脑远程的去处理图像 xff0c 但是遇到了严重的带宽瓶颈 xff0c 按照我的电脑150Mbps的无线网卡来算 xff0c 每秒的极限传输速度就
  • dockerfile配置运行

  • 气压计高度融合—卡尔曼滤波

    实验平台 xff1a 自制飞控板 xff0c STM32F407主控 xff0c 传感器 xff1a MPU6050 MS5611 正文 xff1a 前几天看了这篇文章 xff0c 做了气压计的高度融合 http www zxiazai c
  • GD32F303移植FreeRTOS

    GD32F303移植FreeRTOS 一 移植环境 系统 xff1a WIN7 MDK xff1a keil v5 26 开发板 xff1a GD32F303C EVAL 固件库 xff1a V1 0 2 FreeRTOS版本 xff1a
  • FreeRTOS静态创建任务

    一 静态方式创建任务和删除任务 1 gt 测试环境 系统 xff1a WIN7 MDK xff1a keil v5 26 开发板 xff1a GD32F303C EVAL 固件库 xff1a V1 0 2 FreeRTOS版本 xff1a
  • python实现smote处理正负样本失衡问题

    机器学习中难免遇到正负样本不平衡问题 xff0c 处理办法通常有梁总 xff0c 一 xff1a 过采样 xff0c 增加正样本数据 xff1b 二 xff1a 欠采样 xff0c 减少负样本数据 xff0c 缺点是会丢失一些重要信息 sm
  • echarts 饼图hover效果,饼图中间显示自定义信息

    option 61 tooltip show true trigger 39 item 39 position 39 35 39 39 32 39 backgroundColor 39 implements 39 textStyle col
  • MATLAB在线工具

    在线Matlab工具 xff0c 不用安装matlab了 xff0c 里面的语法几乎和matlab相同 matlab网页版 xff1a 1 octave online http octave online net 2 matlab onli
  • Apache IoTDB下载与安装

    1 中文官方文档 xff1a https iotdb apache org zh 2 下载地址 xff1a https iotdb apache org zh Download 发行版本踩了个小坑 xff1a 1 0 0版本启动时如果作为单

随机推荐

  • 【游戏开发】游戏开发书籍汇总

    1 游戏设计的艺术 2 游戏设计的100个原理 3 我在美国学游戏设计 4 游戏新手村 xff1a 从零开始做游戏 5 Directx游戏开发终极指南 6 Windows游戏编程大师技巧 7 快乐之道 xff1a 游戏设计的黄金法则 人类的
  • 【获奖公布】“我的2016”主题征文活动

    还记得2015的年末 xff0c 2016的新年伊始 xff0c 你给自己定下的目标 xff0c 对自己许下的诺言么 xff1f 时光荏苒 xff0c 一年又在指缝间溜走了 xff0c 离2016的结束还剩十多天 xff0c 在接下来的这十
  • Dockerfile介绍与指令解析

    一 Dockerfile介绍 镜像是容器的基础 xff0c 每次执行docker run的时候都会指定哪个镜像作为容器运行的基础 我们之前的例子都是使用来自docker hub的镜像 xff0c 直接使用这些镜像只能满足一定的需求 xff0
  • Kubernetes快速上手指南,让你所见即所得

    版权声明 xff1a 本文为 ABC实验室 原创文章 xff0c 版权所有 xff0c 侵权必究 xff01 编者语 Kubernetes作为新一代云计算平台 xff0c 自2014年开源以来得到快速发展 xff08 2016年 xff09
  • 使用github管理科研文献

    使用github管理科研文献 一 准备工作 xff1a 二 建立远程科研文献库三 远程科研文献数据库的维护四 其他PC客户端的访问 每个科研工作者都需要建立自己的科研文献库 以楼主本人为例 xff0c 我通常在实验室的台式机上完成科研文献的
  • RBF神经网络逼近在线自适应控制(MATLAB实现之S函数模块分析)

    上次用了参考模型的方法用RBF神经网络试了一下放到自适应控制模型上 xff0c 其实跟踪效果还可以 xff0c 放大了有点不舒服就是了 xff0c 差了一点点 xff0c 然后看了看书的第四章 xff0c 知道采用梯度下降法调整神经网络权值
  • 基于RBF神经网络的Flexible Robot自适应控制(论文笔记)

    上一篇笔记 https blog csdn net qq 24182661 记录的是第一篇论文2015 Continuum Robots for Medical Applications A survey的论文笔记 xff0c 主要做的笔记
  • Golang 解析xml文件标签带冒号( : )解决方案

    背景 xff1a 我们有项目需要使用golang语言解析rabbitmq xml 并把里面的内容解析出来 xff0c 但是在解析的时候遇到了问题 xff0c 最后通过google搜索 xff0c 在stackoverflow上找到了解决方案
  • 【Python】Python中 在函数内部对函数外的变量进行操作

    在Python中 xff0c 如果想函数内部对函数外的变量进行操作 xff0c 有一些问题 xff08 一些在Java xff0c C中再正常不过的操作这里就不行 xff09 正常情况下 xff0c 在函数外定义的变量是可以直接在函数体内部
  • 关于proteus中串口发送数据与实际不符的问题(如发00h,收80h)

    工程实训要用到串口 xff0c 51单片机 xff0c 串口工作方式一 xff0c 只发不接受 在proteus中用VIRTUAL TERMINAL xff08 虚拟终端 xff09 监视串口发送数据 现象 xff1a 不论是用虚拟终端还是
  • Jetson TX2的各种坑.md

    最近在使用Jetson TX2 在跑实验 xff0c 然后遇到下面问题 xff0c 做笔记 xff0c 记录一下 内存出错无法 xff0c 中断 出现下面那种错误 2019 01 11 19 41 46 959970 E tensorflo
  • 基于STM32的FreeRTOS开发(1)----FreeRTOS简介

    为什么使用freertos FreeRTOS 是一个免费和开源的实时操作系统 xff0c 它主要用于嵌入式系统 它非常轻量级 xff0c 可以在很小的硬件资源上运行 xff0c 因此非常适合在限制硬件资源的嵌入式系统中使用 FreeRTOS
  • 获奖公布 | 征文——从高考到程序员

    每年的这几天 xff0c 空气中总会弥漫着紧张的味道 xff0c 2017 全国统一高考如期而至 朋友圈里的各种高考热文如流水般 xff0c 不停歇地出现在眼前 xff0c 难免会勾起自己曾经的青涩时光 还记得 xff0c 考试前 xff0
  • STM32驱动ESP8266连接阿里云(2)----接入阿里IoT Studio实现Web可视化

    烧录MQTT固件 概述 阿里IoT Studio是一个物联网开发平台 xff0c 可用于快速构建基于云端的物联网应用 它提供了丰富的物联网组件和工具 xff0c 使得开发者可以轻松地进行设备接入 数据存储 数据分析等操作 要实现Web可视化
  • ‘gbk‘ codec can‘t encode character解决方法

    一 问题 xff1a 在将网络数据流导入文件时 xff0c 有可能遇到 39 gbk 39 codec can 39 t encode characte 错误 二 分析 xff1a 1 在windows下面 xff0c 新文件 xff08
  • ROS中的tf(transform)的理解 ,你追我小乌龟的深入剖析

    对于ros中的tf其实一直理解不是很深 xff0c 最近工作上一直在用 xff0c 就很懵逼 xff0c 出来混果然是要还的 xff5e 于是这两天把ros官方提供的小乌龟版的你追我 xff0c 如果你追到我 xff0c 我就让你xxx x
  • 线程同步之信号量(sem_init,sem_post,sem_wait)

    信号量和互斥锁 mutex 的区别 xff1a 互斥锁只允许一个线程进入临界区 xff0c 而信号量允许多个线程同时进入临界区 不多做解释 xff0c 要使用信号量同步 xff0c 需要包含头文件semaphore h 主要用到的函数 xf
  • 老程序员给的10条建议,句句经典

    1 想清楚 xff0c 再动手写代码 刚入行的新手 xff0c 为了展示自己的能力 xff0c 拿到需求迫不及待地就开始上手写代码 xff0c 大忌 xff01 2 不交流 xff0c 就会头破血流 不爱说话和沟通 xff0c 需求都理解错
  • Clickhouse快速上手 原理篇

    1 背景 公司目前使用Greenplum作为报表实时聚合查询的OLAP数据库 xff0c 当时主要是其使用门槛相对较低 xff0c 同时支持事务 xff0c 能在用户访问时候事务更新数据 xff0c 使用云厂商的产品 xff0c 技术支持也
  • Clickhouse快速上手 使用篇

    接着clickhouse原理篇 xff0c 下面来介绍他的具体使用场景 xff0c 包括数据导入 xff0c 更新等 文章目录 1 数据导入调研计划实施1 cos文件系统集成2 编码获取 2 数据更新和使用 1 数据导入 根据官方介绍 Cl