Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Dataset]数据镜像制作步骤 #28

Open
bifenglin opened this issue Jun 5, 2022 · 3 comments
Open

[Dataset]数据镜像制作步骤 #28

bifenglin opened this issue Jun 5, 2022 · 3 comments

Comments

@bifenglin
Copy link
Collaborator

bifenglin commented Jun 5, 2022

关于制作 ClickHouse 采样数据镜像的步骤:

  • 需要等待线上数据导入完成
  • 将表结构导出,使用 SQL 为 SHOW CREATE TABLE github_log.events FORMAT TabSeparated OUTFILE 输出到某个文件
  • 将采样数据导出,使用 SQL 为 SELECT * FROM github_log.events WHERE ... FORMAT Native/JSONCompact OUTFILEWHERE 子句为筛选条件,如时间区间、采样频率、仓库范围等。FORMAT 为输出格式,Native 为二进制格式,使用空间最小,但不可读,无法验证。JSONCompact 为压缩 JSON,仅有 value,可做验证。输出到某个文件即可。
  • 使用一个新的 ClickHouse Server 容器,目前线上版本为 20.8.7.15,官方基础镜像使用相同版本。ARM 镜像需要使用另外的非官方镜像为基础镜像。
  • 接下来有多种处理方式:
    • 1、将上述导出的表结构文件与数据文件打包到官方服务器镜像中,并在启动时使用 shell 脚本动态进行数据初始化,并在初始化后删除原始文件,设置标记文件,以防止容器启停后再次初始化。这种方式的问题在于数据导入时需要消耗较大内存,无论数据量大小,导入时内存消耗峰值可达 6GB 以上,故需要宿主机至少 8GB 内存分配给 ClickHouse 容器方可保证正常初始化。
    • 2、分步制作镜像。首先启动一个新的 ClickHouse 服务器镜像,并通过脚本建表和导入数据,导入后将数据卷移动到其他目录备用,并在镜像中设置启动 shell 脚本将数据文件在镜像启动时拷贝到数据目录下完成初始化。之后使用 docker commit 提交当前容器为一个镜像即可。需要进行数据移动的原因是:由于这行设置,ClickHouse 服务器官方镜像的数据目录并不在镜像内,而是在宿主机的匿名 Volume 中,因此无法在容器内持久化。除通过数据目录的移动备份方式外,还可以我们自己修改官方 Dockerfile 并重新打包自己的服务端镜像,使数据卷可以持久化。

Originally posted by @frank-zsy in #27 (comment)

@bifenglin
Copy link
Collaborator Author

bifenglin commented Jun 5, 2022

目前需要做数据科学与工程数据镜像
需求是15年到22年的活跃TOP50的项目统计,去除actor_name字段中包含bot 字样的数据。
从步骤中有以下疑问:

  1. ClickHouse Server基础镜像ARM和非ARM直接给出
  2. 初始化脚本等能否给出

@frank-zsy

@frank-zsy
Copy link
Collaborator

但我个人较倾向于使用第一种方式进行构建,原因是第一种方式下,最终形态可以做到数据与容器镜像分离,即 OpenDigger 的采样数据镜像可以使用同一个,在启动时将表结构文件和数据文件的 URL 在启动时传入即可,这样可以在启动时直接从 OSS 上拉取数据后导入完成初始化。这样可扩展性极好,采样数据侧仅需生成静态文件上传到 OSS 即可。而第二种方式,则每种采样数据都需要生成一个新的镜像,最终对镜像服务的存储压力也会较大。

@frank-zsy
Copy link
Collaborator

frank-zsy commented Jun 5, 2022

  • 官方 x86 镜像:docker pull yandex/clickhouse-server:20.8.7.15
  • 非官方 ARM 镜像:docker pull altinity/clickhouse-server:21.8.12.29.altinitydev.arm
  • 初始化脚本有多套,我目前没有与当前数据库匹配的版本,以及要区分使用的是哪种方式构建,使用第一种方式构建,并在启动时导入本地数据文件的脚本如下,供参考。其中 data.tar.gz 为压缩后的数据和建表文件。data 为数据文件,格式为 Native,table 为建表文件。
#!/bin/bash
set -e

cd /docker-entrypoint-initdb.d

LOCKFILE=inited.lock
DB=github_log

if test -f "$LOCKFILE"; then
    echo "$LOCKFILE exists."
else
    echo "Start to init database."
    echo "Start to extract data from tar file."
    tar -xzf data.tar.gz #extract data files
    echo "Extract data done."
    clickhouse client -q "CREATE DATABASE $DB;" # create database
    clickhouse client -m < table # create table
    echo "Init database done."
    clickhouse client -q "INSERT INTO $DB.events FORMAT Native" < data # insert data
    echo "Insert data done."

    touch $LOCKFILE # create lock file
fi

关于如何使用初始化脚本,参考官方镜像的文档说明。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants