Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Actualización más reciente 2023-11-20 GMT+08:00

Desarrollo de aplicaciones de ClickHouse

ClickHouse es una base de datos orientada a columnas para el procesamiento analítico en línea. Soporta consultas SQL y proporciona un buen rendimiento de consultas. El análisis de agregación y el rendimiento de las consultas basadas en tablas grandes y amplias es excelente, que es un orden de magnitud más rápido que otras bases de datos analíticas.

Características de ClickHouse:

  • Alta relación de compresión de datos
  • Computación paralela multinúcleo
  • Motor de computación vectorizado
  • Soporte para estructura de datos anidados
  • Soporte para índices dispersos
  • Soporte para INSERT y UPDATE

Escenarios de aplicaciones de ClickHouse:

  • Almacenamiento de datos en tiempo real

    El motor de computación de streaming (como Flink) se usa para escribir datos en tiempo real en ClickHouse. Con el excelente rendimiento de la consulta de ClickHouse, las consultas y las solicitudes de análisis en tiempo real multidimensionales y multimodo pueden responderse en subsegundos.

  • Consulta sin conexión

    Los datos de servicio a gran escala se importan a ClickHouse para construir una gran tabla amplia con cientos de millones a decenas de miles de millones de registros y cientos de dimensiones. Es compatible con la recopilación de estadísticas personalizadas y consultas y análisis exploratorios continuos en cualquier momento para ayudar a la toma de decisiones de negocios y proporcionar una excelente experiencia de consulta.

MRS proporciona ejemplos de proyectos de desarrollo de aplicaciones basados en ClickHouse JDBC. Esta práctica proporciona orientación para que obtenga e importe un proyecto de muestra después de crear un clúster MRS y, a continuación, realice la construcción y puesta en marcha localmente. En este proyecto de ejemplo, puede crear y eliminar tablas ClickHouse e insertar y consultar datos en el clúster MRS.

Creación de un clúster de MRS ClickHouse

  1. Cree y compre un clúster MRS que contenga ClickHouse. Para obtener más información, consulte Compra de un clúster personalizado.

    En esta práctica, se utiliza como ejemplo un clúster MRS 3.2.0-LTS.1, con ClickHouse instalado y con autenticación Kerberos habilitada.

  2. Haga clic en Buy Now y espere hasta que se cree el clúster MRS.

Preparación de un usuario de autenticación de aplicación

Para un clúster MRS con autenticación Kerberos habilitada, prepare un usuario que tenga el permiso de operación en componentes relacionados para la autenticación de aplicaciones.

El siguiente ejemplo de configuración de permisos de ClickHouse es solo para referencia. Puede modificar la configuración según lo necesite.

  1. Una vez creado el clúster, inicie sesión en FusionInsight Manager.
  2. Elija System > Permission > Role y haga clic en Create Role en el panel derecho.

    1. Escriba un nombre de rol, por ejemplo, developrole y haga clic en OK.
    2. En el cuadro de diálogo Configure Resource Permission, seleccione el clúster deseado, elija ClickHouse y SUPER_USER_GROUP.

  3. Elija System > Permission > User, haga clic en Create en el panel derecho para crear un usuario humano-máquina, por ejemplo, developuser y agregue el rol developrole.

    Una vez creado el usuario, inicie sesión en FusionInsight Manager como developuser y cambie la contraseña inicial según se le solicite.

Obtención del proyecto de muestra

  1. Obtenga el proyecto de muestra de Huawei Mirrors.

    Descargue el código fuente del proyecto Maven y los archivos de configuración del proyecto de ejemplo, y configure las herramientas de desarrollo relacionadas en su PC local. Para obtener más información, consulte Obtención de proyectos de muestra desde Huawei Mirros.

    Seleccione una rama basada en la versión del clúster y descargue el proyecto de muestra de MRS requerido.

    Por ejemplo, el proyecto de muestra adecuado para esta práctica es clickhouse-examples, que se puede obtener en https://github.com/huaweicloud/huaweicloud-mrs-example/tree/mrs-3.2.0.1/src/clickhouse-examples.

  2. Utilice IDEA para importar el proyecto de ejemplo y espere a que el proyecto Maven descargue los paquetes de dependencias. Para obtener más información, consulte Configuración e importación de proyectos de muestra.

    Figura 1 Proyecto de muestra de ClickHouse

    Después de configurar los parámetros Maven y SDK en el PC local, el proyecto de ejemplo carga automáticamente paquetes de dependencias relacionados.

  3. En este proyecto de ejemplo, la aplicación se conecta al servidor ClickHouse a través de la dirección IP y la información del usuario en el archivo de configuración. Por lo tanto, después de importar el proyecto, debe modificar el archivo clickhouse-example.properties en el directorio conf del proyecto de ejemplo basado en la información real del entorno.

    loadBalancerIPList=192.168.64.10,192.168.64.122
    sslUsed=true
    loadBalancerHttpPort=21425
    loadBalancerHttpsPort=21426
    CLICKHOUSE_SECURITY_ENABLED=true
    user=developuser
    password=Bigdata_!@#
    isMachineUser=false
    isSupportMachineUser=false
    clusterName=default_cluster
    databaseName=testdb
    tableName=testtb
    batchRows=10000
    batchNum=10
    clickhouse_dataSource_ip_list=192.168.64.10:21426,192.168.64.122:21426
    native_dataSource_ip_list=192.168.64.10:21424,192.168.64.122:21424
    Tabla 1 Descripción de configuración

    Elemento de configuración

    Descripción

    loadBalancerIPList

    Direcciones de las instancias ClickHouseBalancer.

    Para ver las direcciones IP de instancia, inicie sesión en FusionInsight Manager, elija Cluster > Services > ClickHouse, y haga clic en Instance.

    En este ejemplo, establezca este parámetro en 192.168.64.10,192.168.64.122.

    sslUsed

    Si se debe habilitar la encriptación SSL. Establezca este parámetro en true para clústeres en modo de seguridad.

    loadBalancerHttpPort

    Números de puertos HTTP y HTTPS del balanceador de carga.

    Inicie sesión en FusionInsight Manager y elija Cluster > Services > ClickHouse. Haga clic en Logical Cluster, busque la fila que contiene el clúster lógico deseado y vea Port y Ssl Port en la columna HTTP Balancer Port.

    loadBalancerHttpsPort

    CLICKHOUSE_SECURITY_ENABLED

    Si se debe habilitar el modo de seguridad ClickHouse.

    En este ejemplo, establezca este parámetro en true.

    user

    Información de autenticación del usuario en desarrollo. Para un usuario de máquina-máquina, deje el password vacío.

    password

    isMachineUser

    Si el usuario de autenticación es un usuario máquina-máquina.

    isSupportMachineUser

    Si se admite la autenticación de un usuario máquina-máquina. En este ejemplo, establezca este parámetro en false.

    clusterName

    Nombre del clúster lógico ClickHouse conectado a la aplicación. En este ejemplo, conserve el valor predeterminado default_cluster.

    databaseName

    Nombres de la base de datos y de la tabla que se van a crear en el proyecto de ejemplo. Puede cambiar los nombres según los requisitos del sitio.

    tableName

    batchRows

    Número de registros de datos que se escribirán en un lote. En este ejemplo, establezca este parámetro en 10.

    batchNum

    Número total de lotes para escribir datos. Conservar el valor predeterminado en este ejemplo.

    clickhouse_dataSource_ip_list

    Direcciones y puertos HTTP de las instancias ClickHouseBalancer.

    Inicie sesión en FusionInsight Manager, seleccione Cluster > Services > ClickHouse, and click Logical Cluster. En este ejemplo se utiliza un clúster en modo de seguridad. Por lo tanto, localice la fila que contiene el clúster lógico deseado y vea Ssl Port en la columna HTTP Balancer Port.

    En este ejemplo, establezca este parámetro en 192.168.64.10:21426,192.168.64.122:21426.

    native_dataSource_ip_list

    Direcciones y puertos TCP de las instancias ClickHouseBalancer.

    Inicie sesión en FusionInsight Manager y elija Cluster > Services > ClickHouse. Haga clic en Logical Cluster, busque la fila que contiene el clúster lógico deseado y vea Port en la columna TCP Balancer Port.

    En este ejemplo, establezca este parámetro en 192.168.64.10:21424,192.168.64.122:21424.

  4. Desarrolle la aplicación en este proyecto de ejemplo a través de la clickhouse-jdbc API. Para obtener detalles sobre los fragmentos de código de cada función, consulte Código de muestra de ClickHouse.

    • Configuración de una conexión: Configure una conexión a la instancia de servicio ClickHouse.

      Durante la configuración de la conexión, la información de usuario configurada en Tabla 1 se pasa como la credencial de autenticación para la autenticación de seguridad en el servidor.

      clickHouseProperties.setPassword(userPass);
      clickHouseProperties.setUser(userName);
      BalancedClickhouseDataSource balancedClickhouseDataSource = new BalancedClickhouseDataSource(JDBC_PREFIX + UriList, clickHouseProperties);
    • Creación de una base de datos: Crear una base de datos ClickHouse.
      Ejecute la sentencia on cluster para crear una base de datos en el clúster.
      private void createDatabase(String databaseName, String clusterName) throws Exception  {    
           String createDbSql = "create database if not exists " + databaseName + " on cluster " + clusterName;    
           util.exeSql(createDbSql);
      }
    • Creación de una tabla: Crear una tabla en la base de datos ClickHouse.

      Ejecute la sentencia on cluster para crear una tabla ReplicatedMerge y una tabla Distributed en el clúster.

      private void createTable(String databaseName, String tableName, String clusterName) throws Exception { 
         String createSql = "create table " + databaseName + "." + tableName + " on cluster " + clusterName  + " (name String, age UInt8, date Date)engine=ReplicatedMergeTree('/clickhouse/tables/{shard}/" + databaseName + "." + tableName + "'," + "'{replica}') partition by toYYYYMM(date) order by age"; 
         String createDisSql = "create table " + databaseName + "." + tableName + "_all" + " on cluster " + clusterName + " as " + databaseName + "." + tableName + " ENGINE = Distributed(default_cluster," + databaseName + "," + tableName + ", rand());";    ArrayList<String> sqlList = new ArrayList<String>();   
         sqlList.add(createSql);   
         sqlList.add(createDisSql);  
         util.exeSql(sqlList);
      }
    • Inserción de datos: Inserte datos en la tabla ClickHouse.
      Insertar datos en la tabla creada. La tabla creada en este ejemplo tiene tres columnas: String, UInt8 y Date.
      String insertSql = "insert into " + databaseName + "." + tableName + " values (?,?,?)";
      PreparedStatement preparedStatement = connection.prepareStatement(insertSql);
      long allBatchBegin = System.currentTimeMillis();
      for (int j = 0; j < batchNum; j++) {
          for (int i = 0; i < batchRows; i++) { 
             preparedStatement.setString(1, "huawei_" + (i + j * 10));
             preparedStatement.setInt(2, ((int) (Math.random() * 100)));
             preparedStatement.setDate(3, generateRandomDate("2018-01-01", "2021-12-31")); 
             preparedStatement.addBatch();
          }
         long begin = System.currentTimeMillis();
         preparedStatement.executeBatch();    
         long end = System.currentTimeMillis();
         log.info("Inert batch time is {} ms", end - begin);
      }
      long allBatchEnd = System.currentTimeMillis();
      log.info("Inert all batch time is {} ms", allBatchEnd - allBatchBegin);

