Docker instala ClickHouse22.6.9.11 y se integra con SpringBoot y MyBatisPlus

fondo

Artículo anteriorInstalar ClickHouse19.9.5.36 sin conexión en CentOS6.10 y modificar el directorio de almacenamiento de datos predeterminadoClickHouse registra el proceso de instalación directa de la versión inferior (nacida de la tecnología del motor de búsqueda número uno de Rusia) en el antiguo sistema operativo , lo que permite el acceso remoto y la configuración de la contraseña;

De hecho , experimenté en una máquina virtual alrededor de octubre de 2022 ejecutando y aún podía abrirse en ese momento, pero ahora necesito reemplazar la imagen doméstica Docker. . Aquí hay un registro del proceso de uso de ejecutar en ese momento .ClickHouseDockerHubDockerClickHouse

2023-06-10-ClickHouse.jpg

DockerDirección del almacén espejo DockerHub(en circunstancias normales, ya no es accesible. Puede consultar el enlace al final del artículo para configurarlo usted mismo):https://hub.docker.com/r/clickhouse/clickhouse-server

entorno del sistema

[root@clickhouse1 local]# uname -a
Linux clickhouse1 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@clickhouse1 local]# cat /proc/version
Linux version 3.10.0-1127.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) ) #1 SMP Tue Mar 31 23:36:51 UTC 2020
[root@clickhouse1 local]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)

empezar a correr

De acuerdo con las instrucciones en la documentación de la imagen del contenedor, inicie ClickHouseel servicio con un solo clic.

docker run -d \
	-p 8123:8123 -p9000:9000 -p9009:9009 --privileged \
	-v /opt/clickhouse/data:/var/lib/clickhouse/ \
	-v /opt/clickhouse/logs:/var/log/clickhouse-server/ \
	--name heartsuit-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server:22.6.9.11

# 容器成功运行
[root@clickhouse1 ~]# docker ps
CONTAINER ID   IMAGE                                    COMMAND            CREATED              STATUS              PORTS                                                                                                                             NAMES
f1474927f130   clickhouse/clickhouse-server:22.6.9.11   "/entrypoint.sh"   About a minute ago   Up About a minute   0.0.0.0:8123->8123/tcp, :::8123->8123/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 0.0.0.0:9009->9009/tcp, :::9009->9009/tcp   heartsuit-clickhouse-server

# 验证服务OK
[root@clickhouse1 ~]# curl 192.168.44.148:8123
Ok.

Comandos para administración Dockery firewall.

systemctl start docker
systemctl status docker

systemctl stop firewalld
systemctl disable firewalld

experiencia inicial

Esta versión ClickHousetiene un PlayGroundpunto final: http://IP:8123/play, que puede interactuar directamente Webcon la base de datos a través de la forma de consulta;OLAP

Acceso al navegador: http://192.168.44.148:8123/playdespués de una experiencia rápida, las operaciones como construir una base de datos, crear una tabla y consultar son similares a usar MySQL.

show databases;

CREATE DATABASE IF NOT EXISTS helloworld;

show databases;

CREATE TABLE helloworld.my_first_table
(
    user_id UInt32,
    message String,
    timestamp DateTime,
    metric Float32
)
ENGINE = MergeTree()
PRIMARY KEY (user_id, timestamp);

INSERT INTO helloworld.my_first_table (user_id, message, timestamp, metric) VALUES
    (101, 'Hello, ClickHouse!',                                 now(),       -1.0    ),
    (102, 'Insert a lot of rows per batch',                     yesterday(), 1.41421 ),
    (102, 'Sort your data based on your commonly-used queries', today(),     2.718   ),
    (101, 'Granules are the smallest chunks of data read',      now() + 5,   3.14159 )

SELECT * FROM helloworld.my_first_table;

SELECT * FROM helloworld.my_first_table ORDER BY timestamp;

SELECT * FROM helloworld.my_first_table ORDER BY timestamp FORMAT TabSeparated;

Escribir tabla de datos a través de CSV

# 新建data.csv,写入逗号分隔的以下内容
vi data.csv

