Delivering data from Yandex Managed Service for Apache Kafka® to Managed Service for ClickHouse® using Yandex Data Transfer
A Managed Service for ClickHouse® cluster can get data from Apache Kafka® topics in real time. Managed Service for ClickHouse automatically inserts data sent to ClickHouse® tables on the Kafka
engine
To set up data delivery from Managed Service for Apache Kafka® to Managed Service for ClickHouse®:
- Send test data to Managed Service for Apache Kafka® topic.
- Prepare and activate the transfer.
- Test the transfer.
If you no longer need the resources you created, delete them.
Getting started
Prepare the infrastructure
-
Create a Managed Service for Apache Kafka® source cluster of any suitable configuration. To connect to the cluster from the user's local machine rather than doing so from the Yandex Cloud cloud network, enable public access to the cluster when creating it.
-
Create a topic in the Managed Service for Apache Kafka® cluster.
-
Create users so that the producer and consumer can access the topic in the Managed Service for Apache Kafka® cluster:
- With the
ACCESS_ROLE_PRODUCER
role for the producer. - With the
ACCESS_ROLE_CONSUMER
role for the consumer.
- With the
-
Create a Managed Service for ClickHouse® target cluster with any suitable configuration. To connect to the cluster from the user's local machine rather than doing so from the Yandex Cloud cloud network, enable public access to the cluster when creating it.
-
If you are using security groups, configure them to enable connecting to the clusters from the internet:
-
If you do not have Terraform yet, install it.
-
Get the authentication credentials. You can add them to environment variables or specify them later in the provider configuration file.
-
Configure and initialize a provider. There is no need to create a provider configuration file manually, you can download it
. -
Place the configuration file in a separate working directory and specify the parameter values. If you did not add the authentication credentials to environment variables, specify them in the configuration file.
-
Download the data-transfer-mkf-mch.tf
configuration file to the same working directory.This file describes:
- Network.
- Subnet.
- security group and rules required to connect to the clusters from the internet.
- Managed Service for Apache Kafka® source cluster.
- Topic and two Apache Kafka® users on whose behalf the producer and consumer will connect to the topic.
- Managed Service for ClickHouse® target cluster.
- Target endpoint.
- Transfer.
-
In the
data-transfer-mkf-mch.tf
file, specify:-
Source Managed Service for Apache Kafka® cluster parameters:
source_user_producer
andsource_password_producer
: Username and password for the producer user.source_user_consumer
andsource_password_consumer
: Username and password of the consumer user.source_topic_name
: Name of the topic.
-
The Managed Service for ClickHouse® target cluster parameters that will also be used as the target endpoint parameters:
target_db_name
: Managed Service for ClickHouse® database name.target_user
andtarget_password
: Database owner username and password.
-
-
Make sure the Terraform configuration files are correct using this command:
terraform validate
If there are any errors in the configuration files, Terraform will point them out.
-
Create the required infrastructure:
-
Run the command to view planned changes:
terraform plan
If the resource configuration descriptions are correct, the terminal will display a list of the resources to modify and their parameters. This is a test step. No resources are updated.
-
If you are happy with the planned changes, apply them:
-
Run the command:
terraform apply
-
Confirm the update of resources.
-
Wait for the operation to complete.
-
All the required resources will be created in the specified folder. You can check resource availability and their settings in the management console
. -
Configure additional settings
-
Install the utilities:
-
kafkacat
: To read and write data to the Apache Kafka® topic.sudo apt update && sudo apt install --yes kafkacat
Check that you can use it to connect to Managed Service for Apache Kafka® clusters over SSL.
-
clickhouse-client
: To connect to the database in the Managed Service for ClickHouse® cluster.-
Connect the DEB repository
ClickHouse®:sudo apt update && sudo apt install --yes apt-transport-https ca-certificates dirmngr && \ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4 && \ echo "deb https://packages.clickhouse.com/deb stable main" | sudo tee \ /etc/apt/sources.list.d/clickhouse.list
-
Install the dependencies:
sudo apt update && sudo apt install --yes clickhouse-client
-
Download the configuration file for
clickhouse-client
:mkdir -p ~/.clickhouse-client && \ wget "https://storage.yandexcloud.net/doc-files/clickhouse-client.conf.example" \ --output-document ~/.clickhouse-client/config.xml
Check that you can use it to connect to the Managed Service for ClickHouse® cluster over SSL.
-
-
jq
for JSON file stream processing.sudo apt update && sudo apt-get install --yes jq
-
Send test data to the Managed Service for Apache Kafka® topic
Suppose that your Apache Kafka® topic receives data from car sensors. This data will be transmitted as Apache Kafka® messages in JSON format:
{
"device_id":"iv9a94th6rzt********",
"datetime":"2020-06-05 17:27:00",
"latitude":"55.70329032",
"longitude":"37.65472196",
"altitude":"427.5",
"speed":"0",
"battery_voltage":"23.5",
"cabin_temperature":"17",
"fuel_level":null
}
The Managed Service for ClickHouse® cluster will use JSONEachRow formatKafka
tables. This format converts strings from Apache Kafka® messages to relevant column values.
-
Create a
sample.json
file with the following test data:sample.json
{ "device_id": "iv9a94th6rzt********", "datetime": "2020-06-05 17:27:00", "latitude": 55.70329032, "longitude": 37.65472196, "altitude": 427.5, "speed": 0, "battery_voltage": 23.5, "cabin_temperature": 17, "fuel_level": null } { "device_id": "rhibbh3y08qm********", "datetime": "2020-06-06 09:49:54", "latitude": 55.71294467, "longitude": 37.66542005, "altitude": 429.13, "speed": 55.5, "battery_voltage": null, "cabin_temperature": 18, "fuel_level": 32 } { "device_id": "iv9a94th6rzt********", "datetime": "2020-06-07 15:00:10", "latitude": 55.70985913, "longitude": 37.62141918, "altitude": 417.0, "speed": 15.7, "battery_voltage": 10.3, "cabin_temperature": 17, "fuel_level": null }
-
Send data from the
sample.json
file to the Managed Service for Apache Kafka® topic usingjq
andkafkacat
:jq -rc . sample.json | kafkacat -P \ -b <broker_host_FQDN>:9091 \ -t <topic_name> \ -k key \ -X security.protocol=SASL_SSL \ -X sasl.mechanisms=SCRAM-SHA-512 \ -X sasl.username="<username_for_the_producer>" \ -X sasl.password="<user_password_for_the_producer>" \ -X ssl.ca.location=/usr/local/share/ca-certificates/Yandex/RootCA.crt -Z
Prepare and activate the transfer
-
-
Database type:
Kafka
. -
Endpoint parameters → Connection settings:
-
Connection type:
Managed Service for Apache Kafka cluster
.-
Managed Service for Apache Kafka cluster: Select the source cluster from the list.
-
Authentication:
- Username: Enter the consumer username.
- Password: Enter the consumer password.
-
-
Topic full name: Enter the name of the topic in the Managed Service for Apache Kafka® cluster.
-
(Optional): Advanced settings → Conversion rules:
-
Data format:
JSON
. -
Data scheme:
JSON specification
:Create and upload the
json_schema.json
file in JSON format:json_schema.json
[ { "name": "device_id", "type": "string" }, { "name": "datetime", "type": "datetime" }, { "name": "latitude", "type": "double" }, { "name": "longitude", "type": "double" }, { "name": "altitude", "type": "double" }, { "name": "speed", "type": "double" }, { "name": "battery_voltage", "type": "any" }, { "name": "cabin_temperature", "type": "double" }, { "name": "fuel_level", "type": "any" } ]
-
-
-
-
Create an endpoint for the target and the transfer:
ManuallyTerraform-
-
Database type:
ClickHouse
. -
Endpoint parameters:
-
Connection settings:
-
Connection type:
Managed cluster
.- Managed cluster: Select the source cluster from the list.
-
Database: Enter the database name.
-
User and Password: Enter the name and password of the user who has access to the database (for example, the database owner).
-
-
Advanced settings → Upload data in JSON format: Enable this option if you enabled Conversion rules in the advanced settings of the source endpoint.
-
-
-
Create a transfer of the Replication type that will use the created endpoints.
-
Activate your transfer.
-
In the
data-transfer-mkf-mch.tf
file, uncomment:- The
source_endpoint_id
parameter and assign to it the value of the endpoint ID for the source created in the previous step. - The
yandex_datatransfer_endpoint
andyandex_datatransfer_transfer
resources.
- The
-
Make sure the Terraform configuration files are correct using this command:
terraform validate
If there are any errors in the configuration files, Terraform will point them out.
-
Create the required infrastructure:
-
Run the command to view planned changes:
terraform plan
If the resource configuration descriptions are correct, the terminal will display a list of the resources to modify and their parameters. This is a test step. No resources are updated.
-
If you are happy with the planned changes, apply them:
-
Run the command:
terraform apply
-
Confirm the update of resources.
-
Wait for the operation to complete.
-
Once created, your transfer will be activated automatically.
-
-
Test the transfer
-
Wait for the transfer status to change to Replicating.
-
Make sure the data from the source Managed Service for Apache Kafka® cluster has been moved to the Managed Service for ClickHouse® database:
-
Connect to the cluster using
clickhouse-client
. -
Run the following query:
SELECT * FROM <ClickHouse®_database_name>.<Apache_Kafka_topic_name>
-
-
Change values in the
sample.json
file and send data from it to the Managed Service for Apache Kafka® topic:jq -rc . sample.json | kafkacat -P \ -b <broker_host_FQDN>:9091 \ -t <topic_name> \ -k key \ -X security.protocol=SASL_SSL \ -X sasl.mechanisms=SCRAM-SHA-512 \ -X sasl.username="<username_for_the_producer>" \ -X sasl.password="<user_password_for_the_producer>" \ -X ssl.ca.location=/usr/local/share/ca-certificates/Yandex/RootCA.crt -Z
-
Make sure that the new values are now in the Managed Service for ClickHouse® database:
-
Connect to the cluster using
clickhouse-client
. -
Run the following query:
SELECT * FROM <ClickHouse®_database_name>.<Apache_Kafka_topic_name>
-
Delete the resources you created
Note
Before deleting the created resources, deactivate the transfer.
Some resources are not free of charge. To avoid paying for them, delete the resources you no longer need:
Delete the other resources depending on how they were created:
-
In the terminal window, go to the directory containing the infrastructure plan.
-
Delete the
data-transfer-mkf-mch.tf
configuration file. -
Make sure the Terraform configuration files are correct using this command:
terraform validate
If there are any errors in the configuration files, Terraform will point them out.
-
Confirm updating the resources.
-
Run the command to view planned changes:
terraform plan
If the resource configuration descriptions are correct, the terminal will display a list of the resources to modify and their parameters. This is a test step. No resources are updated.
-
If you are happy with the planned changes, apply them:
-
Run the command:
terraform apply
-
Confirm the update of resources.
-
Wait for the operation to complete.
-
All the resources described in the configuration file
data-transfer-mkf-mch.tf
will be deleted. -
ClickHouse® is a registered trademark of ClickHouse, Inc