Vous pouvez lire et écrire des données dans OSS sur un cluster EMR ClickHouse en utilisant le moteur de table S3 ou une fonction de table S3. Cette rubrique explique comment importer des données depuis OSS vers un cluster ClickHouse et exporter des données du cluster vers OSS.
Prérequis
Vous avez créé un compartiment (bucket) dans OSS. Pour plus d'informations, consultez la page Créer des compartiments.
Vous avez créé un cluster ClickHouse. Pour plus d'informations, consultez la page Créer un cluster ClickHouse.
Importer des données depuis OSS vers ClickHouse
Étape 1 : Créer une table métier
Connectez-vous au cluster ClickHouse via SSH. Pour plus d'informations, consultez la page Se connecter à un cluster.
-
Exécutez la commande suivante pour démarrer le client ClickHouse.
clickhouse-client -h core-1-1 -mRemarqueCet exemple se connecte au nœud
core-1-1. Si votre cluster comporte plusieurs nœuds core, vous pouvez vous connecter à l'un d'entre eux. -
Exécutez les commandes suivantes pour créer la base de données
productet la table métierordersdans la base de donnéesproduct.CREATE DATABASE IF NOT EXISTS product ON CLUSTER cluster_emr; CREATE TABLE IF NOT EXISTS product.orders ON CLUSTER cluster_emr ( `uid` UInt32, `date` DateTime, `skuId` UInt32, `order_revenue` UInt32 ) Engine = ReplicatedMergeTree('/cluster_emr/product/orders/{shard}', '{replica}') PARTITION BY toYYYYMMDD(date) ORDER BY toYYYYMMDD(date); CREATE TABLE IF NOT EXISTS product.orders_all ON CLUSTER cluster_emr ( `uid` UInt32, `date` DateTime, `skuId` UInt32, `order_revenue` UInt32 ) Engine = Distributed(cluster_emr, product, orders, rand());RemarqueE-MapReduce génère automatiquement les macros {shard} et {replica} pour le cluster ClickHouse, que vous pouvez utiliser directement.
Étape 2 : Importer les données
Importation avec le moteur de table S3
Le moteur de table S3 de ClickHouse lit les données dans un format spécifique à partir d'un chemin OSS donné. La syntaxe est la suivante :
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|ALIAS expr1] [compression_codec] [TTL expr1],
name2 [type2] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|ALIAS expr2] [compression_codec] [TTL expr2],
...
)
ENGINE = S3(path, [access_key_id, access_key_secret,] format, [compression]);
|
Paramètre |
Description |
|
db |
Nom de la base de données. |
|
table_name |
Nom de la table. |
|
name1/name2 |
Nom de la colonne. |
|
type1/type2 |
Type de données de la colonne. |
|
path |
Chemin OSS. Pour trouver le point de terminaison interne permettant d'accéder à OSS depuis votre cluster ClickHouse, consultez la page Accéder aux ressources OSS depuis une instance ECS à l'aide d'un point de terminaison interne. Le paramètre path prend en charge deux styles : le style virtual-hosted et le style path-style. Nous vous recommandons d'utiliser le style virtual-hosted. Le paramètre path prend en charge les caractères génériques suivants :
|
|
AccessKey ID |
Votre AccessKey ID Alibaba Cloud. |
|
AccessKey Secret |
Votre AccessKey Secret Alibaba Cloud. |
|
format |
Format de l'objet (fichier) spécifié par le paramètre path. Les exemples incluent CSV et XML. Pour plus d'informations, consultez la page Formats for Input and Output Data. |
|
compression |
Type de compression. Ce paramètre est facultatif. Par défaut, ClickHouse détecte automatiquement le type de compression à partir de l'extension du fichier. Définissez le type de compression en fonction de la version EMR de votre cluster :
|
-
Créez une table pour lire les données depuis OSS.
Téléchargez le fichier de données d'exemple orders.csv et téléversez-le dans le répertoire racine d'un compartiment OSS nommé test.
-
Exécutez la commande suivante pour créer une table OSS utilisant le moteur de table S3.
CREATE DATABASE IF NOT EXISTS oss ON CLUSTER cluster_emr; CREATE TABLE oss.orders_oss ( uid UInt32, date DateTime, skuId UInt32, order_revenue UInt32 ) ENGINE = S3('http://test.oss-cn-beijing-internal.aliyuncs.com/orders.csv', '<access_key_id>', '<access_key_secret>', 'CSV');RemarqueLe chemin de données d'exemple http://test.oss-cn-beijing-internal.aliyuncs.com/orders.csv représente le fichier orders.csv dans un compartiment nommé test dans la région cn-beijing.
-
Exécutez la commande suivante pour importer les données dans la table product.orders_all.
INSERT INTO product.orders_all SELECT uid, date, skuId, order_revenue FROM oss.orders_oss; -
Exécutez les commandes suivantes pour afficher les données dans les tables et vérifier la cohérence des données :
-
Affichez les données de la table orders_all.
SELECT count(1) FROM product.orders_all; -
Affichez les données de la table orders_oss.
SELECT count(1) FROM oss.orders_oss;
-
Importation avec une fonction de table S3
La fonction de table S3 de ClickHouse lit les données à partir d'un chemin OSS spécifié et renvoie une table avec une structure définie. La syntaxe est la suivante :
s3(path, [access_key_id, access_key_secret,] format, structure, [compression])
|
Paramètre |
Description |
|
|
Chemin OSS. Pour trouver le point de terminaison interne permettant d'accéder à OSS depuis votre cluster ClickHouse, consultez la page Accéder aux ressources OSS depuis une instance ECS à l'aide d'un point de terminaison interne. Le paramètre path prend en charge deux styles : le style virtual hosted et le style path. Nous vous recommandons d'utiliser le style virtual hosted. Le paramètre path prend en charge les caractères génériques suivants :
|
|
|
Votre AccessKey ID Alibaba Cloud. |
|
|
Votre AccessKey Secret Alibaba Cloud. |
|
|
Format de l'objet (fichier) spécifié par le paramètre path, tel que CSV et XML. Pour plus d'informations, consultez la page Formats for Input and Output Data. |
|
|
Structure de la table, qui définit les noms des colonnes et les types de données. Exemple : |
|
|
Type de compression. Ce paramètre est facultatif. Par défaut, ClickHouse détecte automatiquement le type de compression à partir de l'extension du fichier. Définissez le type de compression en fonction de la version EMR de votre cluster :
|
-
Utilisez la fonction de table S3 pour importer des données dans le cluster ClickHouse.
INSERT INTO product.orders_all SELECT uid, date, skuId, order_revenue FROM s3('http://test.oss-cn-beijing-internal.aliyuncs.com/orders.csv', '<your-access-key>', '<your-access-secret>', 'CSV', 'uid UInt32, date DateTime, skuId UInt32, order_revenue UInt32'); -
Exécutez les commandes suivantes pour afficher les données dans les tables et vérifier la cohérence des données :
-
Affichez les données de la table orders_all.
SELECT count(1) FROM product.orders_all; -
Affichez les données de la table orders_oss.
SELECT count(1) FROM oss.orders_oss;
-
Exporter des données depuis ClickHouse vers OSS
Étape 1 : Créer une table métier
La table métier destinée à l'exportation des données utilise le même schéma que celle utilisée pour l'importation. Pour créer la table, consultez l'étape Étape 1 : Créer une table métier.
Étape 2 : Préparer les données
-
Pour préparer les données à exporter, exécutez la commande suivante afin de les insérer dans la table métier product.orders_all.
INSERT INTO product.orders_all VALUES (60333391,'2021-08-04 11:26:01',49358700,89) (38826285,'2021-08-03 10:47:29',25166907,27) (10793515,'2021-07-31 02:10:31',95584454,68) (70246093,'2021-08-01 00:00:08',82355887,97) (70149691,'2021-08-02 12:35:45',68748652,1) (87307646,'2021-08-03 19:45:23',16898681,71) (61694574,'2021-08-04 23:23:32',79494853,35) (61337789,'2021-08-02 07:10:42',23792355,55) (66879038,'2021-08-01 16:13:19',95820038,89); -
(Facultatif) Configurez le mode d'exportation. Pour les versions EMR-5.8.0 et ultérieures ou EMR-3.45.0 et ultérieures, vous pouvez configurer le mode d'écriture pour gérer les cas où un fichier existe déjà au chemin spécifié.
Exportation incrémentielle
Si le fichier existe déjà, ClickHouse crée un nouveau fichier dans le même répertoire et y écrit les données.
set s3_create_new_file_on_insert=1Exportation par écrasement
Si le fichier existe déjà, ClickHouse écrase les données existantes. Utilisez ce paramètre avec précaution.
set s3_truncate_on_insert=1
Étape 3 : Exporter les données
Exportation avec le moteur de table S3
-
Exécutez la commande suivante pour créer une table S3.
CREATE TABLE oss.orders_oss ( uid UInt32, date DateTime, skuId UInt32, order_revenue UInt32 ) ENGINE = S3('http://test.oss-cn-beijing-internal.aliyuncs.com/orders.csv', '<access_key_id>', '<access_key_secret>', 'CSV'); -
Exécutez la commande suivante pour écrire les données dans la table.
-- Assume the business table is product.orders_all INSERT INTO oss.orders_oss SELECT uid, date, skuId, order_revenue FROM product.orders_all;RemarqueLorsque ClickHouse exporte des données, il crée un fichier au chemin spécifié et y écrit les données. Par défaut, l'exportation échoue si le fichier existe déjà. Sur les versions EMR-5.8.0, EMR-3.45.0 et ultérieures, vous pouvez configurer les paramètres pour modifier ce comportement.
Consultez les données dans la console OSS.
Exportation avec une fonction de table S3
-
Exécutez la commande suivante pour exporter les données.
INSERT INTO FUNCTION s3('http://test.oss-cn-beijing-internal.aliyuncs.com/orders.csv', '<your-access-key>', '<your-access-secret>', 'CSV', 'uid UInt32, date DateTime, skuId UInt32, order_revenue UInt32') SELECT uid, date, skuId, order_revenue FROM product.orders_all;RemarqueLorsque ClickHouse exporte des données, il crée un fichier au chemin spécifié et y écrit les données. Par défaut, l'exportation échoue si le fichier existe déjà. Sur les versions EMR-5.8.0, EMR-3.45.0 et ultérieures, vous pouvez configurer les paramètres pour modifier ce comportement.
Consultez les données dans la console OSS.
Configurations liées à OSS
Profil
-
Profils pris en charge
Lors de l'utilisation du téléversement multipartie vers OSS, le paramètre
s3_min_upload_part_sizedéfinit la taille minimale de chaque partie, avec une valeur par défaut de 512 Mo. La valeur doit être un entier UInt64. -
Méthodes de configuration
-
Pour une seule instruction SQL, configurez le paramètre comme suit :
INSERT INTO OSS_TABLE SELECT ... FROM ... SETTINGS s3_min_upload_part_size=1073741824; -
Pour une seule session, configurez le paramètre comme suit :
SET s3_min_upload_part_size=1073741824; INSERT INTO OSS_TABLE SELECT ... FROM ... ; -
Pour une table spécifique, configurez le paramètre comme suit :
CREATE TABLE OSS_TABLE ( ... ) ENGINE = s3(...) SETTINGS s3_min_upload_part_size=1073741824; -
Pour un utilisateur spécifique, configurez le paramètre comme suit :
Sur la page Configure du service ClickHouse dans la console EMR, cliquez sur l'onglet server-users. Ajoutez le paramètre users.<YourUserName>.s3_min_upload_part_size et définissez sa valeur sur 1073741824.
-
Configuration
ClickHouse sur EMR prend en charge les paramètres de configuration OSS suivants. Par exemple :
<s3>
<endpoint-name>
<endpoint>https://oss-cn-beijing-internal.aliyuncs.com/bucket</endpoint>
<access_key_id>ACCESS_KEY_ID</access_key_id>
<secret_access_key>ACCESS_KEY_SECRET</secret_access_key>
</endpoint-name>
</s3>
Le tableau suivant décrit les paramètres.
|
Paramètre |
Description |
|
endpoint-name |
Nom du point de terminaison. |
|
endpoint |
Nom de domaine utilisé pour accéder à OSS. Pour plus d'informations, consultez la page Noms de domaine OSS. |
|
access_key_id |
Votre AccessKey ID Alibaba Cloud. |
|
secret_access_key |
Votre AccessKey Secret Alibaba Cloud. |
Sur la page Configure du service ClickHouse dans la console EMR, vous pouvez également cliquer sur l'onglet server-config pour ajouter des configurations personnalisées de deux manières.
|
Méthode |
Actions |
|
Méthode 1 |
Ajoutez les paramètres oss.<endpoint-name>.endpoint, oss.<endpoint-name>.access_key_id et oss.<endpoint-name>.secret_access_key ainsi que leurs valeurs correspondantes. Remarque
Remplacez |
|
Méthode 2 |
Ajoutez un paramètre nommé oss et définissez sa valeur sur la configuration suivante.
Remarque
Remplacez les valeurs d'espace réservé par les vôtres. |
Une fois la configuration terminée, vous pouvez créer une table OSS ou utiliser une fonction de table S3 avec la syntaxe simplifiée suivante :
-
Table OSS
CREATE TABLE OSS_TABLE ( column1 UInt32, column2 String ... ) ENGINE = S3(path, format, [compression]); -
Fonction de table S3
s3(path, format, structure, [compression]);