美文网首页数据分析mysql
数据迁移的工具Sqoop实践

数据迁移的工具Sqoop实践

作者: 羋学僧 | 来源:发表于2020-08-27 09:49 被阅读0次

    数据迁移的工具Sqoop实践

    sqoop : 数据迁入迁出的工具

    RDBMS -- import -> Hadoop
    Hadoop -- export -> RDBMS

    列出MySQL数据库里的database:

    sqoop list-databases \
    --connect jdbc:mysql://bigdata02:3306/ \
    --username bigdata \
    --password 123456
    
    sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username bigdata --password 123456
    

    --connect 连接关系型数据库的URL
    --username 数据库的用户名
    --password 数据库的密码

    列出MySQL中的mysql数据库的数据表:

    sqoop list-tables \
    --connect jdbc:mysql://bigdata02:3306/mysql \
    --username bigdata \
    --password 123456
    

    创建一张跟mysql中的help_keyword表一样的hive表hk:

    在hive里使用默认的default库

    sqoop create-hive-table \
    --connect jdbc:mysql://bigdata02:3306/mysql \
    --username bigdata \
    --password 123456 \
    --table help_keyword \
    --hive-table hk
    

    使用myhive库

    sqoop create-hive-table \
    --connect jdbc:mysql://bigdata02:3306/mysql \
    --username bigdata \
    --password 123456 \
    --table help_keyword \
    --hive-database myhive \
    --hive-table hk
    

    导入

    导入MySQL表中数据到HDFS中:

    普通导入:导入mysql库中的help_keyword的数据到HDFS上的默认路径:/user/bigdata/help_keyword

    sqoop import   \
    --connect jdbc:mysql://bigdata02:3306/mysql   \
    --username bigdata  \
    --password 123456   \
    --table help_keyword   \
    -m 1
    

    -m 1就是一个MapTask

    查看结果:

    hadoop fs -cat /user/bigdata/help_keyword/p*
    

    先删除原来的结果文件:

     hadoop fs -rm -r /user/bigdata/help_keyword
    

    下面会生成4个文件夹,也就是说默认的m是4个MapTask。

    sqoop import   \
    --connect jdbc:mysql://bigdata02:3306/mysql   \
    --username bigdata  \
    --password 123456  \
    --table help_keyword
    

    导入: 指定分隔符为和导入路径

    sqoop import   \
    --connect jdbc:mysql://bigdata02:3306/mysql   \
    --username bigdata  \
    --password 123456   \
    --table help_keyword   \
    --target-dir /user/bigdata/my_help_keyword2  \
    --fields-terminated-by '\t'  \
    -m 1
    
    hadoop fs -cat /user/bigdata/my_help_keyword2/part-m-00001
    

    导入数据:带where条件

    sqoop import   \
    --connect jdbc:mysql://bigdata02:3306/mysql   \
    --username bigdata  \
    --password 123456   \
    --where "name='STRING' " \
    --table help_keyword   \
    --target-dir /sqoop/bigdata/myoutport1  \
    -m 1
    
    hadoop fs -cat /sqoop/bigdata/myoutport1/part-m-00000
    

    导入:指定自定义查询SQL

    sqoop import   \
    --connect jdbc:mysql://bigdata02:3306/mysql   \
    --username bigdata  \
    --password 123456   \
    --target-dir /user/bigdata/myimport2  \
    --query 'select help_keyword_id,name from help_keyword WHERE $CONDITIONS and  name = "STRING"'  \
    --split-by  help_keyword_id \
    --fields-terminated-by '\t'  \
    -m 1
    
    hadoop fs -cat /user/bigdata/myimport2/part-m-00000
    

    下面是导入所有,其实没有添加条件,但是WHERE $CONDITIONS 必须要有。

    sqoop import   \
    --connect jdbc:mysql://bigdata02:3306/mysql   \
    --username bigdata  \
    --password 123456   \
    --target-dir /user/root/myimport22  \
    --query "select help_keyword_id,name from help_keyword WHERE \$CONDITIONS"  \
    --split-by  help_keyword_id \
    --fields-terminated-by '\t'  \
    -m 3
    

    下面会报错

    sqoop import   \
    --connect jdbc:mysql://bigdata02:3306/mysql   \
    --username bigdata  \
    --password 123456   \
    --target-dir /user/root/myimport222  \
    --query "select help_keyword_id,name from help_keyword"  \
    --split-by help_keyword_id \
    --fields-terminated-by '\t'  \
    -m 3
    

    在以上需要按照自定义SQL语句导出数据到HDFS的情况下:

    1、引号问题,要么外层使用单引号,内层使用双引号,CONDITIONS的符号不用转义, 要么外层使用双引号,那么内层使用单引号,然后CONDITIONS的符号需要转义
    2、自定义的SQL语句中必须带有WHERE $CONDITIONS

    导入MySQL数据库中的表数据到Hive中:

    普通导入:数据存储在默认的default hive库中,表名就是对应的mysql的表名:

    sqoop import   \
    --connect jdbc:mysql://bigdata02:3306/mysql   \
    --username bigdata  \
    --password 123456   \
    --table help_keyword   \
    --hive-import \
    -m 1
    
    // hadoop fs -cat /user/hive/warehouse/help_keyword/p*     
    // 查看数据
    hadoop fs -cat /home/bigdata/data/hivedata/help_keyword/p* 
    
    // 指定行分隔符和列分隔符,
    //指定hive-import,
    //指定覆盖导入,
    //指定自动创建hive表,
    //指定表名,
    //指定删除中间结果数据目录
    sqoop import  \
    --connect jdbc:mysql://bigdata02:3306/mysql  \
    --username bigdata  \
    --password 123456  \
    --table help_keyword  \
    --fields-terminated-by "\t"  \
    --lines-terminated-by "\n"  \
    --hive-import  \
    --hive-overwrite  \
    --create-hive-table  \
    --delete-target-dir \
    --hive-database  myhive \
    --hive-table new_help_keyword2
    
    // hadoop fs -cat /user/hive/warehouse/myhive.db/new_help_keyword2/p*
    hadoop fs -cat /home/bigdata/data/hivedata/myhive.db/new_help_keyword2/p*
    

    增量导入 导入到hdfs

    
    sqoop import   \
    --connect jdbc:mysql://bigdata02:3306/mysql   \
    --username bigdata  \
    --password 123456   \
    --table help_keyword  \
    --target-dir /user/root/myimport3  \
    --incremental  append  \
    --check-column  help_keyword_id \
    --last-value 500  \
    -m 1
    
    hadoop fs -cat /user/root/myimport3/p* 
    

    last-value 500 只导入 id > 500 的所有记录。

    导出:

    mysql --> RDBMS

    注意:导出的RDBMS的表必须自己预先创建,不会自动创建
    创建student表

    hive
    
    create database if not exists myhive;
    
    use myhive;
    
    drop table if exists student;
    
    create table student(id int, name string, sex string, age int, department string) row format delimited fields terminated by ",";
    
    load data local inpath "/home/bigdata/data/student.txt" into table myhive.student;
    
    select * from myhive.student;
    

    创建sqoopstudent表

    mysql -ubigdata -p123456
    
    create database sqoopdb default character set utf8 COLLATE utf8_general_ci; 
    
    use sqoopdb;
    
    CREATE TABLE sqoopstudent ( 
       id INT NOT NULL PRIMARY KEY, 
       name VARCHAR(20), 
       sex VARCHAR(20),
       age INT,
       department VARCHAR(20)
    );
    

    导出HDFS数据到MySQL:

    // 导出HDFS数据到MySQL:
    sqoop export \
    --connect jdbc:mysql://bigdata02:3306/sqoopdb  \
    --username bigdata \
    --password 123456 \
    --table sqoopstudent \
    --export-dir /student_ext_4 \
    --fields-terminated-by ','
    

    导出hive数据到MySQL:

    先清空sqoopstudent

    // 导出hive数据到MySQL:
    sqoop export \
    --connect jdbc:mysql://bigdata02:3306/sqoopdb  \
    --username bigdata \
    --password 123456 \
    --table sqoopstudent \
    --export-dir /home/bigdata/data/hivedata/myhive.db/student \
    --fields-terminated-by ','
    

    一些其他操作:

    列出mysql数据库中的所有数据库

    //列出mysql数据库中的所有数据库
    sqoop list-databases \
    --connect jdbc:mysql://bigdata02:3306/ \
    -username bigdata \
    -password 123456
    

    连接mysql并列出数据库中的表

    //连接mysql并列出数据库中的表
    sqoop list-tables \
    --connect jdbc:mysql://bigdata02:3306/mysql \
    -username bigdata \
    -password 123456
    

    导入 MySQL 数据到 HBase

    先手动创建表

    hbase shell
    
    create 'new_help_keyword','info'
    

    提示:sqoop1.4.6只支持HBase1.0.1之前的版本的自动创建HBase表的功能

    sqoop import \
    --connect jdbc:mysql://bigdata02:3306/mysql \
    --username bigdata \
    --password 123456 \
    --table help_keyword \
    --columns "help_keyword_id,name" \
    --column-family "info" \
    --hbase-create-table \
    --hbase-row-key "help_keyword_id" \
    --hbase-table "new_help_keyword" 
    
    hbase shell
    
    scan 'new_help_keyword'
    

    字段解释:

    --connect jdbc:mysql://bigdata02:3306/mysql       表示远程或者本地 Mysql 服务的 URI 
    --hbase-create-table                            表示在 HBase 中建立表。 
    --hbase-table new_help_keyword      表示在 HBase 中建立表 new_help_keyword。 
    --hbase-row-key help_keyword_id      表示hbase表的rowkey是mysql表的help_keyword_id 字段。 
    --column-family "info"       表示在表 new_help_keyword 中建立列族 person。 
    --username root           表示使用用户 root 连接 mysql。 
    --password 111111           连接 mysql 的用户密码 
    --table help_keyword         表示导出 mysql 数据库的 help_keyword 表。 
    

    导出 HBase 数据到 MySQL

    很遗憾,现在还没有直接的命令将 HBase 的数据导出到 MySQL
    一般采用如下方法:

    1、将 Hbase 数据,扁平化成 HDFS 文件,然后再由 sqoop 导入
    2、直接使用 HBase 的 Java API 读取表数据,直接向 mysql 导入,不需要使用 sqoop

    相关文章

      网友评论

        本文标题:数据迁移的工具Sqoop实践

        本文链接:https://www.haomeiwen.com/subject/gpezjktx.html