clickhouse初探

news2024/11/9 9:45:49

背景

目前公司用的是influxdb来存储时序数据,但是influxdb太坑了·,查一天的数据就开始内存猛涨,然后就炸了,查询语句也不适应。因此调研了tdengine,还把influxdb和tdengine做了性能对比。
结果嘛 ,首先tdengine确实比influxdb快,内存也不会暴涨,sql用着也顺手,但是tdengine集群模式才刚起步。很多问题得不到解答,社区不活跃,建了几个微信群,有问题都是在群里猛问,人家也不一定回答。感觉有点小家子气,谁整天关注群消息啊···
总之,最后哪个也没选,凑合着用吧先,倒是服务器扩容了,算是解决了问题。
最近又看到了clickhouse,用来分析用户画像之类的不错,就学一学,探探路。
之所以写这篇文章,实在是遇到了几个新手会遇到的坑,所以来分享下,希望能让你也少走点弯路。同时,我也是新学的,内容比较浅显····

照着官网安装、测试都没有问题,就是坑在了用java连接上。

一、远程连接

我在虚拟机上装的CH,在本机测试,不可避免的,要配置下允许远程连接,很多软件都有这个。
配置软件目录是:/etc/clickhouse-server/config.xml
正确的配置方法如下:
在这里插入图片描述

这两个不动,把上面那个:: 注释去掉
    <listen_host>::1</listen_host>
    <listen_host>127.0.0.1</listen_host>
其实可以看到注释上说,这两个是默认的value,分别对应IPv4 and IPv6的ip。

改成:: ,即可listen所有ip,当然改成装机的ip更好

修改后重启即可
systemctl restart clickhouse-server.service

可以通过查看端口来验证:
修改前:
lsof -i :8123
COMMAND       PID       USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
clickhous 2901438 clickhouse   53u  IPv6 2962808809      0t0  TCP localhost:8123 (LISTEN)
clickhous 2901438 clickhouse   55u  IPv4 2962808813      0t0  TCP localhost:8123 (LISTEN)

可以看到IPv4 and IPv6 都是绑定的localhost

curl 'http://localhost:8123/'
Ok.
curl 'http://192.168.1.100:8123/'
curl: (7) Failed to connect to 192.168.1.100 port 8123: 拒绝连接

通过localhost查询就可以,通过ip就不行。
修改后就可以了
lsof -i :8123
COMMAND       PID       USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
clickhous 2923409 clickhouse   58u  IPv6 2963328449      0t0  TCP *:8123 (LISTEN)

curl 'http://192.168.1.100:8123/'
Ok.

如果不配置,代码中的错误大概是:
com.clickhouse.client.ClickHouseException: 拒绝连接 (Connection refused)

如果重启失败,比如:

systemctl start clickhouse-server.service
Job for clickhouse-server.service failed because the service did not take the steps required by its unit configuration.
See "systemctl status clickhouse-server.service" and "journalctl -xe" for details.

可以查看启动日志:/var/log/clickhouse-server/clickhouse-server.err.log
我就遇到了错误:
Address already in use: [::]:9000

这是因为我装了hadoop,把9000占用了。把端口改为9001即可,
客户端连接的时候指定一下端口:

clickhouse-client --port 9001

还有的错误是Address already in use: [::]:8123
这就奇怪了,lsof明明没有查到,那是因为上回启动CH失败后,CH并不会就直接失败了,停了。而是一直启动中的状态

systemctl status clickhouse-server.service
● clickhouse-server.service - ClickHouse Server (analytic DBMS for big data)
   Loaded: loaded (/usr/lib/systemd/system/clickhouse-server.service; enabled; vendor preset: disabled)
   Active: activating (auto-restart) (Result: protocol) since Sun 2023-06-25 10:34:54 CST; 22s ago
 Main PID: 2903753

所以需要先把CH stop,然后再start

