大数据Clickhouse(CK)

本文介绍如何在Ubuntu环境下安装ClickHouse,并提供了通过Python连接ClickHouse的方法。此外,还介绍了使用DataGrip和DBeaver这两种数据库管理工具连接ClickHouse的过程。最后,通过具体实例比较了ClickHouse与MySQL在大数据量下的性能差异。
该文章已生成可运行项目,

大数据Clickhouse(CK)

Clickhouse本为俄罗斯yandex搜索引擎服务。近几年大火,各大大厂大都在用。Clickhouse在国外简称CH,在国内简称CK,因叫起来有AK的感觉。

1. Ubuntu下安装

环境:Ubuntu16.04,其他版本应该也可以(未测)

1)下载

官方下载地址:
https://repo.clickhouse.tech/deb/stable/main/。或 https://repo.yandex.ru/clickhouse/deb/stable/main/。因为clickhouse本属于俄罗斯yandex搜索引擎。
下载如下三个文件

clickhouse-common-static_20.9.2.20_amd64.deb
clickhouse-server_20.9.2.20_all.deb
clickhouse-client_20.9.2.20_all.deb
2)安装

执行

sudo dpkg -i clickhouse-common-static_20.9.2.20_amd64.deb
sudo dpkg -i clickhouse-server_20.9.2.20_all.deb
sudo dpkg -i clickhouse-client_20.9.2.20_all.deb

安装过程中会提示输入密码。假设密码设置为root

3)启动
sudo service clickhouse-server start 

systemctl restart clickhouse-server
4)登录
clickhouse-client --password

输入安装时设置的密码root即可登录

5)测试

输入 show databases;

2. python连接clickhouse (CK)

需要下载clickhouse-driver驱动。
(1)在线安装
pip install clickhouse-driver即可。
(2)离线安装
先到
https://pypi.org/project/tzlocal/#files 下载 tzlocal-2.1-py2.py3-none-any.whl (16.2 kB)
https://pypi.org/project/clickhouse-driver/#files 下载 clickhouse_driver-0.2.1-cp37-cp37m-manylinux1_x86_64.whl
先安装插件
pip install tzlocal-2.1-py2.py3-none-any.whl
再安装clickhouse_driver:
pip install clickhouse_driver-0.2.1-cp37-cp37m-manylinux1_x86_64.whl

实例:

# 注意代码中是clickhouse_driver,而pip安装包是clickhouse-driver。因为python代码习惯用下划线
from clickhouse_driver import Client

client = Client(
    host = '127.0.0.1',
    port = '9000', # 或 9000
    user = 'default',
    password = 'root',
    database = 'test_db'
)

def test():
    global client
    sql = 'show tables' # show databases;
    res = client.execute(sql)
    print(res)


if __name__ == '__main__':
    test()

注:ClickHouse提供两个网络端口: TCP 默认9000,HTTP 默认8123, 这里clickhouse_driver.Client连接法,我们要用TCP端口9000

python 驱动:clickhouse-driver 使用的是 tcp 端口: 9000
java 驱动:clickhouse-jdbc 使用的是http 端口: 8123

附:除了clickhouse-driver驱动,还有asynch 等驱动也可实现python连接clickhouse,参考https://github.com/long2ice/asynch,
来自官方文档https://clickhouse.tech/docs/zh/interfaces/third-party/client-libraries/#sidebar-sidebar-10

3. 数据库管理工具连接clickhouse

navicat等不支持连接clickhouse,如下两个软件支持

1)DataGrip连接clickhouse

DataGrip为大名鼎鼎地Jetbrains公司,用过pycharm、idea的对他不陌生,
官方下载链接:https://www.jetbrains.com/zh-cn/datagrip/promo/

安装启动,如下图,点击左上角“+”,再点“Data Source”,再点“ClickHouse”,
在这里插入图片描述
弹出框如下图,输入如下信息:
输入IP:如果是本地,则127.0.0.1
端口:默认HTTP端口 8123。注意不再是TCP端口9000
Clickhouse数据库用户:默认default
Clickhouse数据库密码:默认空,这里我设置了密码,如root
然后点击“编辑驱动设置”
点击Apply,会提示下载驱动,下载后点击“Test Connection”。成功后点OK。
在这里插入图片描述
点如下两个红圈的地方,选中All schemas可以显示所有的库,这里test_db为我新建的库,其他为系统自带。
在这里插入图片描述在这里插入图片描述
输入sql 语句:
点击如下,选中一个库,如test_db库,右键 -> new -> Query Console,即可在console框中输入sql语句。
在这里插入图片描述

