如何通过JDBC将SQLServer导入Clickhouse

  1. 部署clickhouse-jdbc-bridge

clickhouse-jdbc-bridge是通过jdbc将Clickhouse与其他数据沟通的桥梁,可将其他数据库数据导入clickhouse中,也可以直接在clickhouse中访问其他数据库。

1.1 部署环境

Ubuntu 16.04 64位

1.2 重新编译bridge

git clone https://github.com/ClickHouse/clickhouse-jdbc-bridge.git 
cd clickhouse-jdbc-bridge   
mvn -Drevision=2.0.0 package

1.3 下载Microsoft JDBC驱动

把下载的驱动放到clickhouse-jdbc-bridge目录下的drivers子目录

本次JDBC版本为:mssql-jdbc-8.4.1.jre14.jar

注意:jdbc版本需与Ubuntu环境中的java版本一致

  1. 配置clickhouse-jdbc-bridge
cd target
mkdir -p config/datasources #创建config目录及datasources子目录用于存放配置

在datasources目录下创建数据源配置文件,msjdbc.json 文件名尽量与配置中的Datasource名一致,加入以下配置:

{
 "$schema": "../datasource.jschema",
  "msjdbc": {
      "driverUrls": [
          "/data/clickhouse-jdbc-bridge/drivers/mysql-connector-j-8.0.33.jar"
       ],
      "driverClassName": "com.mysql.jdbc.Driver",
      "jdbcUrl": "jdbc:mysql://xx.xx/test?compress=false&useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true",
      "username": "root",
      "password": "xxx",
      "connectionTestQuery": ""
   }
}
  1. 运行clickhouse-jdbc-bridge

cd target
java -jar clickhouse-jdbc-bridge-2.0.0.jar

如果成功运行,会出现已加载的数据源信息,如前面的msjdbc。

  1. 使用clickhouse-jdbc-bridge迁移数据

4.1 先用DBeaver或clickhouse-client创建表


CREATE TABLE test(id String, operateTime DateTime) ENGINE = MergeTree
PARTITION BY toYYYYMM(operateTime)
ORDER BY id
SETTINGS index_granularity = 8192;

4.2 进入clickhouse-client 执行insert into语句


INSERT INTO test SELECT * FROM jdbc('msjdbc', 'SELECT * FROM dbo.test');

到/etc/clickhouse-server目录下的config.xml文件,找到以下代码,移除注释,并修改host为执行clickhouse-jdbc-bridge-2.0.7-shaded.jar的ip地址:

<jdbc_bridge>
   <host>XX.XX.XX.XX</host>
   <port>9019</port>
</jdbc_bridge>

保存之后,重启clickhoust服务

systemctl restart clickhouse-server

超时问题解决:


mysql数据库生成百万计测试数据脚本

# 1.创建数据库
CREATE DATABASE test charset=utf8mb4;
USE test;
# 2.创建表
CREATE TABLE User (
    userId INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    registrationDate DATETIME NOT NULL,
    lastLogin DATETIME,
    createTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    updateTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP -- 更新时间
);
# 3.插入测试数据
INSERT INTO test.`User` (username, email, registrationDate, lastLogin) VALUES
('JohnDoe01', 'john.doe01@example.com', '2023-02-01 08:00:00', '2023-02-02 09:00:00'),
('JaneDoe02', 'jane.doe02@example.com', '2023-02-02 10:00:00', '2023-02-03 11:00:00'),
('MikeSmith03', 'mike.smith03@example.com', '2023-02-03 12:00:00', '2023-02-04 13:00:00'),
('LucyBrown04', 'lucy.brown04@example.com', '2023-02-04 14:00:00', '2023-02-05 15:00:00'),
('DavidWilson05', 'david.wilson05@example.com', '2023-02-05 16:00:00', '2023-02-06 17:00:00'),
('LindaTaylor06', 'linda.taylor06@example.com', '2023-02-06 18:00:00', '2023-02-07 19:00:00'),
('RobertJones07', 'robert.jones07@example.com', '2023-02-07 20:00:00', '2023-02-08 21:00:00'),
('PatriciaWhite08', 'patricia.white08@example.com', '2023-02-08 22:00:00', '2023-02-09 23:00:00'),
('MichaelHarris09', 'michael.harris09@example.com', '2023-02-09 08:30:00', '2023-02-10 09:30:00'),
('SarahMartin10', 'sarah.martin10@example.com', '2023-02-10 10:30:00', '2023-02-11 11:30:00');

