Docker は ClickHouse22.6.9.11 をインストールし、SpringBoot および MyBatisPlus と統合します

バックグラウンド

前の記事CentOS6.10 に ClickHouse19.9.5.36 をオフラインでインストールし、デフォルトのデータ ストレージ ディレクトリを変更すると、古いオペレーティング システムにClickHouse下位バージョン (ロシアナンバー 1 の検索エンジンの技術から生まれた) を直接インストールし、リモート アクセスを有効にしてパスワードを構成するプロセスが記録されます。

実際、2022 年 10 月頃に仮想マシンで をDocker実行して実験したところ、その時点ではまだ開くことができましたが、今度は国内イメージを置き換える必要があります。その時のrunの使用過程の記録ですClickHouseDockerHubDockerClickHouse

2023-06-10-ClickHouse.jpg

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あります。PlayGroundhttp://IP:8123/playWebOLAP

ブラウザ アクセス: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依存関係でのアタッチWebLombokMyBatis 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 PlusService、 、 、Mapperはそれぞれ継承しIServiceBaseMapperコードは投稿されません。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 PlusMyBatis 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;
    }
}

MyBatisPlusのソースコードを拡張する

コアコードはcom/heartsuit/infrastructureパスの下にあります。主にhttps://github.com/saimen90/clickhouseを参照してください。

2023-06-10-ExtendMyBatisPlus.jpg

また、新しい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);
}

ソースコード

参照


ご質問やバグが見つかった場合は、お気軽にご連絡ください。

ご意見やご提案は大歓迎です。

おすすめ

転載: blog.csdn.net/u013810234/article/details/131144221