3.2.3 Outil de migration de données Sqoop, importation de données, MySQL vers HDFS / Hive, exportation de données, importation incrémentielle de données, travail Sqoop, commandes et paramètres communs

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

MySQL vers HDFS

MySQL vers Hive

Section 2 Exporter les données d'exportation

Section 3 Importation incrémentielle de données

Modifier la capture de données (CDC)

Ajouter façon

Section 4 Exécuter le travail

Partie IV Commandes et paramètres communs

Section 1 Commandes communes

Section 2 Paramètres communs

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


 

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 / bin

source / 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:

  1. Configurer manuellement la dernière valeur à chaque fois, planification manuelle
  2. 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

 

Je suppose que tu aimes

Origine blog.csdn.net/chengh1993/article/details/112060391
conseillé
Classement