# 4.批量插入100w数据
# 4.1 创建存储过程
DELIMITER $$
CREATE PROCEDURE InsertUsers()
BEGIN
  DECLARE i INT DEFAULT 0;
  WHILE i < 1000000 DO
    INSERT INTO User (username, email, registrationDate, lastLogin) VALUES 
    (CONCAT('User', LPAD(i, 7, '0')), CONCAT('user', LPAD(i, 7, '0'), '@example.com'), NOW(), NOW());
    SET i = i + 1;
  END WHILE;
END$$
DELIMITER ;
# 4.2 调用存储过程,生成100w用户数据
CALL InsertUsers();

clickhouse远程访问Oracle 11g数据库(clickhouse-jdbc-bridge)

步骤1、安装好clickhouse数据库
https://ooolo.net/article/442.html

步骤2、安装etl中间件ClickHouse JDBC Bridge

Clickhouse-jdbc-bridge:是clickhouse提供的一个jdbc组件,用于通过JDBC的方式远程访问其他数据库表。

Clickhouse支持通过JDBC连接外部数据库,所有支持JDBC驱动的数据库都能直接接入clickhouse。要实现JDBC连接,clickhouse需要使用以后台进程运行的程序 clickhouse-jdbc-bridge。
JDBC表引擎可以对接Mysql、Postgresql、SQLite等数据库,但是JDBC表引擎不能单独完成对接工作,需要依赖clickhouse-jdbc-bridge的查询代理服务,clickhouse-jdbc-bridge是java语言实现的sql代理服务,项目地址为:

https://github.com/ClickHouse/clickhouse-jdbc-bridge #作者的资源库有直接可以去下载RPM安装包

https://clickhouse.com/docs/zh/engines/table-engines/integrations/jdbc # clickhouse官网的介绍


我们看懂架构图,则需要保证
ClickHouse JDBC Bridge第三方插件要能正常连接到2个数据库。我们可以把这个插件看出是2个数据库直接的桥梁!
达梦8数据库肯定是完整支持jdbc协议的,所以这个就存在2个数据库数据类型的一一映射关系,这个关系,就在ClickHouse JDBC Bridge维护。

步骤3、ClickHouse JDBC Bridge安装部署方法

(1)在官网:https://github.com/ClickHouse/clickhouse-jdbc-bridge
下载源码程序到本地,通过在idea或者eclipse中执行mvn的clean、packge完成打包后,到打包目录里面找到clickhouse-jdbc-bridge-2.0.7-shaded.jar。
也可以下载编译好的包。。
(2)将clickhouse-jdbc-bridge-2.0.7-shaded.jar
放在Linux服务器的目录/data/clickhouse-jdbc-bridge下,并在该文件同级目录下新建两个目录:

config/datasources    --存放数据源配置文件
drivers               --jdbc驱动存放目录

(3)以连接JDBC访问Oracle 11g为例:
①在官网https://mvnrepository.com下载Oracle对应的驱动包ojdbc8-12.2.0.1.jar放置到/data/clickhouse-jdbc-bridge/drivers目录下。

②设置clickhouse-jdbc-bridge远程的数据库信息

mkdir -p config/datasources #创建config目录及其子目录

在datasources目录下创建数据源配置文件,msjdbc.json文件名尽量与配置中的datasource名一致,如下配置:

{
  "msjdbc": {
      "driverUrls": [
          "/data/clickhouse-jdbc-bridge/drivers/ojdbc8-12.2.0.1.jar"
       ],
      "driverClassName": "oracle.jdbc.driver.OracleDriver",
      "jdbcUrl": "jdbc:oracle:thin:@远程连接的数据库ip:端口:服务名",
      "username": "账号",
      "password": "密码",
      "connectionTestQuery": ""
   }
}


