El autor seleccionó la Free and Open Source Fund para recibir una donación como parte del programa Write for DOnations.
ClickHouse es una base de datos de análisis de código abierto con orientación en columnas, creada por Yandex para casos de uso de OLAP y macrodatos. La compatibilidad de ClickHouse con procesamiento de consultas en tiempo real hace que sea 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 capacidades de consulta declarativas potentes, y ofrece familiaridad y una curva de aprendizaje más pequeña para el usuario final.
Las bases de datos orientadas en columnas almacenan los registros en bloques agrupados por columnas en vez de filas. Al no cargar los datos para las columnas ausentes en consultas, las bases de datos orientadas en columnas pasan menos tiempo leyendo datos cuando completan consultas. Como resultado, estas bases de datos pueden calcular y mostrar resultados mucho más rápido que los sistemas tradicionales basados en filas para ciertas cargas de trabajo, como OLAP.
Los sistemas de procesamiento analítico en línea (OLAP) permiten organizar grandes cantidades de datos y realizar consultas complejas. Son capaces de gestionar petabytes de datos y mostrar resultados de consultas rápidamente. De esta forma, el OLAP es útil para trabajar en áreas como la ciencia de datos y el análisis empresarial.
A través de este tutorial, instalará el servidor y el cliente de la base de datos ClickHouse en su equipo. Usará DBMS para tareas típicas y, opcionalmente, para permitir el acceso remoto desde otro servidor para poder establecer conexión con la base de datos desde otro equipo. Luego, probará ClickHouse modelando y consultando datos de visitas a sitios web.
sudo
y un firewall configurados. Puede seguir el tutorial de configuración inicial de servidores para crear el usuario y configurar el firewall.sudo
de Debian 10 y un firewall configurados. Puede seguir el tutorial de configuración inicial para servidores.En esta sección, instalará el servidor de ClickHouse y programas clientes usando apt
.
Primero, aplique SSH a su servidor ejecutando lo siguiente:
- ssh sammy@your_server_ip
dirmngr
es un servidor que permite administrar certificados y claves. Se necesita para añadir y verificar claves remotas de repositorios. Puede instalarlo ejecutando lo siguiente:
- sudo apt install dirmngr
Yandex cuenta con un respositorio de APT que tiene la última versión de ClickHouse. Añada la clave GPG del repositorio de modo que pueda descargar de forma segura paquetes de ClickHouse validados:
- sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E0C56BD4
El resultado debe ser similar a lo 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
El resultado confirma que verificó y añadió la clave correctamente.
Añada el repositorio a su lista de repositorios de APT ejecutando lo siguiente:
- echo "deb http://repo.yandex.ru/clickhouse/deb/stable/ main/" | sudo tee /etc/apt/sources.list.d/clickhouse.list
Aquí, canalizó el resultado de echo
a sudo tee
para que este resultado se pueda imprimir a un archivo perteneciente al root.
Ahora, ejecute apt update
para actualizar sus paquetes:
- sudo apt update
Los paquetes clickhouse-server
y clickhouse-client
ahora estarán disponibles para instalarse.
Hasta la versión 19.13.3 de ClickHouse, la lectura de ciertas configuraciones de OpenSSL 1.1.1 como MinProtocol y CipherVersion no es correcta. Para resolver esta incompatibilidad, modifique el archivo de configuración de OpenSSL y elimine la línea ssl_conf=ssl_sect
en /etc/ssl/openssl.cnf
.
Edite el archivo de configuración ejecutando lo siguiente:
- sudo nano /etc/ssl/openssl.cnf
Luego elimine la línea que contiene ssl_conf=ssl_sect
, de forma que tenga un aspecto similar al del siguiente archivo:
...
tsa_name = yes # Must the TSA name be included in the reply?
# (optional, default: no)
ess_cert_id_chain = no # Must the ESS cert id chain be included?
# (optional, default: no)
ess_cert_id_alg = sha1 # algorithm to compute certificate
# identifier (optional, default: sha1)
[default_conf]
#ssl_conf = ssl_sect
[ssl_sect]
...
Ahora que se parcheó la configuración de OpenSSL, está listo para instalar el servidor de ClickHouse y los paquetes de clientes. Instálelos con:
- sudo apt install clickhouse-server clickhouse-client
Durante la instalación, se le solicitará configurar una contraseña para el usuario predeterminado de ClickHouse.
Con esto, habrá instalado el servidor y el cliente de ClickHouse de forma correcta. Ahora estará listo para iniciar el servicio de la base de datos y asegurarse de que se ejecute correctamente.
El paquete clickhouse-server
que instaló 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 administrar servicios. En esta sección, iniciará el servicio y verificará que se ejecute correctamente.
Inicie el servicio clickhouse-server
ejecutando lo siguiente:
- sudo service clickhouse-server start
Con el comando anterior no se mostrará ningún resultado. Para verificar que el servicio esté funcionando correctamente, ejecute lo siguiente:
- sudo service clickhouse-server status
Visualizará un resultado similar al 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 Sat 2018-12-22 07:23:20 UTC; 1h 9min ago
Main PID: 27101 (ClickHouse-serv)
Tasks: 34 (limit: 1152)
CGroup: /system.slice/ClickHouse-server.service
└─27101 /usr/bin/ClickHouse-server --config=/etc/ClickHouse-server/config.xml
En el resultado se indica que el servidor está en ejecución.
Inició correctamente el servidor de ClickHouse y ahora podrá usar el programa CLI clickhouse-client
para establecer conexión con el servidor.
En ClickHouse, puede crear y eliminar bases de datos ejecutando instrucciones SQL directamente en el intérprete de comandos interactivo de la base de datos. Las instrucciones consisten en comandos que siguen una sintaxis concreta que indica al servidor de la base de datos que realice una operación solicitada junto con cualquier dato requerido. Las bases de datos se crean usando la sintaxis CREATE DATABASE table_name
. Para crear una base de datos, primero inicie la sesión del cliente ejecutando el siguiente comando:
- clickhouse-client --password
Se le solicitará introducir la contraseña que configuró durante la instalación; ingrésela para iniciar correctamente la sesión del cliente.
El comando previo hará que inicie sesión en el intérprete de comandos del cliente, en el que puede ejecutar las instrucciones SQL de ClickHouse para realizar acciones como la siguiente:
Crear, actualizar y eliminar bases de datos, tablas, índices, particiones y vistas.
Ejecutar consultas para obtener datos que se filtran y agrupan de forma opcional usando varias condiciones.
En este paso, una vez que el cliente de ClickHouse esté listo para insertar datos, creará una base de datos y una tabla. A los efectos de este tutorial, creará una base de datos llamada test
, y dentro de ella una tabla llamada visits
que realiza un seguimiento de las duraciones de las visitas al sitio web.
Ahora que se encuentra en el intérprete de comandos de ClickHouse, cree su base de datos test
ejecutando lo siguiente:
- CREATE DATABASE test;
Verá el siguiente resultado, en el que se muestra que creó 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 un conjunto 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 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 es compatible con varios tipos de columna; algunos de los más populares son lo siguientes:
Ulnt64
: se utiliza para almacenar valores enteros en el rango de 0 a 18446744073709551615.
Float64
: se utiliza para almacenar números con punto flotante, como “2039.23”, “10.5”, etc.
String
: se utiliza para almacenar caracteres de extensión variable. No requiere un atributo de longitud máxima, ya que puede almacenar extensiones arbitrarias.
Date
: se utiliza para almacenar fechas con el formato YYYY-MM-DD
.
DateTime
: se utiliza para almacenar fechas junto con horas con el formato YYYY-MM-DD HH:MM:SS
.
Después de las deficiones de columna, se especifica el motor empleado 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 simultáneo y la compatibilidad con los índices. Hay diferentes tipos de motores adecuados según los requisitos de las diferentes aplicaciones. El tipo de motor más usado y más aplicable es MergeTree
.
Ahora que vio una descripción general de la creación de tablas, confeccionará una. Comience confirmando la base de datos que modificará:
- USE test;
Verá el siguiente resultado, en el que se muestra que se posicionó en la base de datos test
desde la base de datos default
:
OutputUSE test
Ok.
0 rows in set. Elapsed: 0.001 sec.
Para el resto de esta guía, se supondrá que ejecutará las instrucciones en el contexto de esta base de datos.
Cree su tabla visits
ejecutando este comando:
- CREATE TABLE visits (
- id UInt64,
- duration Float64,
- url String,
- created DateTime
- ) ENGINE = MergeTree()
- PRIMARY KEY id
- ORDER BY id;
A continuación, verá un desglose de lo que hace el comando. Se crea una tabla llamada test
que tiene cuatro columnas:
id
: columna de clave principal. De forma similar a otros sistemas RDBMS, en una columna de clave principal de ClickHouse se identifica de forma única una fila; cada fila debería tener un valor único para esta columna.
duration
: columna flotante que se utiliza para almacenar la duración de cada visita en segundos. Las columnas float
pueden almacenar valores decimales, como “12.50”.
url
: columna de cadena que almacena la URL visitada, como http://example.com
.
created
: una columna de fecha y hora que realiza un seguimiento del momento en que se produjo la visita.
Tras las definiciones de columna, se especifica MergeTree
como el motor de almacenamiento para la tabla. La familia MergeTree de motores se recomienda para bases de datos de producción debido a su compatibilidad optimizada con inserciones grandes en tiempo real, su solidez general y su compatibilidad con consultas. Adicionalmente, los motores MergeTree admiten el ordenamiento de filas por clave principal, la partición de filas, y la replicación y el muestro de datos.
Si desea usar ClickHouse para archivar datos que no se consultan a menudo o almacenar datos temporales, puede usar la familia Log de motores para la optimización según el uso.
Después de las definiciones de columna, definirá otras opciones de nivel de tabla. La cláusula PRIMARY KEY
establece id
como la columna clave principal y la cláusula ORDER BY
almacenará los valores ordenados por la columna id
. Una clave principal identifica de forma única una fila y se utiliza para acceder a una única fila y disponer filas de manera eficiente.
Cuando ejecute la instrucción “create”, verá el siguiente resultado:
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, creó una base de datos y una tabla para realizar un seguimiento de los datos de visitas de un sitio web. En el siguiente paso, insertará datos en la tabla, actualizará los existentes y los eliminará.
En este paso, usará su tabla visits
para insertar, actualizar y eliminar datos. El siguiente comando es un ejemplo de la sintaxis para insertar filas en una tabla de ClickHouse:
INSERT INTO table_name VALUES (column_1_value, column_2_value, ....);
Ahora, inserte algunas filas de datos sobre visitas al sitio web de ejemplo en su tabla visits
ejecutando cada una de las siguientes instrucciones:
- INSERT INTO visits VALUES (1, 10.5, 'http://example.com', '2019-01-01 00:01:01');
- INSERT INTO visits VALUES (2, 40.2, 'http://example1.com', '2019-01-03 10:01:01');
- INSERT INTO visits VALUES (3, 13, 'http://example2.com', '2019-01-03 12:01:01');
- INSERT INTO visits VALUES (4, 2, 'http://example3.com', '2019-01-04 02:01:01');
Verá el siguiente resultado repetido para cada instrucción de inserción.
OutputINSERT INTO visits VALUES
Ok.
1 rows in set. Elapsed: 0.004 sec.
El resultado de cada fila muestra que la insertó correctamente en la tabla visits
.
Ahora añadirá una columna a la tabla visits
. Cuando se añaden o eliminan columnas en 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ñada una columna llamada location
en la que se almacenará la ubicación de las visitas a un sitio web ejecutando la siguiente instrucción:
- ALTER TABLE visits ADD COLUMN location String;
Visualizará un resultado similar al siguiente:
OutputALTER TABLE visits
ADD COLUMN
location String
Ok.
0 rows in set. Elapsed: 0.014 sec.
En el resultado se muestra que ha añadió la columna location
correctamente.
Hasta la versión 19.13.3, ClickHouse no es compatible con la actualización y eliminación de filas individuales de datos debido a restricciones de implementación. ClickHouse admite actualizaciones y eliminaciones masivas. Sin embargo, tiene una sintaxis SQL distinta para estas operaciones a fin de resaltar su uso no estándar.
La siguiente sintaxis es un ejemplo para actualizar filas de forma masiva:
ALTER TABLE table_name UPDATE column_1 = value_1, column_2 = value_2 ... WHERE filter_conditions;
Ejecutará la siguiente instrucción para actualizar la columna url
de todas las filas que tengan una duration
inferior a 15. Introdúzcala en la indicación de la base de datos para ejecutarla:
- ALTER TABLE visits UPDATE url = 'http://example2.com' WHERE duration < 15;
El resultado de la instrucción de actualización masiva será el siguiente:
OutputALTER TABLE visits
UPDATE url = 'http://example2.com' WHERE duration < 15
Ok.
0 rows in set. Elapsed: 0.003 sec.
En el resultado, se muestra que su consulta de actualización se completó de forma correcta. En la línea 0 rows in set
se indica que con la consulta no se obtuvieron filas; este sería el caso para cualquier consulta de actualización y eliminación.
El efecto de la sintaxis de ejemplo para eliminar filas de forma masiva es similar al de actualizar las filas y tiene la siguiente estructura:
ALTER TABLE table_name DELETE WHERE filter_conditions;
Para probar la eliminación de datos, ejecute la siguiente instrucción para eliminar todas las filas que tengan una duration
inferior a 5
:
- ALTER TABLE visits DELETE WHERE duration < 5;
El resultado de la instrucción de eliminación en lote será similar al siguiente:
OutputALTER TABLE visits
DELETE WHERE duration < 5
Ok.
0 rows in set. Elapsed: 0.003 sec.
El resultado confirma que ha eliminó las filas con una duración de menos de cinco segundos.
Para eliminar columnas de su tabla, la sintaxis debería asemejarse a la de esta estructura de ejemplo:
ALTER TABLE table_name DROP COLUMN column_name;
Elimine la columna location
que añadió previamente ejecutando lo siguiente:
- ALTER TABLE visits DROP COLUMN location;
El resultado de DROP COLUMN
que confirma que eliminó la columna será el siguiente:
OutputALTER TABLE visits
DROP COLUMN
location String
Ok.
0 rows in set. Elapsed: 0.010 sec.
Ahora que insertó, actualizó y eliminó correctamente filas y columnas en su tabla visits
, en el siguiente paso solicitará datos.
El lenguaje de consulta de ClickHouse es un dialecto personalizado de SQL con extensiones y funciones adecuadas para cargas de trabajo analíticas. En este paso, ejecutará consultas de selección y adición para obtener datos y resultados de su tabla visits
.
Las consultas de selección le permiten obtener filas y columnas de datos filtrados por condiciones que especifique, con opciones como el número de filas que se mostrarán. Puede seleccionar filas y columnas de datos usando la sintaxis SELECT
. La sintaxis básica de las consultas SELECT
es la siguiente:
SELECT func_1(column_1), func_2(column_2) FROM table_name WHERE filter_conditions row_options;
Ejecute la siguiente instrucción para obtener los valores url
y duration
para las filas en las cuales la url
sea http://example.com
.
- SELECT url, duration FROM visits WHERE url = 'http://example2.com' LIMIT 2;
Verá lo siguiente:
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.
En el resultado se muestran dos filas que coinciden con las condiciones que especificó. Ahora que seleccionó los valores, puede proceder a ejecutar consultas de adición.
Las consultas de adición se aplican a un conjunto de valores y muestran valores de resultados sencillos. En las bases de datos de analíticas, estas consultas se ejecutan frecuentemente y se optimizan bien a través de la base de datos. Las siguientes son algunas funciones de adición compatibles con ClickHouse:
count
: muestra el recuento de filas que coinciden con las condiciones especificadas.
sum
: muestra la suma de los valores de columnas seleccionadas.
avg
: muestra el promedio de valores seleccionados en columnas.
Las siguientes son algunas funciones de adición específicas de ClickHouse:
uniq
: muestra un número aproximado de filas distintas que coinciden.
topK
: devuelve una matriz de los valores más frecuentes de una columna especifica usando un algoritmo de aproximación.
Para demostrar la ejecución de las consultas de adición, calculará la duración total de las visitas usando la consulta sum
:
- SELECT SUM(duration) FROM visits;
El resultado debe ser similar a lo siguiente:
OutputSELECT SUM(duration)
FROM visits
┌─SUM(duration)─┐
│ 63.7 │
└───────────────┘
1 rows in set. Elapsed: 0.010 sec.
Ahora, calcule las dos URL principales ejecutando lo siguiente:
- SELECT topK(2)(url) FROM visits;
El resultado debe ser similar a lo siguiente:
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 consultó correctamente su tabla visits
, en el siguiente paso eliminará tablas y bases de datos.
En esta sección, eliminará su tabla visits
y la base de datos test
.
La sintaxis para eliminar tablas sigue este ejemplo:
DROP TABLE table_name;
Para eliminar la tabla visits
, ejecute la siguiente instrucción:
- DROP TABLE visits;
Verá el siguiente resultado, que indicará que eliminó la tabla correctamente:
outputDROP TABLE visits
Ok.
0 rows in set. Elapsed: 0.005 sec.
Puede eliminar bases de datos usando la sintaxis DROP database table_name
. Para eliminar la base de datos test
, ejecute la siguiente instrucción:
- DROP DATABASE test;
En el resultado se muestra que eliminó la base de datos correctamente.
OutputDROP DATABASE test
Ok.
0 rows in set. Elapsed: 0.003 sec.
En este paso, eliminó tablas y bases de datos. Ahora que creó, actualizó y eliminó bases de datos, tablas y datos en su instancia de ClickHouse, en la siguiente sección permitirá el acceso remoto al servidor de su base de datos.
Si desea usar ClickHouse solo a nivel local con aplicaciones que se ejecuten en el mismo servidor, o si no dispone de un firewall habilitado en su servidor, no necesitará completar esta sección. Si, por el contrario, planea establecer conexión con el servidor de la base de datos de ClickHouse de forma remota, debería seguir este paso.
Actualmente, su servidor cuenta con un firewall habilitado que impide que su dirección IP pública acceda a todos los puertos. Completará los siguientes dos pasos para permitir el acceso remoto:
Modifique la configuración de ClickHouse y permita que escuche en todas las interfaces.
Añada una regla de firewall que permita las conexiones entrantes al puerto 8123
, el puerto HTTP que el servidor de ClickHouse ejecuta.
Si se encuentra en el intérprete de comandos de la base de datos, ciérrelo con CTRL+D
.
Edite el archivo de configuración ejecutando lo siguiente:
- sudo nano /etc/clickhouse-server/config.xml
Luego, elimine el comentario de la línea que contiene <!-- <listen_host>0.0.0.0</listen_host> -->
, como en el siguiente archivo:
...
<interserver_http_host>example.yandex.ru</interserver_http_host>
-->
<!-- Listen specified host. use :: (wildcard IPv6 address), if you want to accept connections both with IPv4 and IPv6 from everywhere. -->
<!-- <listen_host>::</listen_host> -->
<!-- Same for hosts with disabled ipv6: -->
<listen_host>0.0.0.0</listen_host>
<!-- Default values - try listen localhost on ipv4 and ipv6: -->
<!--
<listen_host>::1</listen_host>
<listen_host>127.0.0.1</listen_host>
-->
...
Guarde el archivo y cierre el intérprete. Para que se aplique la nueva configuración, reinicie el servicio ejecutando lo siguiente:
- sudo service clickhouse-server restart
Este comando no generará resultados. El servidor de ClickHouse escucha conexiones HTTP en el puerto 8123
y conexiones desde clickhouse-client
en el puerto 9000
. Permita el acceso a ambos puertos para la segunda dirección IP de su servidor con el siguiente comando:
- sudo ufw allow from second_server_ip/32 to any port 8123
- sudo ufw allow from second_server_ip/32 to any port 9000
Para ambos comandos, verá el siguiente resultado en el que se muestra que habilitó el acceso a ambos puertos:
OutputRule added
El acceso a ClickHouse ahora será posible desde la dirección IP que añadió. Puede añadir direcciones IP adicionales, como la de su equipo local, si es necesario.
Para verificar que puede establecer conexión con el servidor de ClickHouse desde el equipo remoto, sigas la indicaciones del paso 1 de este tutorial para el segundo servidor y asegúrese de que el clickhouse-client
esté instalado en él.
Ahora que inició sesión en el segundo servidor, inicie una sesión de cliente ejecutando lo siguiente:
- clickhouse-client --host your_server_ip --password
Verá el siguiente resultado, que muestra que estableció conexión de forma correcta con el servidor:
OutputClickHouse client version 19.13.3.26 (official build).
Password for user (default):
Connecting to your_server_ip:9000 as user default.
Connected to ClickHouse server version 19.13.3 revision 54425.
hostname :)
En este paso, habilitó el acceso remoto al servidor de su base de datos de ClickHouse ajustando las reglas de su firewall.
Configuró correctamente una instancia de base de datos de ClickHouse en su servidor y creó una base de datos y una tabla, añadió datos, realizó consultas y eliminó la base de datos. En la documentación de ClickHouse, puede obtener información sobre referencias de la empresa en comparación con otras bases de datos de análisis de código abierto y comerciales, y hallar documentos de referencia general.
ClickHouse ofrece otras funciones, como la de procesamiento distribuido de consultas en varios servidores, para mejorar el rendimiento y brindar protección contra la pérdida de datos mediante el almacenamiento de estos en diferentes fragmentos.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.