这里说一下CH占用的端口:

    <!-- Port for HTTP API. See also 'https_port' for secure connections.
         This interface is also used by ODBC and JDBC drivers (DataGrip, Dbeaver, ...)
         and by most of web interfaces (embedded UI, Grafana, Redash, ...).
      -->
    <http_port>8123</http_port>

    <!-- Port for interaction by native protocol with:
         - clickhouse-client and other native ClickHouse tools (clickhouse-benchmark, clickhouse-copier);
         - clickhouse-server with other clickhouse-servers for distributed query processing;
         - ClickHouse drivers and applications supporting native protocol
         (this protocol is also informally called as "the TCP protocol");
         See also 'tcp_port_secure' for secure connections.
    -->
    <tcp_port>9000</tcp_port>

    <!-- Compatibility with MySQL protocol.
         ClickHouse will pretend to be MySQL for applications connecting to this port.
    -->
    <mysql_port>9004</mysql_port>

    <!-- Compatibility with PostgreSQL protocol.
         ClickHouse will pretend to be PostgreSQL for applications connecting to this port.
    -->
    <postgresql_port>9005</postgresql_port>

    <!-- HTTP API with TLS (HTTPS).
         You have to configure certificate to enable this interface.
         See the openSSL section below.
    -->
    <!-- <https_port>8443</https_port> -->

    <!-- Native interface with TLS.
         You have to configure certificate to enable this interface.
         See the openSSL section below.
    -->
    <!-- <tcp_port_secure>9440</tcp_port_secure> -->

    <!-- Native interface wrapped with PROXYv1 protocol
         PROXYv1 header sent for every connection.
         ClickHouse will extract information about proxy-forwarded client address from the header.
    -->
    <!-- <tcp_with_proxy_port>9011</tcp_with_proxy_port> -->

    <!-- Port for communication between replicas. Used for data exchange.
         It provides low-level data access between servers.
         This port should not be accessible from untrusted networks.
         See also 'interserver_http_credentials'.
         Data transferred over connections to this port should not go through untrusted networks.
         See also 'interserver_https_port'.
      -->
    <interserver_http_port>9009</interserver_http_port>

8123是http的端口,9000是tcp的端口
java的客户端是用的http协议,因此要用8123,
clickhouse-client用的是tcp协议,因此默认是9000

mysql,postgresql的端口用于,用mysql等连接CH,例如:

mysql --protocol tcp -u default -P 9004

二、java连接

java连接有很多种api,网上搜一搜,大概有三种

官方的:

https://github.com/ClickHouse/clickhouse-java

<dependency>
    <groupId>com.clickhouse</groupId>
    <!-- or clickhouse-grpc-client if you prefer gRPC -->
    <artifactId>clickhouse-http-client</artifactId>
    <version>0.4.6</version>
</dependency>

据说以前是ru.yandex.clickhouse,现在已经不再更新了,目前(2023年6月25日)就是com.clickhouse

还有第三方的比如:
https://github.com/housepower/ClickHouse-Native-JDBC
https://github.com/blynkkk/clickhouse4j

反正都是对CH提供的各种协议接口进行了封装抽象。

这里只说一下官网的api:

  • Java client
  • JDBC Driver
  • R2DBC Driver

java client是基础层,JDBC 和 R2DBC是构建于 client之上的,JDBC是同步的,R2DBC是异步的。性能来说 当然是client更好

先看下官网的client例子:
在这里插入图片描述
这个例子其实是有点坑的,且不说下面query的例子 语法有点奇怪的问题,上面那个url其实不需要加jdbc:ch://,加了反而报错

16:13:07.163 [ClickHouseScheduler-1] DEBUG com.clickhouse.client.ClickHouseNode - Failed to probe localhost:0
java.net.ConnectException: connect: Address is invalid on local machine, or port is not valid on remote machine

调试了半天也没找到为啥会连接localhost:0。忽然看到代码中有一行
ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP);
既然是http协议,那会不会是jdbc开头了,它识别不出来?,改回http开头,果然,一下就成功了。
这里贴一下运行成功的代码,官网的connect方法也过时了,改成了read


import com.clickhouse.client.*;
import com.clickhouse.data.ClickHouseFormat;
import com.clickhouse.data.ClickHouseRecord;


public class CHClientTest {
    public static void main(String[] args) throws ClickHouseException {
        ClickHouseNodes servers = ClickHouseNodes.of(
                "http://192.168.1.100:8123/tutorial"
                        + "?load_balancing_policy=random&health_check_interval=5000&failover=2");
        ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP);

        ClickHouseResponse response = client.read(servers) // or client.connect(endpoints)
                // you'll have to parse response manually if using a different format
                .format(ClickHouseFormat.RowBinaryWithNamesAndTypes)
                .query("select * from numbers(:limit)")
                .params(1000).executeAndWait();
        ClickHouseResponseSummary summary = response.getSummary();
        long totalRows = summary.getTotalRowsToRead();
        for (ClickHouseRecord r : response.records()) {
            int num = r.getValue(0).asInteger();
            System.out.println(num);
        }

    }
}

再看下jdbc的例子:
在这里插入图片描述
这里只需要改下getConnection的密码,默认情况下,CH的用户就是default,密码是空字符串

贴一下代码


