clickhouse数据导入遇到的问题

2023-11-16

1. 采用mybatis写入数据,速度很慢的问题;

采用mybatis拼接sql的方式,可以写入数据,但是效率很低。每秒数据大概200-300条数据记录。

2. 采用jdbc写入数据,可以使用两种数据源

// 新版本的包
import com.clickhouse.jdbc.ClickHouseDataSource;

// 这个包可以
import ru.yandex.clickhouse.ClickHouseDataSource

3. 时间格式设置问题

组织批量写库时的日期时间格式问题。

java.sql.Date sqlPayTime = new java.sql.Date(bill.getPayTime().getTime());
prepareStatement.setObject(39, new Timestamp(sqlPayTime.getTime()));

需要使用sql的Timestamp,不能使用java.util.Date,也不能使用java.sql.Date。

 4. 主键和排序键

在创建表时指定主键,会根据主键创建索引;
主键可以是多个列,不会影响查询性能,而且主键相同的数据可以重复;
一般不指定主键(primary key),而是指定排序键(order by),此时会把排序键作为主键;
排序键和主键可以不同,但此时主键必须时排序键的前缀。

5. 引擎参数问题

CREATE TABLE default.bill
(
    `bill_id` Int64,
    `bill_date` DateTime
)
ENGINE = ReplacingMergeTree
PARTITION BY toYYYYMM(bill_date)
ORDER BY bill_date
SETTINGS index_granularity = 8192;

 这个引擎设置是有问题的。

当排序key相同的数据,在做数据合并的时候,会进行去重处理。如果bill_date相同,就会进行数据合并。

CREATE TABLE default.bill
(
    `bill_id` Int64,
    `bill_date` DateTime,
    `plat_billno` String
)
ENGINE = ReplacingMergeTree(bill_date)
PARTITION BY toYYYYMM(bill_date)
ORDER BY (plat_billno, bill_date)
PRIMARY KEY (plat_billno)
SETTINGS index_granularity = 8192;

这个引擎设置才是正确的,因为账单编号本身是唯一的,所以不会造成数据被覆盖的情况。 

ReplacingMergeTree引擎

该引擎和 MergeTree 的不同之处在于它会删除排序键值相同的重复项。 数据的去重只会在数据合并期间进行。合并会在后台一个不确定的时间进行,因此你无法预先作出计划。有一些数据可能仍未被处理。尽管你可以调用 OPTIMIZE 语句发起计划外的合并,但请不要依靠它,因为 OPTIMIZE 语句会引发对数据的大量读写。

  • ENGINE:引擎名和参数。
  • ver:版本列,类型可以是UInt*,Date,或者DateTime,可选择的参数。合并的时候ReplacingMergeTree从相同的主键中选择一行保留,如果ver列未指定,则选择最后一条,如果ver列已指定,则选择ver值最大的版本。
  • PARTITION BY:分区键。要按月分区,可以使用表达式 toYYYYMM(date_column) ,这里的 date_column 是一个 Date 类型的列。这里该分区名格式会是 “YYYYMM” 这样。
  • ORDER BY:表的排序键。可以是一组列或任意的表达式。例如: ORDER BY (CounterID, EventDate) 。
  • optimize table replacing_test;

    触发合并,可以删除重复记录。

6. 事务提交问题

// 执行conn.setAutoCommit(false);会报Transactions are not supported异常
// 所以不能执行conn.commit();
// 只能执行pst.executeBatch();由clickhouse进行后台提交。测试时插入数据条数是正确的

7. 错误信息

ru.yandex.clickhouse.except.ClickHouseUnknownException: ClickHouse exception, code: 1002, host: 192.168.17.81, port: 8123; Connection pool shut down
        at ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier.getException(ClickHouseExceptionSpecifier.java:100)
        at ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier.specify(ClickHouseExceptionSpecifier.java:57)
        at ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier.specify(ClickHouseExceptionSpecifier.java:26)
        at ru.yandex.clickhouse.ClickHouseStatementImpl.sendStream(ClickHouseStatementImpl.java:1069)
        at ru.yandex.clickhouse.ClickHouseStatementImpl.sendStream(ClickHouseStatementImpl.java:1022)
        at ru.yandex.clickhouse.ClickHouseStatementImpl.sendStream(ClickHouseStatementImpl.java:1015)
        at ru.yandex.clickhouse.ClickHousePreparedStatementImpl.executeBatch(ClickHousePreparedStatementImpl.java:382)
        at ru.yandex.clickhouse.ClickHousePreparedStatementImpl.executeBatch(ClickHousePreparedStatementImpl.java:365)
        at com.ftsafe.quartz.task.ClickBillFromDb.batchInsertClickHouse(ClickBillFromDb.java:398)
        at com.ftsafe.quartz.task.ClickBillFromDb.dataTransProc(ClickBillFromDb.java:143)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at com.ftsafe.quartz.util.JobInvokeUtil.invokeMethod(JobInvokeUtil.java:56)
        at com.ftsafe.quartz.util.JobInvokeUtil.invokeMethod(JobInvokeUtil.java:33)
        at com.ftsafe.quartz.util.QuartzDisallowConcurrentExecution.doExecute(QuartzDisallowConcurrentExecution.java:19)
        at com.ftsafe.quartz.util.AbstractQuartzJob.execute(AbstractQuartzJob.java:43)
        at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: java.lang.IllegalStateException: Connection pool shut down
        at org.apache.http.util.Asserts.check(Asserts.java:34)

