table des matières
Outil de migration de données - Sqoop
La première partie de la présentation de Sqoop
La deuxième partie de l'installation et de la configuration
Cas d'application de la troisième partie
Section 1 Importer l'importation de données
Section 2 Exporter les données d'exportation
Section 3 Importation incrémentielle de données
Modifier la capture de données (CDC)
Partie IV Commandes et paramètres communs
Connexion à la base de données des paramètres communs
Outil de migration de données - Sqoop
La première partie de la présentation de Sqoop
Sqoop est un outil open source principalement utilisé pour transférer des données entre Hadoop (Hive) et des bases de données traditionnelles (mysql, postgresql, etc.). Vous pouvez importer des données de bases de données relationnelles (MySQL, Oracle, Postgres, etc.) dans HDFS, et vous pouvez également importer des données de HDFS dans des bases de données relationnelles.
Le projet Sqoop a débuté en 2009. Il a d'abord existé en tant que module tiers de Hadoop. Plus tard, afin de permettre aux utilisateurs de se déployer rapidement et de permettre aux développeurs de se développer de manière itérative plus rapidement, Sqoop est devenu indépendamment un projet Apache.
La deuxième partie de l'installation et de la configuration
Site officiel de Sqoop: http://sqoop.apache.org/
Adresse de téléchargement de Sqoop: http://www.apache.org/dyn/closer.lua/sqoop/
1. Téléchargez, téléchargez et décompressez
Téléchargez le package d'installation téléchargé sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz sur la machine virtuelle, décompressez le package;
tar zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
mv sqoop-1.4.7.bin__hadoop-2.6.0 / ../servers/sqoop-1.4.7/
2. Augmenter les variables d'environnement et les rendre efficaces
vi / etc / profile
# Ajoutez l'
export de contenu suivant SQOOP_HOME = / opt / lagou / servers / sqoop-1.4.7
export PATH = $ PATH: $ SQOOP_HOME / binsource / etc / profile
3. Créer et modifier les fichiers de configuration
# Emplacement du fichier de configuration $ SQOOP_HOME / conf; le fichier de configuration à modifier est sqoop-env.sh
cp sqoop-env-template.sh sqoop-env.sh
vi sqoop-env.sh# Ajouter le contenu suivant à la fin du fichier
export HADOOP_COMMON_HOME = / opt / lagou / servers / hadoop-2.9.2
export HADOOP_MAPRED_HOME = / opt / lagou / servers / hadoop-2.9.2
export HIVE_HOME = / opt / lagou / servers /hive-2.3 .7
4. Copiez le pilote JDBC
# Copiez le pilote jdbc dans le répertoire lib de sqoop (note: un lien souple peut également être établi)
ln -s /opt/lagou/servers/hive-2.3.7/lib/mysql-connector-java-5.1.46.jar / opt /lagou/servers/sqoop-1.4.7/lib/
5. Copiez jar Copiez
hive-common-2.3.7.jar sous $ HIVE_HOME / lib dans le répertoire $ SQOOP_HOME / lib. Si vous ne copiez pas les données de MySQL vers Hive, une erreur se produira: ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
# Une copie papier et un lien logiciel peuvent être établis, choisissez-en un à exécuter. Ce qui suit est une copie papier
cp $ HIVE_HOME / lib / hive-common-2.3.7.jar $ SQOOP_HOME / lib /# Etablir un lien
logiciel ln -s /opt/lagou/servers/hive-2.3.7/lib/hive-common-2.3.7.jar /opt/lagou/servers/sqoop-1.4.7/lib/hive-common - 2.3.7.jar
Copiez $ HADOOP_HOME / share / hadoop / tools / lib / json-20170516.jar dans le répertoire $ SQOOP_HOME / lib /; sinon, lors de la création d'un travail sqoop, il indiquera: java.lang.NoClassDefFoundError: org / json / JSONObject
cp $ HADOOP_HOME / share / hadoop / tools / lib / json-20170516.jar $ SQOOP_HOME / lib /
6. Vérification de l'installation
[root @ linux123 ~] # version sqoop
...
Omettre l'avertissement
...
20/06/19 10:37:24 INFO sqoop.Sqoop: Exécution de la version Sqoop: 1.4.7
Sqoop 1.4.7
git commit id 2328971411f57f0cb683dfb79d19d4d19d185dd8
Compilé par maugli le jeudi 21 décembre 15:59:58 STD 2017
# Testez si Sqoop peut se connecter avec succès à la base de données
[root @ linux123 ~] # sqoop list-databases --connect jdbc: mysql: // linux123: 3306 /? UseSSL = false --username hive --password 12345678
Attention: ...
Omettre l'avertissement
...
information_schema
hivemetadata
mysql
performance_schema
sys
Cas d'application de la troisième partie
Dans Sqoop
- L'importation concerne: le transfert de données de bases de données relationnelles vers des grappes de Big Data (HDFS, HIVE, HBASE); utiliser le mot-clé import;
- L'exportation fait référence à: transférer des données d'un cluster Big Data vers une base de données relationnelle, utiliser le mot-clé export;
Script de données de test
-- 用于在 Mysql 中生成测试数据
CREATE DATABASE sqoop;
use sqoop;
CREATE TABLE sqoop.goodtbl(
gname varchar(50),
serialNumber int,
price int,
stock_number int,
create_time date);
DROP FUNCTION IF EXISTS `rand_string`;
DROP PROCEDURE IF EXISTS `batchInsertTestData`;
-- 替换语句默认的执行符号,将;替换成 //
DELIMITER //
CREATE FUNCTION `rand_string` (n INT) RETURNS VARCHAR(255)
CHARSET 'utf8'
BEGIN
DECLARE char_str VARCHAR(200) DEFAULT '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
DECLARE return_str VARCHAR(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < n DO
SET return_str = CONCAT(return_str, SUBSTRING(char_str, FLOOR(1 + RAND()*36), 1));
SET i = i+1;
END WHILE;
RETURN return_str;
END
//
-- 第一个参数表示:序号从几开始;第二个参数表示:插入多少条记录
CREATE PROCEDURE `batchInsertTestData` (m INT, n INT)
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i < n DO
INSERT INTO goodtbl (gname, serialNumber, price, stock_number, create_time)
VALUES (rand_string(6), i+m, ROUND(RAND()*100), FLOOR(RAND()*100), NOW());
SET i = i+1;
END WHILE;
END
//
DELIMITER ;
call batchInsertTestData(1, 100);
Section 1 Importer l'importation de données
MySQL vers HDFS
1. Importez toutes les données
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--table goodtbl \
--target-dir /root/lagou \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"
Remarques:
- target-dir: le chemin pour importer les données dans HDFS;
- delete-target-dir: si le dossier cible existe déjà sur HDFS, une erreur sera signalée lorsque vous l'exécuterez à nouveau. Vous pouvez utiliser --delete-target-dir pour supprimer le répertoire en premier. Vous pouvez également utiliser le paramètre append pour indiquer des données supplémentaires;
- num-mappers: combien de tâches de mappage sont lancées; 4 tâches de mappage sont lancées par défaut; il peut également être écrit sous la forme -m 1
- champs terminés par: séparateur de données dans le fichier HDFS;
2. Importez les données de la requête
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou \
--append \
-m 1 \
--fields-terminated-by "\t" \
--query 'select gname, serialNumber, price, stock_number,
create_time from goodtbl where price>88 and $CONDITIONS order by price;'
Remarques:
- La clause where de l'instruction de requête doit contenir '$ CONDITIONS'
- Si des guillemets doubles sont utilisés après la requête, un caractère de transfert doit être ajouté avant $ CONDITIONS pour empêcher le shell d'identifier ses propres variables
3. Importez la colonne spécifiée
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns gname,serialNumber,price \
--table goodtbl
Remarques: Si plusieurs colonnes sont impliquées dans les colonnes, séparez-les par des virgules et n'ajoutez pas d'espaces
4. Importez les données de la requête (utilisez des mots clés)
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou \
--delete-target-dir \
-m 1 \
--fields-terminated-by "\t" \
--table goodtbl \
--where "price>=68"
5. Démarrez plusieurs
tâches de mappage pour importer des données Ajoutez des données à goodtbl: appelez batchInsertTestData (1000000);
# 给 goodtbl 表增加主键
alter table goodtbl add primary key(serialNumber);
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou/sqoop/5 \
--append \
--fields-terminated-by "\t" \
--table goodtbl \
--split-by serialNumber
sqoop import \
-Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou/sqoop/5 \
--delete-target-dir \
--fields-terminated-by "\t" \
--table goodtbl \
--split-by gname
Remarque:
lorsque vous utilisez plusieurs tâches de mappage pour l'importation de données, sqoop doit partitionner les données de chaque tâche
- Si la table dans MySQL a une clé primaire, spécifiez simplement le nombre de tâches de mappage
- Si la table dans MySQL a une clé primaire, utilisez split-by pour spécifier le champ de partition
- Si le champ de partition est de type caractère, ajoutez-le lors de l'utilisation de la commande sqoop: -Dorg.apache.sqoop.splitter.allow_text_splitter = true. lequel est
sqoop import -
Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:mysql://liunx:3306/sqoop \
... ...
- Le '$ CONDITIONS' dans la clause where de l'instruction de requête est également utilisé pour le partitionnement des données, même s'il n'y a qu'une seule tâche de mappage
MySQL vers Hive
Créez une table dans la ruche:
CREATE TABLE mydb.goodtbl(
gname string,
serialNumber int,
price int,
stock_number int,
create_time date);
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--table goodtbl \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table mydb.goodtbl \
-m 1
Description du paramètre:
- importation de ruche. Paramètre obligatoire, spécifiez la ruche d'importation
- base de données de la ruche. Nom de la bibliothèque Hive (valeur par défaut par défaut)
- table-ruche。Ruche 表 名
- champs terminés par. Séparateur de champ Hive
- ruche-écrasement. Écraser les données existantes
- create-hive-table. La table ruche est créée, mais il peut y avoir des erreurs dans la table. Il n'est pas recommandé d'utiliser ce paramètre, il est recommandé de construire la table à l'avance
Section 2 Exporter les données d'exportation
Entrez dans la plateforme Big Data à importer: import
Quitter l'exportation de la plate-forme Big Data: exporter
Remarque: les tables MySQL doivent être créées à l'avance
-- 提前创建表
CREATE TABLE sqoop.goodtbl2(
gname varchar(50),
serialNumber int,
price int,
stock_number int,
create_time date);
ruche mydb.goodtbl → MySQL sqoop.goodtbl2
sqoop export \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--table goodtbl2 \
-m 4 \
--export-dir /user/hive/warehouse/mydb.db/goodtbl \
--input-fields-terminated-by "\t"
Section 3 Importation incrémentielle de données
Modifier la capture de données (CDC)
Toutes les importations de données précédentes ont été effectuées. Si la quantité de données est faible, l'extraction complète des données source est adoptée; si la quantité de données source est importante, les données modifiées doivent être extraites. Ce mode d'extraction de données est appelé capture de données modifiées ou CDC (Change Data Capture) pour court.
Le CDC est grossièrement divisé en deux types: invasif et non invasif. Intrusif fait référence à l'impact sur les performances des opérations CDC sur le système source. Tant que les opérations CDC effectuent des opérations SQL sur la base de données source de quelque manière que ce soit, cela est considéré comme intrusif.
Les quatre méthodes CDC couramment utilisées sont (les trois premières sont invasives):
CDC basé sur l'horodatage. Le processus d'extraction peut déterminer quelles données sont incrémentielles en fonction de certaines colonnes d'attributs. Les colonnes d'attributs les plus courantes sont les suivantes:
- Horodatage: il est préférable d'avoir deux colonnes, un horodatage d'insertion, qui indique quand il a été créé, et un horodatage de mise à jour, qui indique l'heure de la dernière mise à jour;
- Séquence: la plupart des bases de données fournissent une fonction d'auto-incrémentation, la colonne de la table est définie comme auto-incrémentée, il est facile d'identifier les données nouvellement insérées en fonction de la colonne;
Cette méthode est la plus simple et la plus couramment utilisée, mais elle présente les inconvénients suivants:
- Impossible d'enregistrer l'opération de suppression d'enregistrement
- Plusieurs mises à jour non reconnues
- Aucune capacité en temps réel
CDC basé sur les déclencheurs. Lorsque des instructions SQL telles que INSERT, UPDATE et DELETE sont exécutées, les déclencheurs de la base de données sont activés. Les déclencheurs peuvent être utilisés pour capturer les données modifiées et enregistrer les données dans la table temporaire intermédiaire. Ensuite, ces données modifiées sont extraites de la table temporaire. Dans la plupart des cas, il n'est pas permis d'ajouter des déclencheurs à une base de données opérationnelle, et cette méthode réduira les performances du système et ne sera pas adoptée;
CDC basé sur des instantanés. Les modifications de données peuvent être obtenues en comparant la table source et la table de snapshot. Le CDC basé sur des instantanés peut détecter les données insérées, mises à jour et supprimées, ce qui est un avantage par rapport au schéma CDC basé sur l'horodatage. L'inconvénient est qu'il faut beaucoup d'espace de stockage pour enregistrer l'instantané.
CDC basé sur le journal. La méthode CDC la plus complexe et non invasive est la méthode basée sur le journal. La base de données enregistrera chaque opération d'insertion, de mise à jour et de suppression dans le journal. En analysant le fichier journal, vous pouvez obtenir des informations pertinentes. Le format du journal de chaque base de données relationnelle est incohérent et il n'existe pas de produit universel. Le canal d'Alibaba peut compléter l'analyse des fichiers journaux MySQL.
Il existe deux façons d'importer des données de manière incrémentielle:
- Importation incrémentielle de données basée sur des colonnes incrémentielles (méthode Append)
- Importation incrémentielle de données basée sur la colonne de temps (méthode LastModified)
Ajouter façon
1. Préparez les données initiales
-- 删除 MySQL 表中的全部数据
truncate table sqoop.goodtbl;
-- 删除 Hive 表中的全部数据
truncate table mydb.goodtbl;
-- 向MySQL的表中插入100条数据
call batchInsertTestData(1, 100);
2. Importez des données dans Hive
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive --password 12345678 \
--table goodtbl \
--incremental append \
--hive-import \
--fields-terminated-by "\t" \
--hive-table mydb.goodtbl \
--check-column serialNumber \
--last-value 0 \
-m 1
Description du paramètre:
- check-column est utilisé pour spécifier certaines colonnes (c'est-à-dire que vous pouvez spécifier plusieurs colonnes). Ces colonnes sont utilisées pour vérifier si les données sont importées en tant que données incrémentielles lors de l'importation incrémentielle, ce qui est similaire aux champs à incrémentation automatique et aux horodatages en relation bases de données. Le type de ces colonnes spécifiées ne peut être aucun type de caractère, tel que char, varchar, etc.
- last-value spécifie la valeur maximale du champ spécifié dans la colonne de contrôle lors de la dernière importation
3. Vérifiez s'il y a des données dans la table de la ruche et combien de données s'y trouvent
4. Ajoutez 1000 données supplémentaires à MySQL, le nombre commence à 200
call batchInsertTestData(200, 1000);
5. Effectuez à nouveau une importation incrémentielle pour importer les données de MySQL dans Hive; à ce stade, remplacez la dernière valeur par 100
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive --password 12345678 \
--table goodtbl \
--incremental append \
--hive-import \
--fields-terminated-by "\t" \
--hive-table mydb.goodtbl \
--check-column serialNumber \
--last-value 100 \
-m 1
6. Vérifiez s'il y a des données dans la table de la ruche et combien de données il y a
Section 4 Exécuter le travail
Il existe deux façons d'implémenter l'importation incrémentielle de données:
- Configurer manuellement la dernière valeur à chaque fois, planification manuelle
- En utilisant le travail, étant donné la dernière valeur initiale, les tâches chronométrées sont planifiées régulièrement tous les jours
Evidemment, la méthode 2 est plus simple.
1. Créez un fichier de mot de passe
echo -n "12345678" > sqoopPWD.pwd
hdfs dfs -mkdir -p /sqoop/pwd
hdfs dfs -put sqoopPWD.pwd /sqoop/pwd
hdfs dfs -chmod 400 /sqoop/pwd/sqoopPWD.pwd
# 可以在 sqoop 的 job 中增加:
--password-file /sqoop/pwd/sqoopPWD.pwd
2. Créer une tâche sqoop
# 创建 sqoop job
sqoop job --create myjob1 -- import \
--connect jdbc:mysql://linux123:3306/sqoop?useSSL=false \
--username hive \
--password-file /sqoop/pwd/sqoopPWD.pwd \
--table goodtbl \
--incremental append \
--hive-import \
--hive-table mydb.goodtbl \
--check-column serialNumber \
--last-value 0 \
-m 1
# 查看已创建的job
sqoop job --list
# 查看job详细运行时参数
sqoop job --show myjob1
# 执行job
sqoop job --exec myjob1
# 删除job
sqoop job --delete myjob1
3. Exécuter le travail
sqoop job -exec myjob1
4. Afficher les données
Principe de mise en œuvre: une
fois le travail exécuté, la valeur maximale de la colonne de contrôle actuelle sera enregistrée dans la méta, et cette valeur sera affectée à la dernière valeur lors du prochain appel du travail.
Par défaut, les métadonnées sont enregistrées dans ~ / .sqoop /
Parmi eux, le fichier metastore.db.script enregistre l'opération de mise à jour à la dernière valeur:
cat metastore.db.script |grep incremental.last.value
Partie IV Commandes et paramètres communs
Section 1 Commandes communes
Section 2 Paramètres communs
Les paramètres dits publics sont les paramètres pris en charge par la plupart des commandes.
Connexion à la base de données des paramètres communs
Paramètres communs - import
Paramètres communs - export
Paramètres communs - ruche
paramètre d'importation
paramètres d'exportation