sqoop的安装及操作和知识点总结

1.什么是sqoop:数据迁移工具

工具:本质就是迁移数据, 迁移的方式:就是把sqoop的迁移命令转换成MR程序

从别的地方到大数据生态体系是迁入(导入)

从大数据生态体系到别的地方是迁出(导出)

2.sqoop的安装:

    安装 Sqoop 的前提是已经具备 Java 和 Hadoop 的环境

    安装包下载地址 http://ftp.wayne.edu/apache/sqoop/

    安装包:sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar.gz

    解压安装包到安装目录 (安装在hadoop05节点上)

    tar -zxvf sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar.gz -C apps/

    cd apps

    mv sqoop-1.4.6.bin_hadoop-2.0.4-alpha/ sqoop-1.4.6

   进入到 conf 文件夹,找到 sqoop-env-template.sh,修改其名称为 sqoop-env.sh

    cd conf

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

    修改 sqoop-env.sh

    export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.7.5

    export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.7.5

    export HBASE_HOME=/home/hadoop/apps/hbase-1.2.6

    export HIVE_HOME=/home/hadoop/apps/apache-hive-2.3.3-bin

    export ZOOCFGDIR=/home/hadoop/apps/zookeeper-3.4.10/conf

    zookeeper 和 hbase 没有安装。那就不用管了。如果也安装的有,并且要使用,那么就给配置上

    加入 mysql 驱动包到 sqoop1.4.6/lib 目录下

    cp mysql-connector-java-5.1.40-bin.jar ~/apps/sqoop-1.4.6/lib/

    配置系统环境变量

    vi ~/.bashrc 然后输入:

    export SQOOP_HOME=/home/hadoop/apps/sqoop-1.4.6

    export PATH=$PATH:$SQOOP_HOME/bin

    然后保存退出source ~/.bashrc

    验证安装是否成功

    sqoop-version 或者 sqoop version

    sqoop的安装及操作和知识点总结

3.sqoop的使用

需要指定三个信息,驱动类,URL,username,password

默认情况下没写驱动类的话就是mysql数据库

帮助:sqoop help

导出:export

导入:import

生成java代码:codegen

创建一个hive表:create-hive-table

把Mysql中的所有表都导出来:import-all-tables

列出Mysql中所有的库:list-databases

列出Mysql你所指定的一个库中的所有的表:list-tables

查看版本号:sqoop version

列出MySQL数据有哪些数据库:
sqoop list-databases \
--connect jdbc:mysql://hadoop02:3306/ \
--username root \
--password root
sqoop的安装及操作和知识点总结

列出MySQL中的某个数据库有哪些数据表:
sqoop list-tables \
--connect jdbc:mysql://hadoop02:3306/student \
--username root \
--password root
sqoop的安装及操作和知识点总结

创建一张跟mysql中的help_keyword表一样的hive表hk:
sqoop create-hive-table \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--table help_keyword \    //mysql中的样表
--hive-table hk                //hive的表名为hk

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

导入:

导入:

--connect 指定数据库链接url
--username 指定数据库的用户名
--password 指定数据库的密码
--table 指定要导出数据的mysql数据库表
-m 指定MapTask的个数
--target-dir 指定导出数据在HDFS上的存储目录
--fields-terminated-by 指定每条记录中字段之间的分隔符
--where 指定查询SQL的where条件
--query 指定查询SQL
--columns 指定查询列

导入MySQL表中数据到HDFS中:

// 普通导入:导入mysql库中的help_keyword的数据到HDFS上的默认路径:/user/hadoop/help_keyword
sqoop import   \
--connect jdbc:mysql://hadoop02:3306/mysql   \
--username root  \
--password root   \
--table help_keyword   \

-m 1                //mapTask的个数(1就是1个文件)

如果没指定集群会按照sqoop-env.sh中所标示的hadoop集群,也可以自己指定集群

如果没指定导入到hdfs的路径会使用默认的/user/hadoop/help_keyword

user是固定的,hadoop是用户名称,help_keyword是表的名称但是这是个文件夹

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

默认使用,作为分隔符,下图会在hdfs中生成一个表名.java的文件,就是用来映射mysql数据库中导入的表的记录的,一条记录一个对象

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

// 导入MySQL表中数据到HDFS中: 指定分隔符和导入路径

sqoop import   \
--connect jdbc:mysql://hadoop02:3306/mysql   \
--username root  \
--password root   \
--table help_keyword   \
--target-dir /user/hadoop11/my_help_keyword1  \        //指定的hdfs路径
--fields-terminated-by '\t'  \                                            //指定列分隔符
-m 2

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

