バックグラウンド
前の記事CentOS6.10 に ClickHouse19.9.5.36 をオフラインでインストールし、デフォルトのデータ ストレージ ディレクトリを変更すると、古いオペレーティング システムにClickHouse
下位バージョン (ロシアナンバー 1 の検索エンジンの技術から生まれた) を直接インストールし、リモート アクセスを有効にしてパスワードを構成するプロセスが記録されます。
実際、2022 年 10 月頃に仮想マシンで をDocker
実行して実験したところ、その時点ではまだ開くことができましたが、今度は国内イメージを置き換える必要があります。。その時のrunの使用過程の記録です。ClickHouse
DockerHub
Docker
ClickHouse
Docker
ミラー ウェアハウスのDockerHub
アドレス (通常の状況ではアクセスできなくなります。記事の最後にあるリンクを参照して自分で設定できます):https://hub.docker.com/r/clickhouse/clickhouse-server
システム環境
[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)
走り始める
コンテナー イメージのドキュメントの指示に従って、ClickHouse
ワンクリックでサービスを開始します。
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.
管理Docker
およびファイアウォール用のコマンド。
systemctl start docker
systemctl status docker
systemctl stop firewalld
systemctl disable firewalld
最初の経験
このバージョンには、クエリを通じてデータベースと直接対話できるエンドポイントがClickHouse
あります。PlayGround
http://IP:8123/play
Web
OLAP
ブラウザ アクセス:http://192.168.44.148:8123/play
簡単に体験した後、データベースの構築、テーブルの作成、クエリなどの操作は を使用する場合と似ています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;
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
注: デフォルトでは、デフォルトのユーザー名はデフォルトで、パスワードは空です。実際の運用環境でリモート アクセスを有効にする必要がある場合は、参考としてパスワードを設定することをお勧めします: ClickHouse19.9.5.36 を CentOS6.10 にオフラインでインストールし、デフォルトのデータ ストレージ ディレクトリを変更する
考えられる問題
ファイアウォールを閉じた後に再起動しないとDocker
、コンテナーの実行時に次のエラー メッセージが表示されます。
デーモンからのエラー応答: IP テーブルのセットアップに失敗しました: SKIP DNAT ルールを有効にできません: (iptables が失敗しました: iptables --wait -t nat -I DOCKER -i br-af6aa0eafdec -j RETURN: iptables: その名前によるチェーン/ターゲット/一致はありません。
SpringBoot は ClickHouse と MyBatisPlus を統合します
新しいプロジェクト、通常の操作、選択、SpringBoot
依存関係でのアタッチ。Web
Lombok
MyBatis Plus
コアの依存関係
<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>
設定ファイル
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%
コアコード
統合を通じてMyBatis Plus
、Service
、 、 、Mapper
はそれぞれ継承しIService
、BaseMapper
コードは投稿されません。GitHub
詳細については、記事の最後にあるソース コードを参照してください。
- エンティティクラス
詩データベースからの 310,000 を超える詩。テーブルpoetry
構造は次のとおりです。データ量は 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;
}
- コントローラ
インターフェイス テスト データベースはClickHouse
、リスト クエリ、条件付きクエリ、ページング クエリ、追加、変更、および削除機能を個別に作成しました (ここで、変更および削除機能をテストするときに問題が発生しました。これは、 の一般的な変更および削除ステートメントとは異なり、ソース コードを拡張することで、最終的にエンティティに応じて変更および削除する機能を実現しましMyBatis Plus
た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;
}
}
MyBatisPlusのソースコードを拡張する
コアコードはcom/heartsuit/infrastructure
パスの下にあります。主にhttps://github.com/saimen90/clickhouseを参照してください。
また、新しいSupperMapper.java
インターフェイスを作成し、エンティティのMapper
インターフェイスをそれから継承させます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);
}
ソースコード
参照
ご質問やバグが見つかった場合は、お気軽にご連絡ください。
ご意見やご提案は大歓迎です。