8. 对空值的处理

字符串属性为空,BigDecimal属性为空等。通过jdbc批量写入数据时,字段数据不能设置为空值,一旦设置为空值,就会报错,此时需要设置为sql的空值。

prepareStatement.setNull(45, Types.CHAR);

9. 空间不足异常

java.sql.BatchUpdateException: Code: 243. DB::Exception: Cannot reserve 7.24 MiB, not enough space. (NOT_ENOUGH_SPACE) (version 22.2.2.1)
, server ClickHouseNode(addr=http:192.168.17.81:8123, db=test)@1081606924
        at com.clickhouse.jdbc.SqlExceptionUtils.batchUpdateError(SqlExceptionUtils.java:90)
        at com.clickhouse.jdbc.internal.InputBasedPreparedStatement.executeAny(InputBasedPreparedStatement.java:133)
        at com.clickhouse.jdbc.internal.AbstractPreparedStatement.executeLargeBatch(AbstractPreparedStatement.java:85)
        at com.clickhouse.jdbc.internal.ClickHouseStatementImpl.executeBatch(ClickHouseStatementImpl.java:568)
        at com.ftsafe.quartz.task.ClickBillFromDb.batchInsertClickHouse(ClickBillFromDb.java:442)
        at com.ftsafe.quartz.task.ClickBillFromDb.dataTransProc(ClickBillFromDb.java:144)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at com.ftsafe.quartz.util.JobInvokeUtil.invokeMethod(JobInvokeUtil.java:56)
        at com.ftsafe.quartz.util.JobInvokeUtil.invokeMethod(JobInvokeUtil.java:33)
        at com.ftsafe.quartz.util.QuartzDisallowConcurrentExecution.doExecute(QuartzDisallowConcurrentExecution.java:19)
        at com.ftsafe.quartz.util.AbstractQuartzJob.execute(AbstractQuartzJob.java:43)
        at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)

上述错误原因是磁盘空间不足引起。

10. 优化后的性能

采用jdbc批量导入后的性能,基本上每秒写入数据量在1万条左右。

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

clickhouse数据导入遇到的问题 的相关文章