102,This is data in a file,2022-02-22 10:43:28,123.45
101,It is comma-separated,2022-02-23 00:00:00,456.78
103,Use FORMAT to specify the format,2022-02-21 10:43:30,678.90

# 向docker容器内传文件
docker cp data.csv heartsuit-clickhouse-server:/

docker ps

# 进入容器内部
docker exec -it heartsuit-clickhouse-server /bin/bash

# 指定目录启动ClickHouse命令行客户端,导入csv文件
clickhouse-client \
> --query='INSERT INTO helloworld.my_first_table FORMAT CSV' < data.csv

# 验证导入结果
SELECT * FROM helloworld.my_first_table

Nota: De forma predeterminada, el nombre de usuario predeterminado es: predeterminado y la contraseña está vacía; si necesita habilitar el acceso remoto en el entorno de producción real, se recomienda configurar la contraseña, como referencia: Instale ClickHouse19.9.5.36 sin conexión en CentOS6.10 y modifique el directorio de almacenamiento de datos predeterminado

Posibles problemas

Si no reinicia después de cerrar el firewall Docker, encontrará el siguiente mensaje de error al ejecutar el contenedor.

Respuesta de error del daemon: Error al configurar las tablas de IP: No se pudo habilitar la regla SKIP DNAT: (Error de iptables: iptables --wait -t nat -I DOCKER -i br-af6aa0eafdec -j RETURN: iptables: No hay cadena/objetivo/coincidencia con ese nombre.

SpringBoot integra ClickHouse y MyBatisPlus

Nuevo proyecto, funcionamiento normal, seleccionar , adjuntar SpringBooten dependencias .WebLombokMyBatis Plus

dependencias principales

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--ClickHouse 依赖-->
        <dependency>
            <groupId>ru.yandex.clickhouse</groupId>
            <artifactId>clickhouse-jdbc</artifactId>
            <version>0.1.53</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

archivo de configuración

mybatis-plus:
  configuration:
    # 开启下划线转驼峰
    map-underscore-to-camel-case: true
    # 指定默认枚举类型的类型转换器
    default-enum-type-handler: com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    banner: false
    db-config:
      # 逻辑删除(软删除)
      logic-delete-value: NOW()
      logic-not-delete-value: 'NULL'
  mapper-locations: classpath:mapper/*.xml

spring:
  datasource:
    driver-class-name: ru.yandex.clickhouse.ClickHouseDriver
    url: jdbc:clickhouse://IP:8123/poetry
    username: default
    password: CK666%

código central

A través de la integración MyBatis Plus, Service, Mapperrespectivamente heredan IServicey BaseMapper, no se publica ningún código, vea GitHubel código fuente al final del artículo para obtener más detalles.

  • clase de entidad

Más de 310.000 poemas de la base de datos de poesía. La poetryestructura de la tabla es la siguiente, el volumen de datos: 311828.

CREATE TABLE `poetry` (
	`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
	`title` VARCHAR(150) NOT NULL COLLATE 'utf8mb4_unicode_ci',
	`yunlv_rule` TEXT NOT NULL COLLATE 'utf8mb4_unicode_ci',
	`author_id` INT(10) UNSIGNED NOT NULL,
	`content` TEXT NOT NULL COLLATE 'utf8mb4_unicode_ci',
	`dynasty` VARCHAR(10) NOT NULL COMMENT '诗所属朝代(S-宋代, T-唐代)' COLLATE 'utf8mb4_unicode_ci',
	`author` VARCHAR(150) NOT NULL COLLATE 'utf8mb4_unicode_ci',
	PRIMARY KEY (`id`) USING BTREE
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=311829;
@Data
public class Poetry {
    
    
    @TableId
    private Integer id;
    private Integer authorId;
    private String title;
    private String content;
    private String yunlvRule;
    private String author;
    private char dynasty;
}
  • controlador

La base de datos de prueba de la interfaz se escribió por separado ClickHouse: consulta de lista, consulta condicional, consulta de paginación, agregar, modificar y eliminar funciones (aquí se encontraron problemas al probar las funciones de modificación y eliminación: es diferente de las declaraciones generales de modificación y eliminación en , y finalmente realizó la función de modificación y eliminación de acuerdo con la entidad al extender el código MyBatis Plusfuente MyBatis Plus) ID.

2023-06-10-RestAPI.jpg

@RestController
public class PoetryController {
    
    
    @Autowired
    private PoetryService poetryService;

    @Autowired
    private PoetryMapper poetryMapper; // 调用扩展方法

    @GetMapping("list")
    private List<Poetry> list() {
    
    
        return poetryService.list(new QueryWrapper<Poetry>().last("limit 10"));
    }

    @GetMapping("condition")
    private List<Poetry> listByCondition() {
    
    
        LambdaQueryWrapper<Poetry> wrapper = new QueryWrapper<Poetry>().lambda().eq(Poetry::getAuthor, "顾城");
        return poetryService.list(wrapper);
    }

    @GetMapping("page")
    private IPage<Poetry> listByPage(@RequestParam(defaultValue = "0") Integer page,
                                     @RequestParam(defaultValue = "2") Integer size) {
    
    
        return poetryMapper.selectPage(new Page<>(page, size), null);
    }

    @PostMapping("save")
    public boolean save() {
    
    
        Poetry poetry = new Poetry();
        poetry.setId(400000); // 如果ClickHouse中没有设置ID自增,需要显式赋值
        poetry.setAuthorId(20000);
        poetry.setTitle("一代人");
        poetry.setContent("黑夜给了我黑色的眼睛,我却用它寻找光明");
        poetry.setYunlvRule("balabala");
        poetry.setDynasty('Z');
        poetry.setAuthor("顾城");

        return poetryService.save(poetry);
    }

    // Update和Delete语句在ClickHouse中报错,ClickHouse的修改和删除SQL操作与MySQL不同。
    // 参考解决:https://github.com/saimen90/clickhouse
    @PutMapping("update/{id}")
    public boolean update(@PathVariable Integer id) {
    
    
        Poetry poetry = poetryService.getById(id);
        poetry.setYunlvRule("wow");
        return poetryMapper.updateByIdClickHouse(poetry); // 扩展方法
    }

//    报错!!需要扩展MyBatis源码
//    @PutMapping("update")
//    public boolean updateByCondition() {
    
    
//        UpdateWrapper<Poetry> updateWrapper = new UpdateWrapper<>();
//        return poetryService.update(updateWrapper.lambda().set(Poetry::getDynasty, "C").eq(Poetry::getId, 40000));
//    }

    @DeleteMapping("delete/{id}")
    public boolean deleteById(@PathVariable Integer id) {
    
    
        // 删除成功或失败,count都为0。。
        int count = poetryMapper.deleteByIdClickHouse(id); // 扩展方法
        return count > 0;
    }
}

Ampliar el código fuente de MyBatisPlus

El código central está com/heartsuit/infrastructuredebajo de la ruta, consulte principalmente https://github.com/saimen90/clickhouse .

2023-06-10-ExtendMyBatisPlus.jpg

Además, cree una nueva SupperMapper.javainterfaz y deje que la Mapperinterfaz de la entidad herede de ella SuperMapper.

public interface SuperMapper<T> extends BaseMapper<T> {
    
    

    /**
     * @return
     * @Description: 删除并填充删除人信息
     * @param: id 主键id
     * @auther: zpq
     * @date: 2020/11/10 11:47 上午
     */
    boolean updateByIdClickHouse(@Param("et") T entity);

    /**
     * @return
     * @Description: 删除并填充删除人信息
     * @param: id 主键id
     * @auther: zpq
     * @date: 2020/11/10 11:47 上午
     */
    boolean updateClickHouse(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);

    /**
     * 主键删除
     *
     * @param id
     * @return
     */
    int deleteByIdClickHouse(Serializable id);
}

Código fuente

Referencia


Si tiene alguna pregunta o se encuentra algún error, no dude en ponerse en contacto conmigo.

¡Tus comentarios y sugerencias son bienvenidos!

Supongo que te gusta

Origin blog.csdn.net/u013810234/article/details/131144221
Recomendado
Clasificación