2)DBeaver连接clickhouse

DataGrip试用期30天,如果没破解,也可以替换为DBeaver,留作备用,也不错,但体验感没有DataGrip好。
如下:
启动软件,点击左上角加号图标,依次如下图点击操作
在这里插入图片描述
在这里插入图片描述
输入IP:如果是本地,则127.0.0.1
端口:默认HTTP端口 8123。注意不再是TCP端口9000
Clickhouse数据库用户:默认default
Clickhouse数据库密码:默认空,这里我设置了密码,如root
然后点击“编辑驱动设置”
在这里插入图片描述
点击库,点击下载/更新

请添加图片描述
下载驱动,这里一定注意要下载0.2.4版本的驱动,因为这个驱动稳定。双击图中红线位置。
请添加图片描述
如下,选择0.2.4版本进行下载。
请添加图片描述
注:其他版本0.2.6试过,不能用,连接失败。

4. 实例

用实例(1000w条数据)对比一下CK和mysql的性能
1)创建表
(1)CK
先建立一个MergeTree()引擎的表test_y

CREATE TABLE test_y
(
  id UInt64,
  a String,
  b String,
  c String
)ENGINE = MergeTree() 
ORDER BY id

(2)MySQL
先创建一个空表test_y,

create table `test_y` (
	`id` int(11) unsigned NOT NULL auto_increment,
	`a` varchar(255) collate utf8_bin NOT NULL default '',
	`b` varchar(255) collate utf8_bin NOT NULL default '',
	`c` varchar(255) collate utf8_bin NOT NULL default '',
) ENGINE = InnoDB auto_increment = 1 default charset = utf8 ROW_FORMAT=COMPACT;

2)插入insert
(1)CK
(i)插入1000w 条数据, ------ 执行时间:10s

INSERT INTO TABLE test_y SELECT number,concat('A',toString(number)),concat('B',toString(number)),concat('C',toString(number)) FROM numbers(1, 10000000) -- numbers(10000000)表从0开始的1000w条,即0~9999999,numbers(1, 10000000) 表从1开始的1000w条,即1~10000000

(ii)插入10亿 条数据, ------ 执行时间:0.5h

INSERT INTO TABLE test_y SELECT number,concat('A',toString(number)),concat('B',toString(number)),concat('C',toString(number)) FROM numbers(1, 1000000000)

(2)MySQL
(i)插入1000w条数据, ------ 执行时间:2.5h
写入1000w条数据数据,思路是创建存储过程:如proc3(),可将存储过程看成函数proc3(),设置变量 i 自增,最后调用call proc3;

mysql> delimiter $$ -- 将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql> create procedure proc3() -- 存储过程名,类似函数, proc = procedure
    -> begin
    -> declare i int; -- 声明变量 i
    -> set i = 1;
    -> while i < 10000001 do
    -> insert into test_y (id, a, b, c) values(i, concat('A', i), concat('B', i), concat('C', i));
    -> set i = i + 1;
    -> end while;
    -> end;
    -> $$
mysql> delimiter ; -- 将语句的结束符号恢复为分号
Query OK, 0 rows affected (0.12 sec)

mysql> call proc3; -- 调用存储过程

解析:

默认情况下,存储过程和默认数据库相关联,如果想指定存储过程创建在某个特定的数据库下,那么在过程名前面加数据库名做前缀。 在定义过程时,使用DELIMITER $$ 命令将语句的结束符号从分号 ; 临时改为两个 $$,使得过程体中使用的分号被直接传递到服务器,而不会被客户端(如mysql)解释。

(ii)插入10亿条数据, ------ 执行时间:未测试

3) 查询SELECT
(1)CK
(i)查询1000w 条数据, ------ 执行时间:1s

SELECT * FROM test_y WHERE b = 'B555555'

(i)查询10亿 条数据, ------ 执行时间:2.5min

SELECT * FROM test_billion WHERE b = 'B555555'

(2)MySQL
(i)查询1000w 条数据, ------ 执行时间:44s

SELECT * FROM test_y WHERE b = 'B555555'

(i)查询10亿 条数据, ------ 执行时间:未测试
注:mysql把要查询的那字段,加上索引也会飞快!