import com.clickhouse.client.ClickHouseException;
import com.clickhouse.jdbc.ClickHouseDataSource;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class CHJDBCTest {
    public static void main(String[] args) throws ClickHouseException, SQLException {


        String url = "jdbc:ch://192.168.1.100:8123/tutorial"; // use http protocol and port 8123 by default
// String url = "jdbc:ch://my-server:8443/system?ssl=true&sslmode=strict&&sslrootcert=/mine.crt";
        Properties properties = new Properties();
// properties.setProperty("ssl", "true");
// properties.setProperty("sslmode", "NONE"); // NONE to trust all servers; STRICT for trusted only
        ClickHouseDataSource dataSource = new ClickHouseDataSource(url, new Properties());
        try (Connection conn = dataSource.getConnection("default", "");
             Statement stmt = conn.createStatement()) {
            ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM tutorial.visits_v1");
            while (rs.next()) {
                System.out.println(rs.getBigDecimal(1));
            }
        }
    }
}

顺便一提,try后面的小括号,叫做try-with-resources机制,将实现了 java.lang.AutoCloseable 接口的资源定义在 try 后面的小括号中,无论 try 块是正常结束仍是异常结束,这个资源都会被自动关闭。
try 小括号里面的部分称为 try-with-resources 块。编译器自动帮我们生成了finally块,并且在里面调用了资源的close方法。

好了,至此总结完毕,有新的收获再回来更新(flag一定要立)

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

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

相关文章

C语言:位操作----将某一位置1或置0

C语言 基础开发----目录 前期准备 想要将将某一位置1或置0&#xff0c;需要进行位操作。 此次需要用到 与(&)&#xff0c;或(|)&#xff0c;左移(<<)和右移(>>) 这四个位操作。 具体位操作说明&#xff1a;C语言&#xff1a;位运算符----与(&)&#xff…

5年资深Android开发,转行逆向开发该如何学习?

Android逆向是什么&#xff1f; 简单地来说&#xff0c;安卓逆向是对已经打包好的APP进行反编译、源码分析了解APP实现逻辑的一门技术。我们可以把安卓安装时用到的APK文件看作一个加密后的压缩包&#xff0c;逆向就是要最大程序地还原出APK打包之前的源码。 逆向需要用到解密…

[Web程序设计]实验: Web基础

一、实验目的 &#xff08;1&#xff09;掌握开发工具的安装和配置 &#xff08;2&#xff09;熟悉程序的编写&#xff0c;运行和访问方法&#xff1b; 二、实验内容 &#xff08;1&#xff09;请编写出一个HTML页面&#xff0c;令其输出“hello world!~~”&#xff0c;使用…

略施小计,拥有自己的GPT

ChatGPT一经发布就在AI圈引起轰动&#xff0c;GPT-4和chagpt-plugin让OpenAI和其他同行拉开了更大的差距。由于某些原因&#xff0c;我们可能无法亲身体验ChatGPT的神奇之处。但现在&#xff0c;如果你还没有体验过ChatGPT&#xff0c;就像10年前没有购买比特币一样&#xff08…

SuperMap GIS基础产品WebGIS FAQ集锦(3)

SuperMap GIS基础产品WebGIS FAQ集锦&#xff08;3&#xff09; 【iClient】iClient for Leaflet,如何修改map的默认渲染方式&#xff1f; 【解决办法】map的默认渲染方式取决于浏览器支持&#xff0c;可通过renderer属性设置&#xff0c;设置为L.SVG或L.Canvas 【iClient】le…

k8s 学习九,pod 知识点 上

在 K8S 中&#xff0c; pod 是一个非常关键的存在&#xff0c;我们一起来看看 pod 具体是个什么&#xff1f; pod 是个啥&#xff1f; pod 是个什么呢&#xff1f;pod 是 K8S中的一个核心概念 每一个 pod 都会有一个特殊的根容器&#xff0c;叫做 pause 容器&#xff0c;paus…

云原生:深入掌握Docker日志管理:高效策略与最佳实践

前言 在docker的整个生命周期中&#xff0c;超过70%的时间&#xff0c;我们都是在用docker进行运维工作&#xff0c; 查看docker的日志&#xff0c;是运维中的必会技能。 docker日志分为&#xff1a; docker引擎日志应用日志 今天我们重点来讨论下docker的日志使用&#xf…

【博客672】prometheus使用数据外推与兼容跳变重置来优化处理窗口函数(rate,irate,increase)