随机推荐

  • 2023华为od机试 Java【矩阵的最大值和最小值】

    题目 现在给你一个N M矩阵 M表示有M个矩阵 你的目标是找出M个该矩阵中每列元素的最大值 然后输出这M个值中的最小值 示例1 输入 1 2 3 4 输出 3 代码 import java util Scanner public class
  • 人工智能必备数学基础-目录

    数学基础学习笔记 为了学习人工智能 需要先打好数学基础 这里是为学习人工智能而准备的数学基础 线性代数 1 1 矩阵及其运算 1 1 1 矩阵基本概念及意义 1 1 2 基本运算 1 1 3 矩阵的迹 1 1 4 矩阵的转置 1 1 5 对
  • linux中文件权限

    linux中一切都是文件 这个设计秒不可言阿 在linux系统中每一个文件都有 三组权限 所有者 所属组 其它用户 文件类型 符号 作用 普通文件 d 目录文件 l 链接文件 b 块设备文件 c 字符设备文件 p 管道文件 文件权限 ls
  • 设计模式-原型模式

    文章目录 前言 什么是原型模式 Java中的原型模式 使用场景 优缺点 结论 前言 在软件开发中 设计模式是一种重要的思想和方法 用于解决常见的编程问题 原型模式是其中之一 它允许我们通过复制现有对象来创建新对象 而无需依赖具体类的构造函数
  • Java System.out.println()的简单理解

    前言 想必很多人对System out println 只是简单的进行运用 并未深入了解其背后的原理 例如当问及当中的out是什么 很多人可能一时答不上来 又比如问道println 方法属于那个类 你可能不假思索的答System类 可结果真
  • PostgreSQL(一)Windows安装

    目录 一 下载 二 安装PostgreSQL 三 安装StackBuilder 四 打开PostgreSQL管理工具pgAdmin 五 打开命令行 一 下载 下载地址 https www enterprisedb com downloads
  • openstack热迁移机制分析(libvirt热迁移模型、nova热迁移控制逻辑、调试方法)

    前段时间在解决大内存热迁移失败的时候 查阅了下openstack热迁移相关知识 有了一些记录跟大家分享下 以基于L版openstack qemu kvm 跟大家分享下API库libvirt的热迁移机制和nova控制逻辑的一些记录 注 这篇博
  • Jquery获取select选中的文本与值

    Jquery获取select选中的文本与值 jquery获取select选择的文本与值 获取select 获取select 选中的 text ddlregtype find option selected text 获取select选中的
  • Python3 unittest学习

    Python3 unittest学习 unittest单元测试框架 基本结构 执行测试 普通方式执行 通过unittest模块执行 跳过测试与预期失败 使用子测试区分测试迭代 类与函数 class unittest TestCase met
  • Linux内核中进程的初始化

    分析start kernel时应该会注意到Linux内核0号进程的初始化 见init main c set task stack end magic init task 其中 init task为第一个进程 0号进程 的进程描述符结构体变量
  • com.aspose.diagram.afr: Unexcepted eof.

    背景 SpringBoot项目 使用aspose diagram操作Visio 并且使用了模具文件 并将其放在了resource下面 代码 读取resource下面的文件 这种方法在linux环境上面依然可以使用 Resource reso
  • C#访问SQLite数据库,实现数据的增删改查功能

    说明 本文的代码是基于Winform中举例的 经过实测可用 1 封装Sqlite操作类 sqLiteHelper using System using System Collections Generic using System Linq
  • Arduino调节反馈式比例线性组件

    当您需要了解执行器的确切位置时 就需要光学反馈系列 它功能强大 可靠的执行器带有内置的光学传感器 可在您需要时提供反馈 光反馈没有内置控制器 但确实提供了单相脉冲作为位置反馈信号 可以将其输入到诸如Arduino之类的外部控制器中 多个线性
  • Selenium成长之路-24 frame(iframe)的处理

    今天来了解一下 frame的标签 frame标签有三种 frameset iframe frame gt gt gt frameset就当做一个普通的标签使用 gt gt gt 而frame与iframe就有点特殊了 所以接下来的时间 我们
  • 肖磊:不了解人类货币史,就别拿数字货币乱吹牛

    在知乎上 有一个并不起眼的问题 有人问 如果世界上只有一种货币 且总量一定 这个世界会发生什么 其中一个回答是这样的 假如一个村子只给他一亿流通币 且只准以这种流通币交易 会发生什么情况呢 首先你会感觉物价便宜了 因为在社会物资增加 而货币
  • c语言 char / short / int中能存储多大的数据?

    我们都知道char能存储的数据范围是 128 127 unsigned chard 范围是0 255 short能存储的数据范围是 32768 32767 unsigned short 范围是0 65535 int能存储的数据范围是 214
  • 【C#:学生信息管理系统-部分代码1】

    创建项目Windows窗体应用程序 创建一个DBhelp cs类 连接数据库 每次只用调用这个类就行了 这样调用 DBhelp conn Open using System using System Collections Generic
  • Open3D 计算点云包围盒

    目录 一 主要函数 1 AABB包围盒 1 1获取包围盒边长 2 OBB包围盒 2 1获取包围盒边长 二 代码实现 三 结果展示 一 主要函数 1 AABB包围盒 1 get axis aligned bounding box 获取aabb
  • 【AD20学习笔记】原理图库基础概念篇

    2022 7 6 暑假里还是跟着凡亿教育的课程再学习一遍吧 虽然这个课程已经看了很多遍了 但老是记不住 实战的时候需要在调视频看 很难受 这次再系统完整地跟一遍基础和实战 在这里记录一下 我这里一般是看完一堂课就开画了 不是很系统详细写 仅
  • clickhouse数据导入遇到的问题

    1 采用mybatis写入数据 速度很慢的问题 采用mybatis拼接sql的方式 可以写入数据 但是效率很低 每秒数据大概200 300条数据记录 2 采用jdbc写入数据 可以使用两种数据源 新版本的包 import com click