本文汇总了ClickHouse使用时的常见问题。

如何创建ClickHouse用户?

您可以通过以下两种方法创建ClickHouse用户:
  • 通过在EMR控制台新增自定义配置项创建ClickHouse用户

    在EMR控制台ClickHouse服务的配置页面,单击server-users页签,新增参数为users.<YourUserName>.passwordusers.<YourUserName>.password_sha256_hexusers.<YourUserName>.password_double_sha1_hex,参数值您可以自定义的配置项,保存该配置项并重启服务,即可创建用户。

    参数中的<YourUserName>需要替换为您待创建用户的名称。
    说明 添加组件参数详情,请参见管理组件参数。重启服务详情,请参见重启服务
  • 通过ClickHouse客户端创建ClickHouse用户
    1. 在EMR控制台ClickHouse服务的配置页面,单击server-users页签,新增参数为users.default.access_management,参数值为1的配置项,保存该配置并重启服务。使用默认用户连接ClickHouse集群。
    2. 使用SSH方式登录ClickHouse集群,详情请参见登录集群
    3. 执行以下命令,进入ClickHouse客户端。
      clickhouse-client -m
    4. 执行以下命令,创建用户。
      CREATE USER IF NOT EXISTS user_test ON CLUSTER new_cluster_emr IDENTIFIED WITH plaintext_password BY '123456';
      返回信息如下图所示。Create User
      创建用户命令格式如下。
      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'] [,...];
    5. 执行以下命令,查看已有的用户。
      SHOW USERS;
      返回已有的用户。
      ┌─name──────┐
      │ default          │
      │ user_test        │
      │ user_test2       │
      └─────────┘

如何修改default用户的密码?

注意 暂不支持将default密码修改为sha256_hex等加密类型的文本。
您可以在EMR控制台ClickHouse服务的配置页面,修改以下配置项以修改default用户的密码。
  1. 单击server-users页签,修改参数users.default.password,参数值您可以自定义。
  2. 单击client-config页签,修改参数password,参数值为您自定义的密码,即users.default.password的参数值。
  3. 单击server-metrika页签,修改参数clickhouse_remote_servers,参数值格式如下。
    <cluster_emr>
      <shard>
        <replica>
          <host>host1</host>
          <port>port1</port>
          <user>default</user>
          <password>${users.default.password}</password>
        </replica>
        ...
      </shard>
      ...
    </cluster_emr>
    说明 代码示例中的${users.default.password}users.default.password的参数值,即default用户的密码。

如何修改ClickHouse集群标识?

您可以在EMR控制台ClickHouse服务的配置页面,在搜索区域搜索clickhouse_remote_servers参数,将默认配置中的cluster_emr修改为需要的名称。例如,修改cluster_emrnew_cluster_name,修改信息如下:
  • 修改前
    <cluster_emr>
      <shard>
        ...
      </shard>
      ...
    </cluster_emr>
  • 修改后
    <new_cluster_emr>
      <shard>
        ...
      </shard>
      ...
    </new_cluster_emr>

如何设置ClickHouse多盘存储?

注意 EMR-3.39.x之前版本和EMR-5.5.x之前版本,请按照以下操作设置ClickHouse多盘存储。EMR-3.39.x及之后版本,EMR-5.5.x及之后版本无需手动设置,默认多盘存储。
ClickHouse默认数据存储策略是存储在一块磁盘上,如果您希望将数据存储到所有机器的磁盘上,请按照以下方法操作:
  • 方式一:在建表语句中指定storage_policy参数。
    创建表时需要配置存储策略,代码示例如下。
    CREATE TABLE db (
    )ENGINE = <your_MergeTree>
    SETTINGS storage_policy = '<your_storage_policy>';
    • <your_storage_policy>:您可以在EMR控制台ClickHouse服务的配置页面,在搜索区域搜索storage_configuration参数,本文示例中policies层级下的hdd_in_order即为参数值。
      注意 参数值请填写为您实际查询到的。
      storage_configuration
    • <your_MergeTree>:引擎名和参数。根据您实际需求自定义,引擎(ENGINE)详细信息,请参见MergeTree
  • 方式二:在EMR控制台新增default策略。
    1. 在EMR控制台ClickHouse服务的配置页面,在配置搜索区域搜索storage_configuration参数,在storage_configuration中新增一个default策略,新增内容如下。
       <default>
          <volumes>
            <default>
              <disk>default</disk>
              <disk>disk2</disk>
              <disk>disk3</disk>
              <disk>disk4</disk>
            </default>
          </volumes>
        </default>
      修改后参数内容如下图所示。add_policies
    2. 完成上述配置后,重启服务,详情请参见重启服务