本文章已经生成可运行项目
<think>我们正在华为大数据平台环境中操作,用户的问题是如何使用ClickHouse客户端将Parquet文件加载到ClickHouse数据库中。根据之前的错误信息,用户遇到了文件访问权限问题,因为ClickHouse服务无法访问HDFS路径。因此,我们需要提供一种安全且高效的方法来实现这一目标。 解决方案的核心思路: 1. 避免使用本地文件系统(因为权限问题),转而使用HDFS作为数据源。 2. 利用ClickHouse的HDFS集成功能直接读取HDFS上的Parquet文件并写入目标表。 具体步骤: 步骤1:配置ClickHouse以支持HDFS(如果尚未配置) 在华为大数据平台中,ClickHouse可能已经集成了HDFS支持(通过libhdfs3)。若未配置,则需要修改ClickHouse配置文件(config.xml)并添加HDFS配置(参考之前的回答)。 步骤2:在ClickHouse中创建一个目标表 该表结构需要与Parquet文件的结构匹配。 步骤3:使用`hdfs`表函数读取Parquet文件并插入到目标表 具体SQL示例: ```sql -- 假设目标表名为target_table,且已经创建,且结构匹配 INSERT INTO target_table SELECT * FROM hdfs('hdfs://<namenode>:<port>/path/to/your/file.parquet', 'Parquet') ``` 注意事项: - 替换`<namenode>`和`<port>`为实际的HDFS NameNode地址和端口(例如:hdfs://hacluster:8020)。 - 路径必须是完整的HDFS路径。 - 如果文件有多个,可以使用通配符(例如:`hdfs://namenode:port/path/*.parquet`)。 步骤4:权限配置 确保ClickHouse服务账号有权限访问HDFS上的该路径。在华为平台中,可能需要配置Kerberos认证或访问控制列表(ACL)。 如果华为平台启用了Kerberos,则需要在ClickHouse配置中指定Kerberos凭证。具体可参考之前的Kerberos配置部分。 步骤5:执行优化 对于大文件或大量文件,可以考虑并行处理。ClickHouse的`hdfs`表函数支持并行读取,可以通过设置`max_threads`参数调整。 示例(并行读取): ```sql SET max_threads=16; INSERT INTO target_table SELECT * FROM hdfs('hdfs://...', 'Parquet') ``` 替代方案:使用外部表(不推荐,因为需要移动数据) 另一种方法是将文件先下载到ClickHouse服务器本地,然后使用`file`表函数读取。但这种方法需要解决两个问题: 1. 文件下载:需要从HDFS下载到ClickHouse的`user_files`目录(或允许的目录)。 2. 权限:需要确保ClickHouse服务有权限读取该本地文件。 由于华为大数据平台通常部署在分布式环境中,直接使用HDFS路径更为高效和便捷。 验证: 执行插入操作后,可以在ClickHouse中查询目标表,检查数据是否成功导入。 相关问题: 1. 如何解决ClickHouse读取HDFS时的Kerberos认证问题? 2. 在华为大数据平台中,如何优化ClickHouse读取Parquet文件的性能? 3. 如何将Hive表中的数据导出为Parquet并加载到ClickHouse? 注意:在华为平台中,可能还提供了其他工具(如Loader)来实现数据导入,但使用ClickHouse客户端直接操作是最直接的方式。 下面给出一个完整的示例: 假设我们有一个Parquet文件在HDFS上的路径为:`hdfs://hacluster/clickhouse_data/parquet_files/sample.parquet` 1. 创建目标表(假设Parquet文件包含id(Int32)、name(String)、timestamp(DateTime)字段): ```sql CREATE TABLE target_table ( id Int32, name String, timestamp DateTime ) ENGINE = MergeTree() ORDER BY id; ``` 2. 插入数据: ```sql INSERT INTO target_table SELECT * FROM hdfs('hdfs://hacluster/clickhouse_data/parquet_files/sample.parquet', 'Parquet') ``` 如果文件有多个,可以使用通配符: ```sql INSERT INTO target_table SELECT * FROM hdfs('hdfs://hacluster/clickhouse_data/parquet_files/*.parquet', 'Parquet') ``` 3. 查询验证: ```sql SELECT count() FROM target_table; ``` 这样就完成了将HDFS上的Parquet文件导入ClickHouse的过程。 </think>### 华为大数据平台ClickHouse加载Parquet文件方法 在华为大数据平台中,推荐使用 **HDFS直读方案** 将Parquet文件加载到ClickHouse数据库,避免本地文件权限问题。以下是具体操作流程: --- ### ✅ 最佳方案:HDFS表函数直接加载 ```sql -- 1. 创建目标表(结构需匹配Parquet文件) CREATE TABLE ck_target_table ( id UInt32, theme String, value Float64, dt Date ) ENGINE = MergeTree() PARTITION BY dt ORDER BY id; -- 2. 从HDFS加载Parquet数据 INSERT INTO ck_target_table SELECT * FROM hdfs( 'hdfs://namenode:8020/hadoop/loader/tmp/*.parquet', -- HDFS路径 'Parquet' -- 文件格式 ) ``` > **关键说明**: > - 路径需使用完整HDFS地址(`hdfs://namenode:8020/...`) > - 通配符`*`可批量加载多个文件 > - 表结构必须与Parquet文件schema完全匹配[^3][^4] --- ### 🔧 前置配置(若未完成) #### 1. 启用HDFS支持 在`/etc/clickhouse-server/config.xml`添加: ```xml <yandex> <hdfs> <libhdfs3_conf>/etc/clickhouse-server/hdfs-client.xml</libhdfs3_conf> </hdfs> </yandex> ``` #### 2. 配置华为HDFS连接 创建`hdfs-client.xml`(适配华为FI): ```xml <configuration> <property> <name>dfs.nameservices</name> <value>hacluster</value> <!-- 华为集群默认名称 --> </property> <property> <name>dfs.ha.namenodes.hacluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.hacluster.nn1</name> <value>192.168.100.101:8020</value> </property> <!-- 若启用Kerberos --> <property> <name>hadoop.security.authentication</name> <value>kerberos</value> </property> </configuration> ``` #### 3. 权限配置 ```bash # 授予ClickHouse服务账号HDFS访问权限 hdfs dfs -chown -R clickhouse /hadoop/loader/tmp hdfs dfs -chmod -R 750 /hadoop/loader/tmp ``` --- ### 💡 高级场景解决方案 #### 场景1:动态分区加载(Hudi MOR表同步[^3][^4]) ```sql INSERT INTO ck_partitioned_table SELECT *, toDate(dt_str) AS partition_date -- 转换日期字段为分区键 FROM hdfs( 'hdfs://namenode/hadoop/hudi_tables/*_ro/*.parquet', -- Hudi RO表路径 'Parquet' ) ``` #### 场景2:流式加载(Kafka管道[^5]) ```sql -- 创建Kafka引擎表 CREATE TABLE kafka_stream ( id Int32, json_data String ) ENGINE = Kafka() SETTINGS kafka_broker_list = 'kafka1:9092', kafka_topic_list = 'parquet_topic', kafka_format = 'Parquet'; -- 创建物化视图转移数据 CREATE MATERIALIZED VIEW mv_parquet TO ck_target_table AS SELECT id, JSONExtractString(json_data, 'theme') AS theme FROM kafka_stream; ``` --- ### ️ 常见问题处理 | 问题现象 | 解决方案 | |---------|----------| | `DB::Exception: File not found` | 检查HDFS路径是否存在,使用`hdfs dfs -ls`验证 | | `Authentication failed` | 配置Kerberos认证:<br>`kinit -kt /etc/security/keytabs/clickhouse.keytab clickhouse@HADOOP.COM` | | 字段类型不匹配 | 用`DESCRIBE hdfs('hdfs://path/file.parquet', 'Parquet')`获取Parquet结构 | | 性能瓶颈 | 增大并行度:<br>`SET max_threads=16;` | --- ### 📊 性能优化建议 1. **批量加载** ```sql SET max_insert_block_size=104857600; -- 增大插入块大小至100MB ``` 2. **使用分布式表**(华为MRS集群) ```sql INSERT INTO distributed_ck_table SELECT * FROM hdfs(...) ``` 3. **压缩传输** ```sql SET network_compression_method='lz4'; -- 减少网络传输量 ``` --- ### 验证步骤 ```sql -- 1. 测试读取Parquet文件 SELECT count() FROM hdfs('hdfs://namenode/hadoop/loader/tmp/sample.parquet', 'Parquet') -- 2. 检查数据分布 SELECT partition, count() FROM system.parts WHERE table = 'ck_target_table' GROUP BY partition ``` > 📌 **华为平台特性**:在FI 6.5+版本中,HDFS直读速度可达 **800MB/s**(单节点),建议优先使用HDFS方案而非本地文件[^1] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值