Creación y ejecución de la aplicación

Si puede acceder al clúster MRS desde su PC local, puede poner en marcha y ejecutar la aplicación localmente.

  1. En el proyecto clickhouse-examples de IntelliJ IDEA, haga clic en Run 'Demo' para ejecutar el proyecto de aplicación.

    Figura 2 Ejecución de la aplicación de ClickHouse Demo

  2. Vea la salida en la consola, como se muestra en la siguiente figura. Puede ver que la tabla ClickHouse se crea y que los datos se insertan correctamente.

    ...
    2023-06-03 11:30:27,127 | INFO  | main | Execute query:create table testdb.testtb on cluster default_cluster (name String, age UInt8, date Date)engine=ReplicatedMergeTree('/clickhouse/tables/{shard}/testdb.testtb','{replica}') partition by toYYYYMM(date) order by age | com.huawei.clickhouse.examples.Util.exeSql(Util.java:68)
    2023-06-03 11:30:27,412 | INFO  | main | Execute time is 284 ms | com.huawei.clickhouse.examples.Util.exeSql(Util.java:72)
    2023-06-03 11:30:27,412 | INFO  | main | Current load balancer is 192.168.64.10:21426 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:63)
    2023-06-03 11:30:28,426 | INFO  | main | Execute query:create table testdb.testtb_all on cluster default_cluster as testdb.testtb ENGINE = Distributed(default_cluster,testdb,testtb, rand()); | com.huawei.clickhouse.examples.Util.exeSql(Util.java:68)
    2023-06-03 11:30:28,686 | INFO  | main | Execute time is 259 ms | com.huawei.clickhouse.examples.Util.exeSql(Util.java:72)
    2023-06-03 11:30:28,686 | INFO  | main | Current load balancer is 192.168.64.10:21426 | com.huawei.clickhouse.examples.Util.insertData(Util.java:137)
    2023-06-03 11:30:29,784 | INFO  | main | Insert batch time is 227 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:154)
    2023-06-03 11:30:31,490 | INFO  | main | Insert batch time is 200 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:154)
    2023-06-03 11:30:33,337 | INFO  | main | Insert batch time is 335 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:154)
    2023-06-03 11:30:35,295 | INFO  | main | Insert batch time is 454 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:154)
    2023-06-03 11:30:37,077 | INFO  | main | Insert batch time is 275 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:154)
    2023-06-03 11:30:38,811 | INFO  | main | Insert batch time is 218 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:154)
    2023-06-03 11:30:40,468 | INFO  | main | Insert batch time is 144 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:154)
    2023-06-03 11:30:42,216 | INFO  | main | Insert batch time is 238 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:154)
    2023-06-03 11:30:43,977 | INFO  | main | Insert batch time is 257 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:154)
    2023-06-03 11:30:45,756 | INFO  | main | Insert batch time is 277 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:154)
    2023-06-03 11:30:47,270 | INFO  | main | Inert all batch time is 17720 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:158)
    2023-06-03 11:30:47,271 | INFO  | main | Current load balancer is 192.168.64.10:21426 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:63)
    2023-06-03 11:30:47,828 | INFO  | main | Execute query:select * from testdb.testtb_all order by age limit 10 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:68)
    2023-06-03 11:30:47,917 | INFO  | main | Execute time is 89 ms | com.huawei.clickhouse.examples.Util.exeSql(Util.java:72)
    2023-06-03 11:30:47,918 | INFO  | main | Current load balancer is 192.168.64.10:21426 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:63)
    2023-06-03 11:30:48,580 | INFO  | main | Execute query:select toYYYYMM(date),count(1) from testdb.testtb_all group by toYYYYMM(date) order by count(1) DESC limit 10 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:68)
    2023-06-03 11:30:48,680 | INFO  | main | Execute time is 99 ms | com.huawei.clickhouse.examples.Util.exeSql(Util.java:72)
    2023-06-03 11:30:48,682 | INFO  | main | name	age	date	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,682 | INFO  | main | huawei_89	3	2021-02-21	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,682 | INFO  | main | huawei_81	3	2020-05-27	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,682 | INFO  | main | huawei_70	4	2021-10-28	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,682 | INFO  | main | huawei_73	4	2020-03-23	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,683 | INFO  | main | huawei_44	5	2020-12-10	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,683 | INFO  | main | huawei_29	6	2021-10-12	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,683 | INFO  | main | huawei_74	6	2021-03-03	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,683 | INFO  | main | huawei_38	7	2020-05-30	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,683 | INFO  | main | huawei_57	8	2020-09-27	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,683 | INFO  | main | huawei_23	8	2020-08-08	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,683 | INFO  | main | toYYYYMM(date)	count()	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,684 | INFO  | main | 202005	8	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,684 | INFO  | main | 202007	7	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,684 | INFO  | main | 202004	6	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,684 | INFO  | main | 202009	6	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,684 | INFO  | main | 202103	6	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,685 | INFO  | main | 202012	6	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,685 | INFO  | main | 202010	5	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,685 | INFO  | main | 202112	5	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,685 | INFO  | main | 202003	5	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,685 | INFO  | main | 202104	4	 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:159)
    2023-06-03 11:30:48,689 | INFO  | main | Use HA module. | ru.yandex.clickhouse.BalancedClickhouseDataSource.<init>(BalancedClickhouseDataSource.java:122)
    2023-06-03 11:30:51,651 | INFO  | main | Name is: huawei_89, age is: 3 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:73)
    2023-06-03 11:30:51,651 | INFO  | main | Name is: huawei_81, age is: 3 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:73)
    2023-06-03 11:30:51,651 | INFO  | main | Name is: huawei_70, age is: 4 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:73)
    2023-06-03 11:30:51,651 | INFO  | main | Name is: huawei_73, age is: 4 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:73)
    2023-06-03 11:30:51,652 | INFO  | main | Name is: huawei_44, age is: 5 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:73)
    2023-06-03 11:30:51,652 | INFO  | main | Name is: huawei_29, age is: 6 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:73)
    2023-06-03 11:30:51,652 | INFO  | main | Name is: huawei_74, age is: 6 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:73)
    2023-06-03 11:30:51,652 | INFO  | main | Name is: huawei_38, age is: 7 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:73)
    2023-06-03 11:30:51,654 | INFO  | main | Name is: huawei_57, age is: 8 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:73)
    2023-06-03 11:30:51,654 | INFO  | main | Name is: huawei_23, age is: 8 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:73)
    ...

  3. Instale el cliente de clúster MRS e inicie sesión en el cliente ClickHouse.

    Por ejemplo, si el directorio de instalación del cliente es /opt/client, inicie sesión en el nodo donde está instalado el cliente como usuario de instalación del cliente.

    cd /opt/client

    source bigdata_env

    kinit developuser

  4. Ejecute el siguiente comando para conectarse al servidor ClickHouse:

    clickhouse client --host IP address of the ClickHouseServer instance --port Connection port --secure

    Para obtener la dirección IP de la instancia ClickHouse, inicie sesión en FusionInsight Manager, seleccione Cluster > Services > ClickHouse y haga clic en la pestaña Instance. Puede obtener el puerto de conexión buscando el parámetro tcp_port_secure en las configuraciones de servicio ClickHouse.

    Por ejemplo, ejecute el siguiente comando:

    clickhouse client --host 192.168.64.10 --port 21427 --secure

  5. Ejecute el siguiente comando para ver el contenido de la tabla creado por la aplicación:

    select * from testdb.testtb;

    ┌─name──────┬─age─┬───────date─┐
    │ huawei_70 │   4 │ 2021-10-28 │
    │ huawei_29 │   6 │ 2021-10-12 │
    │ huawei_16 │  28 │ 2021-10-04 │
    │ huawei_15 │  29 │ 2021-10-03 │
    └───────────┴─────┴────────────┘
    ...