本文汇总了ClickHouse使用时的常见问题。
如何创建ClickHouse用户?
您可以通过以下两种方法创建ClickHouse用户:
通过在EMR控制台新增配置项创建ClickHouse用户
在EMR控制台ClickHouse服务的配置页面,单击server-users页签,新增配置项,参数为users.<YourUserName>.password或users.<YourUserName>.password_sha256_hex或users.<YourUserName>.password_double_sha1_hex,参数值您可以自定义,保存该配置项并重启服务,即可创建用户。
通过ClickHouse客户端创建ClickHouse用户
在EMR控制台ClickHouse服务的配置页面,单击server-users页签,新增参数为users.default.access_management,参数值为1的配置项,保存该配置并重启服务。使用默认用户连接ClickHouse集群。
使用SSH方式登录ClickHouse集群,详情请参见登录集群。
执行如下命令,启动ClickHouse客户端。
clickhouse-client -h core-1-1 -m
说明本示例登录core-1-1节点,如果您有多个Core节点,可以登录任意一个节点。
执行以下命令,创建用户。
CREATE USER IF NOT EXISTS user_test ON CLUSTER new_cluster_emr IDENTIFIED WITH plaintext_password BY '123456';
说明本示例创建的用户为user_test,密码为123456,您可以根据实际情况修改。
创建用户命令格式如下。
CREATE USER [IF NOT EXISTS | OR REPLACE] name1 [ON CLUSTER cluster_name1] [, name2 [ON CLUSTER cluster_name2] ...] [NOT IDENTIFIED | IDENTIFIED {[WITH {no_password | plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']}] [HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE] [DEFAULT ROLE role [,...]] [GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]] [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY | WRITABLE] | PROFILE 'profile_name'] [,...];
执行以下命令,查看已有的用户。
SHOW USERS;
返回已有的用户。
┌─name──────┐ │ default │ │ user_test │ │ user_test2 │ └─────────┘
数据丢失,如何处理?
问题现象:向ClickHouse写入A条数据,但实际读出来只有B条,且B小于A。
问题原因:通常情况下,ClickHouse中的数据不会丢失。但是在一个shard存在至少两个副本,本地表的表引擎为*MergeTree,同时使用分布式表进行读数的场景下,可能会出现读出来的数据少于写入数据的情况。
无论是通过分布式表写数据,还是直接写入本地表,每个机器上都会存在数据;而通过分布式表读数据时,默认每个shard仅会使用一个连接,此时的连接数是会少于机器数的,所以存在一些机器上的数据无法被读取的情况。代码示例如下。
CREATE TABLE db.table_local ( ... ) Engine = MergeTree() CREATE TABLE db.table_distributed ( ... ) Engine = Distributed(cluster_emr, db, table_local, rand());
处理方法:
方式
操作
方式一(推荐)
删除db.table_local并后重新创建表,使用复制表作为本地表。
方式二(不推荐)
您可以在EMR控制台ClickHouse服务的配置页面,单击server-users页签,单击新增配置项,新增参数profiles.<your_profile_name>.max_parallel_replicas,参数值至少为每个shard下replica的数量,并确保users.<your_clickhouse-client_name>.profile值为<your_profile_name>。
说明<your_profile_name>和<your_clickhouse-client_name>均需要替换为您实际的名称。各参数详细信息,请参见访问权限控制。
报错提示Memory limit (for total) exceeded时,该如何处理?
问题原因:内存超过了server可使用的总内存。
处理方法:在EMR控制台ClickHouse服务的配置页面,单击server-config页签,单击新增配置项,新增参数max_server_memory_usage,该参数可以配置的最大值为
机器物理内存大小 * max_server_memory_usage_to_ram_ratio
。说明ClickHouse中max_server_memory_usage_to_ram_ratio参数的默认值为0.9,如果您需要调整该参数值,可以新增max_server_memory_usage_to_ram_ratio参数,参数值您可以根据实际情况调整。
报错提示Memory limit (for query) exceeded时,该如何处理?
问题原因:内存超过了单次Query可使用的最大内存。
处理方法:
场景
操作
全局方式
在EMR控制台ClickHouse服务的配置页面,单击server-config页签,单击新增配置项,新增参数profiles.<your_profile_name>.max_memory_usage,并确保users.<your_clickhouse-client_name>.profile值为<your_profile_name>。
说明<your_profile_name>和<your_clickhouse-client_name>均需要替换为您实际的名称。各参数详细信息,请参见访问权限控制。
针对使用clickhouse-client
在EMR控制台ClickHouse服务的配置页面,单击client-config页签,单击新增配置项,新增参数max_memory_usage。
针对某一次会话Session
可以直接
SET max_memory_usage=xxxx
,该配置在Session生命周期内均会生效。针对某一次Query
可以在SQL中添加配置,该配置仅对当前Query生效。
例如,
SELECT column FROM table SETTINGS max_memory_usage=xxxx
。
报错提示Memory limit (for user) exceeded时,该如何处理?
问题原因:内存超过了单个用户可使用的最大内存。
处理方法:
场景
操作
全局方式
在EMR控制台ClickHouse服务的配置页面,单击server-users页签,单击新增配置项,新增参数profiles.<your_profile_name>.max_memory_usage_for_user,并确保users.<your_clickhouse-client_name>.profile值为<your_profile_name>。
说明<your_profile_name>和<your_clickhouse-client_name>均需要替换为您实际的名称。各参数详细信息,请参见访问权限控制。
针对使用clickhouse-client
在EMR控制台ClickHouse服务的配置页面,单击client-config页签,单击新增配置项,新增参数max_memory_usage_for_user。
针对某一次会话Session
可以直接使用命令
SET max_memory_usage_for_user=xxxx
,该配置在Session生命周期内均会生效。针对某一次Query
可以在SQL中添加配置,该配置仅对当前Query生效。
例如,
SELECT column FROM table SETTINGS max_memory_usage_for_user=xxxx
。
OLAP集群中ClickHouse服务是如何分布的?
ClickHouse服务包含ClickHouse Runtime,ClickHouse Server和ClickHouse Keeper。
在EMR-3.x系列版本中,ClickHouse不包含ClickHouse Keeper,ClickHouse Runtime会在所有类型的机器上安装,ClickHouse Server仅在Core节点中安装。
在EMR-5.x系列版本中,ClickHouse Runtime会在所有类型的机器上安装,ClickHouse Server仅在Core节点安装,ClickHouse Keeper 的个数为1个或3个,仅在Core节点的前3个节点中安装,不支持扩容。创建集群的时候如果Core节点是2个节点,则安装一个ClickHouse Keeper,之后即使扩容Core节点至4个,ClickHouse Keeper节点也不会增加至3个。
为什么导入数据的速率逐渐下降?
ClickHouse表大多数使用的是MergeTree相关的表(例如ReplicatedMergeTree和ReplacingMergeTree等)。
MergeTree表本身在收到数据的时候通过在内存中排序等操作会直接刷写磁盘形成一个存储在磁盘上的Data Part。磁盘上的Data Part会不断的通过后台线程进行Merge操作,以使众多小的Data Part合并成一个大的Data Part。在将数据导入至MergeTree表的时候,初始时后台线程可能找不到任何可以进行Merge的Data Part,此时所有的资源都在处理导入的数据从接收到刷写到磁盘这一步骤,所以导入数据的速率相对来说比较高。导入数据一段时间后,由于越来越多Data Part可以被后台线程合并,会有一部分的资源用于处理合并的操作。随着磁盘上的数据越来越多,合并所需要的计算资源也会越来越多,直到达到导入数据与合并数据的平衡,所以导入数据的速率会不断下降。
如何升级ClickHouse版本?
EMR ClickHouse版本因为与EMR版本绑定,所以如果需要升级ClickHouse版本,必须升级EMR版本。
ClickHouse中为什么要定义集群?
ClickHouse中的集群是通过配置定义的逻辑集群,可以在ClickHouse中通过执行SQL select * from system.clusters
命令来查看ClickHouse当前的逻辑集群有哪些,分别是什么。
允许用户通过配置定义的逻辑集群是为了将多台机器形成一个ClickHouse集群,并且通过逻辑集群的配置,划分机器与机器之间的关系(shard、replica),同时也方便用户为不同的业务划分不同的逻辑集群。
EMR ClickHouse默认配置了一个包含集群中所有节点的逻辑集群。
ClickHouse中Shard和Replica是什么意思?
在ClickHouse中,一个节点可以与另外的一个或多个节点互为副本(Replica),在这些节点上以Replicated*MergeTree为存储引擎的表的数据会保持一致。
在ClickHouse中,一个节点或多个节点可以组成一个Shard,这个Shard内的节点互为副本。
如何进行性能测试?
通常使用SSB进行测试,详情请参见社区文档Star Schema Benchmark。其它测试用例请参见Tutorials and Example Datasets和clickhouse-benchmark。
集群创建后,是否还能修改Shard和Replica?
例如,创建集群时使用的是A shard B replica,创建好集群后想修改为C shard D replica。ClickHouse支持从A shard B replica修改为 C shard D replica,您可以在EMR ClickHouse控制台中,修改server-metrika项的clickhouse_remote_servers的值即可实现。
但是,不建议直接将A shard B replica修改为C shard D replica,这样可能出现一些问题,尤其是集群中已经有数据存在的情况下,可能会导致集群的数据错误。建议新增一个逻辑集群配置支持C shard D replica,同时保留A shard B replica的配置。
EMR ClickHouse中使用HDFS时的配置有哪些?
您可以参见社区文档HDFS。
EMR ClickHouse与云数据库ClickHouse产品有哪些区别?
EMR ClickHouse集群的产品ID以
c-
开头的,例如c-3c8697f91408****;而云数据库ClickHouse集群的产品ID以cc-
开头的,例如cc-bp16qwvp7hy8i****。EMR ClickHouse为半托管产品,您可以直接登录机器进行运维操作;云数据库ClickHouse为全托管产品,不可以直接登录机器进行运维操作。
ClickHouse是否支持查询使用DLF元数据的Hive表?
目前,ClickHouse不支持查询使用DLF元数据的Hive表,只支持使用MySQL或RDS作为元数据的Hive表。因此,不建议直接使用ClickHouse查询Hive表。
根据具体需求,建议如下:
如果需要将Hive数据导入到ClickHouse,建议使用Apache Spark或Apache Seatunnel进行数据导入。
如果需要对Hive数据进行分析,建议使用StarRocks、Trino、Impala等引擎。