prometheus使用数据外推与兼容跳变重置来优化处理窗口函数(rate&#xff0c;irate&#xff0c;increase) 场景 以下是用于计算计数器增长率的三个函数之间差异的高级概述&#xff1a; rate()&#xff1a;这计算每秒的增长率&#xff0c;在整个提供的时间窗口内平均。示例&am…

谷歌推出“能讲会听”的大语言模型AudioPaLM,实现语音理解和生成

出品人&#xff1a;Towhee 技术团队 作者&#xff1a;顾梦佳 近日&#xff0c;谷歌推出了一个能够理解并生成语音理解的大型语言模型——AudioPaLM。这一模型融合了分别基于文本和语音两种语言模型——PaLM-2 和 AudioLM&#xff0c;形成了一个统一的多模态架构。该模型不仅能对…

@monthly /root/.cfg/./dealer病毒清除

登录服务器时&#xff0c;ssh提示密码不对&#xff0c;就去控制台检查&#xff0c;查看到虚拟平台中多台服务器提示虚拟机CPU使用告警&#xff0c;占用过高。远程无法登录。 原因分析&#xff1a;所有中毒的均为linux服务器&#xff0c;密码设置过于简单&#xff0c;防火墙关闭…

【算法题】统计各位数字之和为偶数的整数个数、替换空格、旋转数组的最小数字

算法题之数字处理 一、统计各位数字之和为偶数的整数个数1.1、题目1.2、理解题目1.3、解题思路&#xff08;暴力枚举&#xff09;1.4、解题思路2&#xff08;数学公式&#xff09;1.5、小结 二、替换空格2.1、题目2.2、解题&#xff1a;遍历原地修改 三、旋转数组的最小数字3.1…

如何判断TongWeb是否支持某种数据库?

起因&#xff1a; 数据库连接池本是一项成熟的技术&#xff0c;但随着数据库厂家、种类的增加&#xff0c;常常被问到TongWeb是否支持XX数据库&#xff1f; 说明&#xff1a; 数据库连接池的基本思路是&#xff0c;平时建立适量的数据库的连接&#xff0c;放在一个集合中&…

举例说明,JS中的【return true】和【return false】的【使用场景】

1.return true和return false都是写在函数里面 2.如果一个函数需要有返回值&#xff0c;则函数中需要写return相关 3.return true和return false是之后调用这个函数判断用&#xff1a; 如果一个函数需要返回值&#xff0c;则需要在函数中添加return 如果函数中添加的是 比如 …

2-css-4

一 标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 二 浮动 1 认识 作用&#xff1a;让块元素水平排列。 属性名&#xff1a;float 属性值 left&#xff1a;左…

跳槽过去,刚工作三天就被裁是一种怎样的体验

前言 还有谁&#xff1f;刚上三天班就被公司公司的工作不适合我&#xff0c;叫我先提升一下。 后面我也向公司那边讨要了一个说法&#xff0c;我只能说他们那边的说辞让我有些不服气。 现在之所以把这件事在csdn上记录一下&#xff0c;一是记录一下自己的成长轨迹&#xff0…

2023计算机组成原理【5-7】

第五章 中央处理器 1&#xff0e;指令周期的概念&#xff0c;与时钟周期、机器周期的区别。 指令周期是执行一条指令所需的时间&#xff0c;包括多个子阶段的时间总和时钟周期是计算机系统中的基本时间单位&#xff0c;由时钟信号控制&#xff0c;用于同步处理器和其他组件的操…

Collectors.toMap使用详解

这里写目录标题 一、使用规则二、源码及方法三、代码示例1.将list转成以id为key的map&#xff0c;value是id对应的Dept对象2.假如id存在重复值&#xff0c;则会报错Duplicate key xxx, 解决方案是3.想获得一个id和name对应的Map<Integer, String>4.把Dept集合按照group分…

5年软件测试工作经验,高不成低不就,真的只能转行了吗?

迷茫感&#xff0c;从哪里来&#xff1f; 不知不觉在软件测试行业&#xff0c;野蛮生长了5年之久。这一路上拥有了非常多的感受。有迷茫&#xff0c;有踩过坑&#xff0c;有付出有收获&#xff0c; 有坚持&#xff01; 我一直都在软件测试行业奋战&#xff0c; 毕业时一起入职…

制作自定义pfx证书(数字签名)

目录 生成server.key 生成server.crt 生成server.pfx 结果 exe文件签名 生成server.key openssl genrsa -des3 -out server.key 2048 Generating RSA private key, 2048 bit long modulus (2 p

单独生成 main.exe, pyinstaller × pyecharts 打包报错找不到文件 map_filename.json 一次搞定!

报错&#xff1a; FileNotFoundError: [Errno 2] No such file or directory: ‘C:\Users\xxx\AppData\Local\Temp_MEI3455\pyecharts\datasets\map_filename.json’ pyecharts 打包成 exe 的时候找不到 map_filename.json 文件。先找到这个文件,一般在本机 Python 安装目录下…