Cómo instalar ClickHouse en Ubuntu 20.04

En este tutorial, aprenderás Cómo instalar ClickHouse en Ubuntu, en tu VPS. Utilizarás el DBMS para las tareas típicas A continuación, probaremos ClickHouse modelando y consultando datos de visitas a sitios web de ejemplo.

ClickHouse es una base de datos analítica de código abierto orientada a columnas. El procesamiento de consultas en tiempo real la hace adecuada para aplicaciones que requieren resultados analíticos en menos de un segundo. El lenguaje de consulta de ClickHouse es un dialecto de SQL que permite potentes capacidades de consulta declarativa al tiempo que ofrece familiaridad y una menor curva de aprendizaje para el usuario final.

Cómo instalar ClickHouse en Ubuntu

Las bases de datos orientadas a columnas almacenan los registros en bloques agrupados por columnas en lugar de por filas. Al no cargar los datos de las columnas ausentes en la consulta, las bases de datos orientadas a columnas emplean menos tiempo en leer los datos mientras completan las consultas. Como resultado, estas bases de datos pueden calcular y devolver resultados mucho más rápido que los sistemas tradicionales basados en filas.

Requisitos previos

  • Un servidor Ubuntu 20.04 con un usuario no root habilitado para sudo y una configuración de firewall. El servidor debe tener al menos 2GB de RAM. Puedes contratar uno en CONTABO o bien usar una maquina virtual con VirtualBOx y Vagrant para hacer un laboratorio.

Paso 1 – Cómo instalar ClickHouse en Ubuntu

Yandex mantiene un repositorio APT que tiene la última versión de ClickHouse. Añade la clave GPG del repositorio para poder descargar de forma segura los paquetes validados de ClickHouse:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E0C56BD4

Verás una salida similar a la siguiente:

OutputExecuting: /tmp/apt-key-gpghome.JkkcKnBAFY/gpg.1.sh --keyserver keyserver.ubuntu.com --recv E0C56BD4

gpg: key C8F1E19FE0C56BD4: public key "ClickHouse Repository Key <milovidov@yandex-team.ru>" imported
gpg: Total number processed: 1
gpg:               imported: 1

La salida confirma que has verificado y añadido la clave con éxito.

Añade el repositorio a tu lista de repositorios APT ejecutando:

echo "deb http://repo.yandex.ru/clickhouse/deb/stable/ main/" | sudo tee /etc/apt/sources.list.d/clickhouse.list

Aquí has canalizado la salida de echo a sudo tee para que esta salida pueda imprimirse en un archivo propiedad de root.

Ahora, actualiza tus paquetes:

sudo apt update

Los paquetes clickhouse-server y clickhouse-client estarán ahora disponibles para su instalación. Instálalos con este comando. Durante la instalación, se te pedirá que establezcas una contraseña para el usuario predeterminado de ClickHouse.

sudo apt install clickhouse-server clickhouse-client

Has instalado el servidor y el cliente de ClickHouse con éxito. Ahora estás listo para iniciar el servicio de base de datos y asegurarte de que se ejecuta correctamente.

Paso 2 – Iniciar el servicio

El paquete clickhouse-server que instalaste en la sección anterior crea un servicio systemd, que realiza acciones como iniciar, detener y reiniciar el servidor de la base de datos. systemd es un sistema init para Linux que permite inicializar y gestionar servicios. En esta sección iniciarás el servicio y verificarás que se ejecuta correctamente.

Inicia el servicio clickhouse-server ejecutando:

sudo service clickhouse-server start

El comando anterior no mostrará ninguna salida. Para verificar que el servicio se está ejecutando correctamente, ejecuta:

sudo service clickhouse-server status

Verás una salida similar a la siguiente:

Output● clickhouse-server.service - ClickHouse Server (analytic DBMS for big data)
     Loaded: loaded (/etc/systemd/system/clickhouse-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2020-09-16 05:18:54 UTC; 5s ago
   Main PID: 2697 (clickhouse-serv)
      Tasks: 46 (limit: 1137)
     Memory: 459.7M
     CGroup: /system.slice/clickhouse-server.service
             └─2697 /usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml --pid-file=/run/clickhouse-server/clickhouse-server.pid

La salida señala que el servidor está funcionando.

Has iniciado con éxito el servidor ClickHouse y ahora podrás utilizar el programa clickhouse-client CLI para conectarte al servidor.

Paso 3 – Creación de bases de datos y tablas

En ClickHouse, puedes crear y eliminar bases de datos ejecutando sentencias SQL directamente en el prompt interactivo de la base de datos. Las sentencias consisten en comandos que siguen una sintaxis determinada y que indican al servidor de la base de datos que realice una operación solicitada junto con los datos necesarios. Las bases de datos se crean utilizando la sintaxis CREATE DATABASE table_name. Para crear una base de datos, primero inicia una sesión de cliente ejecutando el siguiente comando:

clickhouse-client --password

Se te pedirá que introduzcas la contraseña que habías establecido durante la instalación; introdúcela para iniciar correctamente la sesión del cliente.

El comando anterior le permitirá acceder al prompt del cliente donde podrá ejecutar las sentencias SQL de ClickHouse para realizar acciones como:

  • Creación, actualización y eliminación de bases de datos, tablas, índices, particiones y vistas.
  • Ejecutar consultas para recuperar datos que son opcionalmente filtrados y agrupados usando varias condiciones.

En este paso, con el cliente ClickHouse listo para insertar datos, vas a crear una base de datos y una tabla. Para los propósitos de este tutorial, crearás una base de datos llamada test, y dentro de ella crearás una tabla llamada visits que registra la duración de las visitas al sitio web.

Ahora que estás dentro del prompt de comandos de ClickHouse, crea tu base de datos test ejecutando:

CREATE DATABASE test;

Verás la siguiente salida que muestra que has creado la base de datos:

OutputCREATE DATABASE test

Ok.

0 rows in set. Elapsed: 0.003 sec.

Una tabla de ClickHouse es similar a las tablas de otras bases de datos relacionales; contiene una colección de datos relacionados en un formato estructurado. Puede especificar columnas junto con sus tipos, añadir filas de datos y ejecutar diferentes tipos de consultas en las tablas.

La sintaxis para crear tablas en ClickHouse sigue esta estructura de ejemplo:

CREATE TABLE table_name
(
    column_name1 column_type [options],
    column_name2 column_type [options],
    ...
) ENGINE = engine

Los valores table_name y column_name pueden ser cualquier identificador ASCII válido. ClickHouse admite una amplia gama de tipos de columna; algunos de los más populares son:

  • UInt64: utilizado para almacenar valores enteros en el rango de 0 a 18446744073709551615.
  • Float64: se utiliza para almacenar números en coma flotante como 2039,23, 10,5, etc.
  • String: utilizado para almacenar caracteres de longitud variable. No requiere un atributo de longitud máxima ya que puede almacenar longitudes arbitrarias.
  • Date: utilizado para almacenar fechas que siguen el formato AAAA-MM-DD.
  • DateTime: se utiliza para almacenar fechas junto con la hora y sigue el formato AAAA-MM-DD HH:MM:SS.

Después de las definiciones de las columnas, se especifica el motor utilizado para la tabla. En ClickHouse, los motores determinan la estructura física de los datos subyacentes, las capacidades de consulta de la tabla, sus modos de acceso concurrente y la compatibilidad con los índices. Los distintos tipos de motores son adecuados para los diferentes requisitos de las aplicaciones. El tipo de motor más utilizado y de mayor aplicación es MergeTree.

Now that you have an overview of table creation, you’ll create a table. Start by confirming the database you’ll be modifying:

USE test;

Verás la siguiente salida que muestra que has cambiado a la base de datos test desde la base de datos por defecto:

OutputUSE test

Ok.

0 rows in set. Elapsed: 0.001 sec.

El resto de esta guía asumirá que estás ejecutando sentencias dentro del contexto de esta base de datos.

Create your visits table by running this command:

CREATE TABLE visits (
 id UInt64,
 duration Float64,
 url String,
 created DateTime
) ENGINE = MergeTree() 
PRIMARY KEY id 
ORDER BY id;

A continuación se detalla lo que hace el comando. Se crea una tabla llamada visitas que tiene cuatro columnas:

  • id: La columna de clave primaria. Al igual que en otros sistemas RDBMS, una columna de clave primaria en ClickHouse identifica de forma exclusiva una fila; cada fila debe tener un valor único para esta columna.
  • duration: Una columna flotante utilizada para almacenar la duración de cada visita en segundos. Las columnas flotantes pueden almacenar valores decimales como 12,50.
  • url: Una columna de cadena que almacena la URL visitada, como http://dominio.com.
  • created: Una columna de fecha y hora que registra cuándo se produjo la visita.

Después de las definiciones de las columnas, se especifica MergeTree como motor de almacenamiento para la tabla. La familia de motores MergeTree se recomienda para las bases de datos de producción debido a su soporte optimizado para grandes inserciones en tiempo real, su robustez general y su soporte de consultas. Además, los motores MergeTree admiten la ordenación de filas por clave primaria, la partición de filas y la replicación y el muestreo de datos.

Si pretendes utilizar ClickHouse para archivar datos que no se consultan con frecuencia o para almacenar datos temporales, puede utilizar la familia de motores Log para optimizar ese caso de uso.

Después de las definiciones de las columnas, definirás otras opciones a nivel de tabla. La cláusula PRIMARY KEY establece id como la columna de clave primaria y la cláusula ORDER BY almacenará los valores ordenados por la columna id. Una clave primaria identifica de forma exclusiva una fila y se utiliza para acceder de forma eficiente a una única fila y para la colocación eficiente de filas.

Al ejecutar la sentencia create, verás la siguiente salida:

OutputCREATE TABLE visits
(
    id UInt64,
    duration Float64,
    url String,
    created DateTime
)
ENGINE = MergeTree()
PRIMARY KEY id
ORDER BY id

Ok.

0 rows in set. Elapsed: 0.010 sec.

En esta sección, ha creado una base de datos y una tabla para registrar los datos de las visitas al sitio web. En el siguiente paso, insertarás datos en la tabla, actualizarás los datos existentes y los eliminarás.

Paso 4 – Inserción, actualización y eliminación de datos y columnas

En este paso, utilizará su tabla de visitas para insertar, actualizar y eliminar datos. El siguiente comando es un ejemplo de la sintaxis para insertar filas en una tabla ClickHouse:

INSERT INTO table_name VALUES (column_1_value, column_2_value, ....);

Ahora, inserta algunas filas de datos de visitas a sitios web de ejemplo en tu tabla de visitas ejecutando cada una de las siguientes sentencias:

INSERT INTO visits VALUES (1, 10.5, 'http://dominio.com', '2019-01-01 00:01:01');
INSERT INTO visits VALUES (2, 40.2, 'http://dominio1.com', '2019-01-03 10:01:01');
INSERT INTO visits VALUES (3, 13, 'http://dominio2.com', '2019-01-03 12:01:01');
INSERT INTO visits VALUES (4, 2, 'http://dominio3.com', '2019-01-04 02:01:01');

Verás la siguiente salida repetida para cada sentencia de inserción.

OutputINSERT INTO visits VALUES

Ok.

1 rows in set. Elapsed: 0.004 sec.

La salida de cada fila muestra que se ha insertado con éxito en la tabla visits .

Ahora añadirá una columna adicional a la tabla visits . Al añadir o eliminar columnas de las tablas existentes, ClickHouse admite la sintaxis ALTER.

Por ejemplo, la sintaxis básica para añadir una columna a una tabla es la siguiente:

ALTER TABLE table_name ADD COLUMN column_name column_type;

Añade una columna llamada location que almacenará la ubicación de las visitas a un sitio web ejecutando la siguiente sentencia:

ALTER TABLE visits ADD COLUMN location String;
You’ll see output similar to the following:
OutputALTER TABLE visits
    ADD COLUMN
    location String


Ok.

0 rows in set. Elapsed: 0.014 sec.

La salida muestra que ha añadido la columna location con éxito.

A partir de la versión 19.13.3, ClickHouse no admite la actualización ni la eliminación de filas individuales de datos debido a restricciones de implementación. Sin embargo, ClickHouse es compatible con las actualizaciones y eliminaciones masivas, y tiene una sintaxis SQL distinta para estas operaciones para resaltar su uso no estándar.

La siguiente sintaxis es un ejemplo de actualización masiva de filas:

ALTER TABLE table_name UPDATE  column_1 = value_1, column_2 = value_2 ...  WHERE  filter_conditions;

Vamos a ejecutar la siguiente sentencia para actualizar la columna url de todas las filas que tengan una duración inferior a 15. Introdúcela en el prompt de la base de datos para ejecutarla:

ALTER TABLE visits UPDATE url = 'http://dominio2.com' WHERE duration < 15;

La salida de la sentencia de actualización masiva será la siguiente:

OutputALTER TABLE visits
    UPDATE url = 'http://example2.com' WHERE duration < 15


Ok.

0 rows in set. Elapsed: 0.003 sec.

La salida muestra que su consulta de actualización se completó con éxito. El conjunto de 0 filas en la salida denota que la consulta no devolvió ninguna fila; este será el caso de cualquier consulta de actualización y eliminación.

La sintaxis de ejemplo para la eliminación masiva de filas es similar a la de la actualización de filas y tiene la siguiente estructura:

ALTER TABLE table_name DELETE WHERE filter_conditions;

To test the data deletion, execute the following statement to delete all rows with a duration less than 5:

ALTER TABLE visits DELETE WHERE duration < 5;

La salida de la sentencia de borrado masivo será similar a:

OutputALTER TABLE visits
    DELETE WHERE duration < 5


Ok.

0 rows in set. Elapsed: 0.003 sec.

La salida confirma que ha eliminado las filas con una duración inferior a cinco segundos.

Para eliminar columnas de su tabla, la sintaxis seguiría la siguiente estructura de ejemplo:

ALTER TABLE table_name DROP COLUMN column_name;

Delete the location column you added previously by running the following:

ALTER TABLE visits DROP COLUMN location;

La salida de DROP COLUMN que confirma que ha eliminado la columna será la siguiente:

OutputALTER TABLE visits
    DROP COLUMN
    location String


Ok.

0 rows in set. Elapsed: 0.010 sec.

Ahora que has insertado, actualizado y eliminado con éxito filas y columnas en tu tabla visits, pasará a consultar los datos en el siguiente paso.

Paso 5 – Consulta de datos

El lenguaje de consulta de ClickHouse es un dialecto personalizado de SQL con extensiones y funciones adecuadas para las cargas de trabajo de análisis. En este paso, ejecutarás consultas de selección y agregación para recuperar datos y resultados de tu tabla visits.

Las consultas de selección permiten recuperar filas y columnas de datos filtradas por las condiciones que se especifiquen, junto con opciones como el número de filas que se devolverán. Puede seleccionar filas y columnas de datos utilizando la sintaxis SELECT. La sintaxis básica de las consultas SELECT es:

SELECT func_1(column_1), func_2(column_2) FROM table_name WHERE filter_conditions row_options;

Ejecute la siguiente sentencia para recuperar los valores de url y duración de las filas en las que la url es http://dominio.com.

SELECT url, duration FROM visits WHERE url = 'http://example2.com' LIMIT 2;

Verás la siguiente salida:

OutputSELECT
    url,
    duration
FROM visits
WHERE url = 'http://example2.com'
LIMIT 2

┌─url─────────────────┬─duration─┐
│ http://example2.com │     10.5 │
└─────────────────────┴──────────┘
┌─url─────────────────┬─duration─┐
│ http://example2.com │       13 │
└─────────────────────┴──────────┘

2 rows in set. Elapsed: 0.013 sec.

La salida ha devuelto dos filas que coinciden con las condiciones especificadas. Ahora que has seleccionado los valores, puedes pasar a ejecutar las consultas de agregación.

Las consultas de agregación son consultas que operan sobre un conjunto de valores y devuelven valores de salida únicos. En las bases de datos analíticas, estas consultas se ejecutan con frecuencia y están bien optimizadas por la base de datos. Algunas funciones de agregación soportadas por ClickHouse son:

  • count: Devuelve el recuento de filas que coinciden con las condiciones especificadas.
  • sum: Devuelve la suma de los valores de las columnas seleccionadas.
  • avg: Devuelve la media de los valores de las columnas seleccionadas.

Algunas funciones agregadas específicas de ClickHouse incluyen:

  • uniq: devuelve un número aproximado de filas distintas coincidentes.
  • topK: devuelve una matriz de los valores más frecuentes de una columna específica utilizando un algoritmo de aproximación.

Para demostrar la ejecución de las consultas de agregación, calcularás la duración total de las visitas ejecutando la consulta de suma:

SELECT SUM(duration) FROM visits;

Verás una salida similar a la siguiente:

OutputSELECT SUM(duration)
FROM visits

┌─SUM(duration)─┐
│          63.7 │
└───────────────┘

1 rows in set. Elapsed: 0.010 sec.

Ahora, calcula las dos primeras URLs ejecutando:

SELECT topK(2)(url) FROM visits;

You will see output similar to the following:

OutputSELECT topK(2)(url)
FROM visits

┌─topK(2)(url)──────────────────────────────────┐
│ ['http://example2.com','http://example1.com'] │
└───────────────────────────────────────────────┘

1 rows in set. Elapsed: 0.010 sec.

Ahora que has consultado con éxito tu tabla visits , eliminarás las tablas y bases de datos en el siguiente paso.

Paso 6 – Borrar tablas y bases de datos

En esta sección, eliminarás la tabla visits y la base de datos de prueba.

La sintaxis para borrar tablas sigue este ejemplo:

DROP TABLE table_name;

Para eliminar la tabla visits, ejecute la siguiente sentencia:

DROP TABLE visits;

Verás la siguiente salida declarando que has eliminado la tabla con éxito:

outputDROP TABLE visits

Ok.

0 rows in set. Elapsed: 0.005 sec.

Puede eliminar las bases de datos utilizando la sintaxis DROP base de datos nombre_tabla. Para eliminar la base de datos de prueba, ejecute la siguiente sentencia:

DROP DATABASE test;

La salida resultante muestra que has eliminado la base de datos con éxito.

OutputDROP DATABASE test

Ok.

0 rows in set. Elapsed: 0.003 sec.

You’ve deleted tables and databases in this step. Now that you’ve created, updated, and deleted databases.

Si quieres profundizar mas en el uso de este tipo de bases de datos, puedes bucear en la documentación del propio ClickHouse.

¡Que tengas un Ingenioso día!

¡que tengas un ingenioso día!

Contrata tu plan Ingenios@ de Sistemas por 5€ al mes y responderé a todas tus preguntas sobre tecnología en el menor tiempo posible. Pasa a formar parte de la comunidad Ingenios@s de Sistemas y disfruta de contenido exclusivo y aprende sobre sistemas Open Source, Blockchain, SmarContract, Web3, Inteligencia Artificial y Reaidad Virtual, súbete al tren de la Revolución 4.0

Si quieres estar al día y no perderte nada Suscribete al Podcast Ingenios@s de Sistemas, un episodio diario que te mantendrá informado y formado en esta vertiginosa carrera.

Deja un comentario

Share to...