当前Linux服务器的目录为:

|--data
    |--clickhouse-jdbc-bridge
        |--clickhouse-jdbc-bridge-2.0.7-shaded.jar
        |--noput.out
        |--drivers
            |--ojdbc8-12.2.0.1.jar
        |--config
            |-- datasources
                |-- msjdbc.json

③运行clickhouse-jdbc-bridge

nohup java -jar clickhouse-jdbc-bridge-2.0.7-shaded.jar &
tail -f nohup.out

成功启动:

​④在clickhouse部署的那台服务器中

到/etc/clickhouse-server目录下的config.xml文件,找到以下代码,移除注释,并修改host为执行clickhouse-jdbc-bridge-2.0.7-shaded.jar的ip地址:

<jdbc_bridge>
   <host>XX.XX.XX.XX</host>
   <port>9019</port>
</jdbc_bridge>

保存之后,重启clickhoust服务

systemctl restart clickhouse-server

3、访问

(1)查看能成功访问的的链接:select * from jdbc('','show datasource')

(2)远程查询oracle的某个表

select from jdbc('msjdbc', 'select * from test_tb')

(3)直接远程连接

select from jdbc('jdbc:oracle:thin:账号/密码@xx.xx.xx.xx:端口/服务名', 'select * from test_tb')

Ubuntu安装clickhouse数据库

1、更新包列表

    sudo apt update


2、运行安装脚本

sudo apt-get install -y apt-transport-https ca-certificates dirmngr
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754
 
echo "deb https://packages.clickhouse.com/deb stable main" | sudo tee \
    /etc/apt/sources.list.d/clickhouse.list
sudo apt-get update
 
sudo apt-get install -y clickhouse-server clickhouse-client
 
sudo service clickhouse-server start
clickhouse-client # or "clickhouse-client --password" if you've set up a password.

3、设置密码


安装脚本会让你输入默认用户default的密码,我们可以直接回车不设置密码

安装成功
4、启动服务

 sudo clickhouse-server restart


5、测试连接

 clickhouse-client -m

-m参数是指开启多行输入,否则每次回车都会直接执行当前sql语句

--password xxx:如果有密码请加入此参数

6.远程连接

 1、修改本地配置

  nano /etc/clickhouse-server/config.xml

  2、把注释掉的<listen_host>::</listen_host>取消注释,然后重启服务

 service clickhouse-server restart 

java处理百万级日志的框架

处理百万级日志量的框架通常需要具备高效的日志收集、解析、存储和分析能力。以下是一些常用的Java框架和工具,可以帮助处理大规模的日志数据:

Apache Kafka:Kafka是一个分布式流处理平台,可用于高吞吐量的日志收集和传输。你可以使用Kafka作为日志的缓冲层,将日志发送到Kafka集群,然后进行后续的处理和存储。

Apache Spark:Spark是一个通用的分布式计算框架,提供了丰富的API和库,支持大规模数据的处理和分析。你可以使用Spark Streaming模块实时处理流式日志数据,或者使用Spark SQL模块进行批处理分析。

Apache Flink:Flink是另一个流处理框架,提供了低延迟、高吞吐量的流式计算能力。你可以使用Flink来处理实时日志数据,并且可以与其他存储系统集成,如Hadoop、Kafka等。

Elasticsearch:Elasticsearch是一个分布式搜索和分析引擎,特别适用于实时日志数据的存储和查询。你可以将日志数据索引到Elasticsearch中,然后使用Kibana等工具进行可视化和查询。

Logstash:Logstash是一个日志收集和处理工具,可以从多种来源收集日志数据,并且提供了丰富的过滤、转换和输出插件。你可以使用Logstash来收集、解析和转发日志数据。

Flume:Apache Flume是另一个日志收集工具,可用于将大量的日志数据从源端收集到目标端。Flume支持多种数据源和目的地,并且可以构建灵活的数据流拓扑。

以上框架和工具都有其独特的特点和适用场景,你可以根据项目需求和现有技术栈选择合适的工具组合来处理大规模的日志数据。