// 导入MySQL表中数据到HDFS中: 带where条件

sqoop import   \
--connect jdbc:mysql://hadoop02:3306/mysql   \
--username root  \
--password root   \
--where "name='STRING' " \
--table help_keyword   \
--target-dir /sqoop/hadoop11/myoutport1  \
-m 1

// 导入MySQL表中数据到HDFS中: 查询指定列
sqoop import   \
--connect jdbc:mysql://hadoop02:3306/mysql   \
--username root  \
--password root   \
--columns "name,(多个字段需要用逗号分隔)" \            //指定查询的列,如果不写会导入所有符合条件的列字段
--where "name='STRING' " \
--table help_keyword  \
--target-dir /sqoop/hadoop11/myoutport22  \

-m 1

相当于下面的SQL语句:

selct name from help_keyword where name = "string"

// 导入MySQL表中数据到HDFS中:指定自定义查询SQL
sqoop import   \
--connect jdbc:mysql://hadoop02:3306/  \
--username root  \
--password root   \
--target-dir /user/hadoop/myimport33_1  \
--query 'select help_keyword_id,name from mysql.help_keyword where $CONDITIONS and name = "STRING"' \
--split-by  help_keyword_id \            //如果指定多个mapTask,指定按照哪个字段进行切分,一般来说都是指定这张表的主键

--fields-terminated-by '\t'  \

-m 4

必须要写where $CONDITIONS,如果写--query就不能指定--columns了

query中的语句可以是单引也可以是双引,但是要注意单双交替,如果用单引里面的任何东西都不需要改,如果用双引里面的$符号需要用\$进行转译

sqoop import   \
--connect jdbc:mysql://hadoop02:3306/mysql   \
--username root  \
--password root   \
--target-dir /user/hadoop/myimport33_2  \
--query "select help_keyword_id,name from help_keyword WHERE \$CONDITIONS"  \
--split-by  help_keyword_id \
--fields-terminated-by '\t'  \
-m 2

在以上需要按照自定义SQL语句导出数据到HDFS的情况下:
1、引号问题,要么外层使用单引号,内层使用双引号,$CONDITIONS的$符号不用转义, 要么外层使用双引号,那么内层使用单引号,然后$CONDITIONS的$符号需要转义

2、自定义的SQL语句中必须带有WHERE \$CONDITIONS

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

// 普通导入:导入的数据存储在默认的default hive库中,表名就是对应的mysql的表名:
sqoop import   \
--connect jdbc:mysql://hadoop02:3306/mysql   \
--username root  \
--password root   \
--table help_keyword   \            //mysql中的表
--hive-import \
-m 1

注意:会先从mysql中导入到hdfs中的一个临时目录/user/hadoop/help_word,当都成功的时候然后再从临时目录导入到hive的默认库中。

分成三步:

第一步:导入mysql.help_keyword的数据到hdfs的默认路径

第二步:自动仿造mysql.help_keyword去创建一张hive表, 创建在默认的default库中

第三步:把临时目录中的数据导入到hive表中

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

最后的临时目录会被删掉

hadoop fs -cat /user/myhive/warehouse/help_keyword/part-m-00000     // 查看数据

// 指定行分隔符和列分隔符,指定hive-import,指定覆盖导入,指定自动创建hive表,指定表名,指定删除中间结果数据目录
sqoop import  \
--connect jdbc:mysql://hadoop02:3306/mysql  \
--username root  \
--password root  \
--table help_keyword  \
--fields-terminated-by "\t"  \            //列分隔符
--lines-terminated-by "\n"  \            //行分隔符
--hive-import  \
--hive-overwrite  \                //覆盖,之前如果存在这张表的数据将会被删除
--create-hive-table  \            //自动创建表
--delete-target-dir \              //删除中间生成的临时目录
--hive-database  mydb_test \            //hive的库下的(如果不存在会报错失败,但是临时文件会成功)
--hive-table new_help_keyword        //将会被导入数据的hive表

hive-import 当前这个导入命令。 sqoop会自动给创建hive的表。 但是不会自动创建不存在的库

sqoop的安装及操作和知识点总结

如果没指定,默认使用4个MapTask任务并发联合处理

下图是库不存在的报错信息:

sqoop的安装及操作和知识点总结