数据丢失,如何处理?

  • 问题现象:向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());
    代码示例中cluster_emr参数的配置形式如下。
    <clickhouse_remote_servers>
      <cluster_emr>
        <shard>
           <replica>
             <host>host1</host>
             </port>port2</port>
           </replica>
           <replica>
             <host>host2</host>
             </port>port2</port>
           </replica>
         </shard>
         <shard>
           <replica>
             <host>host3</host>
             </port>port3</port>
           </replica>
           <replica>
             <host>host4</host>
             </port>port4</port>
           </replica>
         </shard>
      </cluster_emr>
    </clickhouse_remote_servers>
  • 处理方法:
    方式 操作
    方式一(推荐) 删除db.table_local并后重新创建表,使用复制表作为本地表。
    方式二 您可以在EMR控制台ClickHouse服务的配置页面,单击server-metrika页签,修改clickhouse_remote_servers的参数值,修改为每个shard下一个replica。
    方式三(不推荐) 您可以在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

如何扩缩容磁盘?

报错提示Too many parts in all partitions in total,该如何处理?

在插入数据时,ClickHouse会对表中的data parts进行检查,如果data parts的数量超过了阈值,则会报错。ClickHouse中包含了多种对data parts进行检查的阈值。需要根据详细的提示信息判断并处理。

该问题是由于一个表的所有活跃的data parts数量超过了max_parts_in_total的参数值导致的,该参数的默认值为100000。该问题的解决方法如下:
  • 一个表下可能存在着若干个partition,每个partition下的活跃data parts受限于参数parts_to_throw_insert,请确保一个表下的partition数量乘以parts_to_throw_insert的值小于max_parts_in_total。您可以根据业务需求,对没有设置TTL(Time To Live)的partition设置TTL,或调小TTL。
  • 对于整个表执行optimize table $<db>.$<table> final命令,以减少未合并的data parts数量。
  • 调整写入的客户端。例如,利用JDBC写入数据的时候,降低写入数据的频次,提高每一批次写入数据的大小。在客户端和业务允许的范围内,每一批次的数据量越大,越能够降低出现这一问题的几率,直到达到硬件瓶颈。
  • 如果已经是低频大批次的写入但仍然超过了这一阈值max_parts_in_total,且机器的CPU、IOUtil等指标达到瓶颈,可以考虑升配或扩容操作。
  • 调整参数延缓插入的速度:
    • 进入EMR控制台ClickHouse服务的配置页面,在server-config页签中,添加自定义参数merge_tree.parts_to_delay_insert,该参数默认值为150,您可以调小该参数值为100或50。
    • 进入EMR控制台ClickHouse服务的配置页面,在server-config页签中,添加自定义参数merge_tree.max_delay_to_insert ,该参数的默认值为1,表示1秒,您可以调大该参数值为2或5。
  • 进入EMR控制台ClickHouse服务的配置页面,在server-config页签中,添加自定义参数merge_tree.max_parts_in_total,该参数的默认值为100000,您可以根据实际情况调大该参数值。
    警告 使用此方法可能会导致集群的性能和稳定性下降,请谨慎操作。

报错提示Too many parts,该如何处理?

在插入数据时,ClickHouse会对表中的data parts进行检查,如果data parts的数量超过了阈值,则会报错。ClickHouse中包含了多种对data parts进行检查的阈值。需要根据详细的提示信息判断并处理。

如果too many parts信息中没有详情的错误信息,则通常是超过了partition的活跃data parts数量的阈值parts_to_throw_insert,默认值为300。解决方法如下:
  • 调整写入的客户端。例如,利用JDBC写入数据的时候,降低写入数据的频次,提高每一批次写入数据的大小。在客户端和业务允许的范围内,每一批次的数据量越大,越能够降低出现这一问题的几率,直到达到硬件瓶颈。
  • 如果已经是低频大批次的写入但仍然超过了这一阈值parts_to_throw_insert,且机器的CPU、IOUtil等指标达到瓶颈,可以考虑升配或扩容操作。
  • 调整参数延缓插入的速度:
    • 进入EMR控制台ClickHouse服务的配置页面,在server-config页签中,添加自定义参数merge_tree.parts_to_delay_insert,该参数的默认值为150,您可以调小该参数值为100或50。
    • 进入EMR控制台ClickHouse服务的配置页面,在server-config页签中,添加自定义参数merge_tree.max_delay_to_insert ,该参数的默认值为1,表示1秒,您可以调大该参数值为2或5。
  • 进入EMR控制台ClickHouse服务的配置页面,在server-config页签中,添加自定义参数merge_tree.parts_to_throw_insert,该参数的默认值为300,您可以调大该参数值。
    警告 使用此方法可能会导致集群的性能和稳定性下降,请谨慎操作。