• sqoop ETL工具


    目录

    概述

    1、sqoop的安装

    2、sqoop的使用 

    3、MySQL数据导入到HDFS中 

    1、不指定HDFS目录导入

    2、指定HDFS目录导入 

    3、导入到HDFS指定目录,并指定字段之间的分隔符

    4、--where,通过条件过滤MySQL,再导入hdfs

     5、通过SQL过滤导入到HDFS中

    6、MySQL增量数据的导入到HDFS中

    第一种增量导入使用上面的选项来实现

    第二种、增量导入通过--where条件来实现

    7、HDFS中数据导入到MYSQL中 

     4、MySQL数据导入到hive中

    1、导入到hive指定表(自己建表)

    ​编辑

     2、hive不创建表,sqoop自动创建

     5、MySQL中的数据导入到hbase中

    1、MySQL中的数据导入到hbase

     2、hbase中的数据导出到MySQL


    概述

    - Sqoop是apache旗下的一款 ”Hadoop和关系数据库之间传输数据”的工具

      导入数据:将MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统

      导出数据:从Hadoop的文件系统中导出数据到关系数据库(mysql中)

    1、sqoop的安装

    sqoop安装包

    1、上传并解压

    • 将我们下载好的安装包上传到==node03==服务器的/kkb/soft路径下,然后进行解压

    cd /kkb/soft/


    tar -zxf sqoop-1.4.6-cdh5.14.2.tar.gz -C /kkb/install/ 

    2、修改配置文件

    • 更改sqoop的配置文件

     cd /kkb/install/sqoop-1.4.6-cdh5.14.2/conf


    mv sqoop-env-template.sh sqoop-env.sh


    vim sqoop-env.sh

    #Set path to where bin/hadoop is available
    export HADOOP_COMMON_HOME=/kkb/install/hadoop-2.6.0-cdh5.14.2

    #Set path to where hadoop-*-core.jar is available
    export HADOOP_MAPRED_HOME=/kkb/install/hadoop-2.6.0-cdh5.14.2

    #set the path to where bin/hbase is available
    export HBASE_HOME=/kkb/install/hbase-1.2.0-cdh5.14.2

    #Set the path to where bin/hive is available
    export HIVE_HOME=/kkb/install/hive-1.1.0-cdh5.14.2

    3、sqoop需要两个额外依赖的jar包,将资料当中两个jar包添加到sqoop的lib目录下

    4、配置sqoop的环境变量

    sudo vim /etc/profile

    export SQOOP_HOME=/kkb/install/sqoop-1.4.6-cdh5.14.2


    export PATH=:$SQOOP_HOME/bin:$PATH 

    source /etc/profile 

    5、因为要涉及hive数据导入导出,所以要引入hive的lib下面的包 

    将我们mysql表当中的数据直接导入到hive表中的话,我们需要将hive的一个叫做hive-exec-1.1.0-cdh5.14.0.jar的jar包拷贝到sqoop的lib目录下

    cp /kkb/install/hive-1.1.0-cdh5.14.2/lib/hive-exec-1.1.0-cdh5.14.2.jar /kkb/install/sqoop-1.4.6-cdh5.14.2/lib/

    cp /kkb/install/hive-1.1.0-cdh5.14.2/lib/hive-shims*  /kkb/install/sqoop-1.4.6-cdh5.14.2/lib/

    2、sqoop的使用 

    1、查看sqoop帮助文档

    sqoop list-databases --help

    2、查看MySQL中所有的数据库

    sqoop list-databases --connect jdbc:mysql://node03:3306/ --username root --password 123456 

     

     3、查看hive数据库下面所有的表

    sqoop list-tables --connect jdbc:mysql://node03:3306/hive --username root --password 123456

    准备表数据

    • 在mysql中有一个库userdb中三个表:emp, emp_add和emp_conn

    • 表emp:

    idnamedegsalarydept
    1201gopalmanager50,000TP
    1202manishaProof reader50,000TP
    1203khalilphp dev30,000AC
    1204prasanthphp dev30,000AC
    1205kranthiadmin20,000TP
    • 表emp_add:

    idhnostreetcity
    1201288Avgirijublee
    1202108Iaocsec-bad
    1203144Zpguttahyd
    120478Bold citysec-bad
    1205720Xhitecsec-bad
    • 表emp_conn:

    idphnoemail
    12012356742gopal@tp.com
    12021661663manisha@tp.com
    12038887776khalil@ac.com
    12049988774prasanth@ac.com
    12051231231kranthi@tp.com
    • 建表,并插入数据的语句如下:

     

    CREATE DATABASE /*!32312 IF NOT EXISTS*/`userdb` /*!40100 DEFAULT CHARACTER SET utf8 */;

    USE `userdb`;

    DROP TABLE IF EXISTS `emp`;

    CREATE TABLE `emp` (
      `id` INT(11) DEFAULT NULL,
      `name` VARCHAR(100) DEFAULT NULL,
      `deg` VARCHAR(100) DEFAULT NULL,
      `salary` INT(11) DEFAULT NULL,
      `dept` VARCHAR(10) DEFAULT NULL,
      `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `is_delete` BIGINT(20) DEFAULT '1'
    ) ENGINE=INNODB DEFAULT CHARSET=latin1;

    INSERT  INTO `emp`(`id`,`name`,`deg`,`salary`,`dept`) VALUES (1201,'gopal','manager',50000,'TP'),(1202,'manisha','Proof reader',50000,'TP'),(1203,'khalil','php dev',30000,'AC'),(1204,'prasanth','php dev',30000,'AC'),(1205,'kranthi','admin',20000,'TP');

    DROP TABLE IF EXISTS `emp_add`;

    CREATE TABLE `emp_add` (
      `id` INT(11) DEFAULT NULL,
      `hno` VARCHAR(100) DEFAULT NULL,
      `street` VARCHAR(100) DEFAULT NULL,
      `city` VARCHAR(100) DEFAULT NULL,
      `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `is_delete` BIGINT(20) DEFAULT '1'
    ) ENGINE=INNODB DEFAULT CHARSET=latin1;

    INSERT  INTO `emp_add`(`id`,`hno`,`street`,`city`) VALUES (1201,'288A','vgiri','jublee'),(1202,'108I','aoc','sec-bad'),(1203,'144Z','pgutta','hyd'),(1204,'78B','old city','sec-bad'),(1205,'720X','hitec','sec-bad');

    DROP TABLE IF EXISTS `emp_conn`;
    CREATE TABLE `emp_conn` (
      `id` INT(100) DEFAULT NULL,
      `phno` VARCHAR(100) DEFAULT NULL,
      `email` VARCHAR(100) DEFAULT NULL,
      `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `is_delete` BIGINT(20) DEFAULT '1'
    ) ENGINE=INNODB DEFAULT CHARSET=latin1;

    INSERT  INTO `emp_conn`(`id`,`phno`,`email`) VALUES (1201,'2356742','gopal@tp.com'),(1202,'1661663','manisha@tp.com'),(1203,'8887776','khalil@ac.com'),(1204,'9988774','prasanth@ac.com'),(1205,'1231231','kranthi@tp.com');

    3、MySQL数据导入到HDFS中 

    1、不指定HDFS目录导入

    • 使用sqoop命令导入、导出数据前,要先启动hadoop集群

    • 下面的命令用于从MySQL数据库服务器中的emp表导入HDFS。

    sqoop import --connect jdbc:mysql://node03:3306/userdb --password 123456 --username root --table emp --m 1 

    hdfs dfs -ls /user/root/emp 

    2、指定HDFS目录导入 

    • 在导入表数据到HDFS使用Sqoop导入工具,我们可以指定目标目录。

    • 使用参数 --target-dir来指定导出目的地,

    • 使用参数--delete-target-dir来判断导出目录是否存在,如果存在就删掉

    sqoop import --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --delete-target-dir --table emp --target-dir /sqoop/emp --m 1

     

    查看数据 

    hdfs dfs -text /sqoop/emp/part-m-00000 

     它会用逗号(,)分隔emp_add表的数据和字段。

    3、导入到HDFS指定目录,并指定字段之间的分隔符

    指定分隔符

     --fields-terminated-by '\t'

    sqoop import --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --delete-target-dir --table emp --target-dir /sqoop/emp2 --m 1 --fields-terminated-by '\t' 

    查看导出的数据

    hdfs dfs -text /sqoop/emp2/part-m-00000 

     

    4、--where,通过条件过滤MySQL,再导入hdfs

    • 我们可以导入表的使用Sqoop导入工具,"where"子句的一个子集。它执行在各自的数据库服务器相应的SQL查询,并将结果存储在HDFS的目标目录。

    • where子句的语法如下。

    --where  

    按照条件进行查找,通过--where参数来查找表emp_add当中city字段的值为sec-bad的所有数据导入到hdfs上面去

    sqoop import \
    --connect jdbc:mysql://node03:3306/userdb \
    --username root --password 123456 --table emp_add \
    --target-dir /sqoop/emp_add -m 1 --delete-target-dir \
    --where "city = 'sec-bad'"

    查看导出的数据 

     hdfs dfs -text /sqoop/emp_add/part-m-00000

     

     5、通过SQL过滤导入到HDFS中

    我们还可以通过 –query参数来指定我们的sql语句,通过sql语句来过滤我们的数据进行导入

    sqoop import \
    --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 \
    --delete-target-dir -m 1 \
    --query 'select phno from emp_conn where 1=1 and  $CONDITIONS' \
    --target-dir /sqoop/emp_conn

     hdfs dfs -text /sqoop/emp_conn/part*

    注意:

    使用sql语句来进行查找是不能加参数--table

    并且必须要添加where条件,

    并且where条件后面必须带一个$CONDITIONS 这个字符串,

    并且这个sql语句必须用单引号,不能用双引号

     

    6、MySQL增量数据的导入到HDFS中

    • 在实际工作当中,数据的导入,很多时候都是只需要导入增量数据即可,并不需要将表中的数据全部导入到hive或者hdfs当中去,肯定会出现重复的数据的状况,所以我们一般都是选用一些字段进行增量的导入,为了支持增量的导入,sqoop也给我们考虑到了这种情况并且支持增量的导入数据

    • 增量导入是仅导入新添加的表中的行的技术。

    • 它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入。

    • 下面的语法用于Sqoop导入命令增量选项。

     --incremental  


    --check-column  


    --last value  

    第一种增量导入使用上面的选项来实现

    • 导入emp表当中id大于1202的所有数据

    • 注意:增量导入的时候,一定不能加参数--delete-target-dir否则会报错

    sqoop import \
    --connect jdbc:mysql://node03:3306/userdb \
    --username root \
    --password 123456 \
    --table emp \
    --incremental append \
    --check-column id \
    --last-value 1202 \
    -m 1 \
    --target-dir /sqoop/increment
    • 查看数据内容

    hdfs dfs -text /sqoop/increment/part*

     

    第二种、增量导入通过--where条件来实现

    • 或者我们使用--where来进行控制数据的选取会更加精准

    sqoop import \
    --connect jdbc:mysql://node03:3306/userdb \
    --username root \
    --password 123456 \
    --table emp \
    --incremental append \
    --where "create_time > '2018-06-17 00:00:00' and is_delete='1' and create_time < '2018-06-17 23:59:59'" \
    --target-dir /sqoop/incement4\
    --check-column id \
    --m 1 

     

    7、HDFS中数据导入到MYSQL中 

    sqoop export 为导出 导出到MySQL

    sqoop import为导入,MySQL中导入

      sqoop export \
    --connect jdbc:mysql://node03:3306/userdb \
    --username root --password 123456 \
    --table emp_out \
    --export-dir /sqoop/emp \
    --input-fields-terminated-by "," 

    导入前

     导入后

     

     

     

     

     4、MySQL数据导入到hive中

    1、导入到hive指定表(自己建表)

    1、在hive中创建一个emp_hive表,

    hive (default)> create database sqooptohive;
    hive (default)> use sqooptohive;
    hive (sqooptohive)> create external table emp_hive(id int,name string,deg string,salary int ,dept string) row format delimited fields terminated by '\001';

     2、MySQL导出数据到emp_hive表中

    sqoop import --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --table emp --fields-terminated-by '\001' --hive-import --hive-table sqooptohive.emp_hive --hive-overwrite --delete-target-dir --m 1

    3、在hive中查看数据 

    select * from emp_hive;

     2、hive不创建表,sqoop自动创建

    但是要指定hive数据库,这样自动创建的表,hive创建用的表名称与MySQL的一致

    --hive-database sqooptohive;

    完整语句如下 

    sqoop import --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --table emp_conn --hive-import -m 1 --hive-database sqooptohive;

     

     5、MySQL中的数据导入到hbase中

    1、MySQL中的数据导入到hbase

    1、MySQL中创建展示数据

    CREATE DATABASE IF NOT EXISTS library;
    USE library;
    CREATE TABLE book(
    id INT(4) PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    NAME VARCHAR(255) NOT NULL, 
    price VARCHAR(255) NOT NULL);

    INSERT INTO book(NAME, price) VALUES('Lie Sporting', '30'); 
    INSERT INTO book (NAME, price) VALUES('Pride & Prejudice', '70'); 
    INSERT INTO book (NAME, price) VALUES('Fall of Giants', '50');  

    2、执行以下命令,将mysql表当中的数据导入到HBase当中去  

    指定hbase中的行键rowkey,列族column-family等

    sqoop import \
    --connect jdbc:mysql://node03:3306/library \
    --username root \
    --password 123456 \
    --table book \
    --columns "id,name,price" \
    --column-family "info" \
    --hbase-create-table \
    --hbase-row-key "id" \
    --hbase-table "hbase_book" \
    --num-mappers 1 \
    --split-by id

    scan 'hbase_book' 

     

     2、hbase中的数据导出到MySQL

    sqoop不支持我们直接将HBase当中的数据导出,所以我们可以通过以下的转换进行导出

    Hbase→hive外部表→hive内部表→通过sqoop→mysql逻辑,

    1、创建外部hive表与hbase映射

    2、创建hive内部表,将建立外部表导入到hive内部表

    3、将内部表的数据导出到MySQL中

    先将MySQL中的book表清空备用

    use library;
    TRUNCATE TABLE book;

    进入hive客户端,创建hive外部表,映射hbase当中的hbase_book表  

     CREATE EXTERNAL TABLE course.hbase2mysql (id int,name string,price int)
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    WITH SERDEPROPERTIES (
    "hbase.columns.mapping" =
    ":key,info:name, info:price"
    )
    TBLPROPERTIES( "hbase.table.name" = "hbase_book",
    "hbase.mapred.output.outputtable" = "hbase2mysql");

     进入hive客户端,执行以下命令,创建hive内部表,并将外部表的数据插入到hive的内部表当中来

    CREATE TABLE course.hbase2mysqlin(id int,name string,price int);

    insert overwrite table course.hbase2mysqlin select * from course.hbase2mysql; 

    将hive中的数据导入到MySQL中 

    sqoop export --connect jdbc:mysql://node03:3306/library --username root --password 123456 --table book --export-dir /user/hive/warehouse/course.db/hbase2mysqlin --input-fields-terminated-by '\001' --input-null-string '\\N' --input-null-non-string '\\N'; 

     

     

  • 相关阅读:
    金仓数据库KMonitor使用指南--3. 部署
    2024深圳杯数学建模竞赛A题(东三省数学建模竞赛A题):建立火箭残骸音爆多源定位模型
    Android开发进阶:Android Framework原理上手与掌控
    自制操作系统日志——第十五天
    磁盘调度算法例题解析以及C语言实现
    docker四种网络模式
    Android Studio实现课程表应用,美观又实用(Kotlin版本)
    冯喜运:6.5黄金原油今日行情趋势分析及操作策略
    Java学习--File
    小白学Java
  • 原文地址:https://blog.csdn.net/weixin_43288858/article/details/126146473