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 .ClickHouse
DockerHub
Docker
ClickHouse
Docker
Direcció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 ClickHouse
el 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 Docker
y firewall.
systemctl start docker
systemctl status docker
systemctl stop firewalld
systemctl disable firewalld
experiencia inicial
Esta versión ClickHouse
tiene un PlayGround
punto final: http://IP:8123/play
, que puede interactuar directamente Web
con la base de datos a través de la forma de consulta;OLAP
Acceso al navegador: http://192.168.44.148:8123/play
despué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 SpringBoot
en dependencias .Web
Lombok
MyBatis 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
, Mapper
respectivamente heredan IService
y BaseMapper
, no se publica ningún código, vea GitHub
el 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 poetry
estructura 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 Plus
fuente MyBatis Plus
) ID
.
@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/infrastructure
debajo de la ruta, consulte principalmente https://github.com/saimen90/clickhouse .
Además, cree una nueva SupperMapper.java
interfaz y deje que la Mapper
interfaz 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!