另外一种写法:
sqoop import  \
--connect jdbc:mysql://hadoop02:3306/mysql  \
--username root  \
--password root  \
--table help_keyword  \
--fields-terminated-by "\t"  \
--lines-terminated-by "\n"  \
--hive-import  \
--hive-overwrite  \
--create-hive-table  \ 
--hive-table  mydb_test.new_help_keyword  \            //把上面的指定库指定表写在了一起,直接库.表名
--delete-target-dir

// 增量导入:把新增加的数据进行导入

这三个指标其实就是制定能够判断某张表的那些数据是增量数据
--check-column            //指定按照哪个字段去判断是不是增量数据
--incremental                //模式
--last-value           //上一次最后导入的值
按照某个列进行判断。如果这个列是自增列,那么新增加的所有的数据的这个列的值,都是上一次导入的所有记录的值


从mysql导入到hdfs的增量导入

sqoop import   \

--connect jdbc:mysql://hadoop02:3306/mysql   \
--username root  \
--password root   \
--table help_keyword  \
--target-dir /user/hadoop/myimport_add  \            //导入到哪里的目录
--incremental  append  \                    //模式是追加
--check-column  help_keyword_id \        //按照主键
--last-value 500  \                        //上一次最后导入的值,导入的数据从501到最后,不包含500
-m 1

sqoop的安装及操作和知识点总结

查看数据:

sqoop的安装及操作和知识点总结


// 导入mysql数据到hbase:

sqoop的安装及操作和知识点总结

sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--table help_keyword \            //hbase的列(key)就是这个表的字段的名称,值(value)一条记录中字段所对应的值
--hbase-table new_help_keyword \            //hbase的表名,如果没有没有这张表就会报错,需要先创建hbase的表
--column-family person \                    //列簇的名字
--hbase-row-key help_keyword_id        //把mysql中的字段help_keyword_id当做了row key

sqoop的安装及操作和知识点总结

因为把mysql中的字段help_keyword_id当做了row key,所以就只剩下mysql中的一个字段name了。




导出:

很不幸:  可以从HDFS导出到MySQL, 也可以从Hive导出数据到MySQL,   但是没有一种直接的方式可以让HBase的数据导出到MySQL

因为hive的表可以抽象成二维表格和RDBMS的展现形式是一样的,所以可以导,因为hive中有元数据,就是用来描述这份二维表格的。可以做到对应。

hbase的模式信息只有表名和列簇的名字,key可以是任何值,mysql中的列字段名就是hbase的key的名字,hbase可以有上百万key,但是mysql不可能有上百万的字段。

所以最大的问题就是hbase的key不确定和很多。

想办法,还是可以实现把hbase中的数据导出mysql

先把hbase的数据弄到hive里面弄到hdfs里面就可以了。

hive的数据底层就是存在hdfs之上的。 hive中的数据是可以来自于hbase的。

hbase的SQL客户端最常用的有两个:hive+phoenix

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

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结


导出的需求很少: 本身数据量是很大的。 MySQL

所有的计算任务的处理结果,有时候是需要被导出到MySQL中的。


从hdfs中导出数据到mysql表中

1.在mysql中创建表

sqoop的安装及操作和知识点总结

设置字符集和排序规则防止乱码

sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

2.导出hdfs数据到mysql

// 导出HDFS数据到MySQL:
sqoop export \
--connect jdbc:mysql://hadoop02:3306/spider  \                //指定哪个库
--username root \
--password root \
--table student \                //指定即将有数据存入的mysql的表
--export-dir /sqoop/student/ \        //指定hdfs的导出目录
--fields-terminated-by ','            //解析hdfs文件的方式




sqoop的安装及操作和知识点总结

其实:hive导出到mysql也没有直接的方式,但是hive的数据在hdfs中的目录,所以相当于从hdfs导出到mysql


// 导出hive数据到MySQL:
sqoop export \
--connect jdbc:mysql://hadoop02:3306/sqoopdb \
--username root \
--password root \
--table uv_info \
--export-dir /user/hive/warehouse/uv/dt=2011-08-03 \                //hive将要被导出数据的目录
--input-fields-terminated-by '\t'


sqoop的安装及操作和知识点总结

sqoop的安装及操作和知识点总结

扁平化就是把一张四维表格变成二维表格


一些其他操作:


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


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


将关系型数据的表结构复制到hive中
sqoop create-hive-table \
--connect jdbc:mysql://hadoop02:3306/jdbc_test1704 \
--table student \
--username root \
--password root \
--hive-table mydb_test.student  \
--fields-terminated-by "\t"  \
--lines-terminated-by "\n"