Sqoop

                                                 Sqoop

1 什么是Sqoop

sqoop 是Apache的一款“Hadoop 和关系数据库服务器之间传送数据”的工具,Sqoop 的本质是一个命令行工具。

2 Sqoop产生背景

早期数据存储是基于传统的关系型数据库的,但是随着数据量的增长,传统的数据存储方式无法满足需求,随着出现的HDFS分布式文件存储系统等解决方案。那么sqoop就解决了传统的关系型数据库的数据要迁移到大数据平台的问题。

3 数据导入方向

以大数据平台为中心

数据迁入import  :mysql|oracle等关系型数据量 ----> hadoop平台(hdfs,hive,hbase等)

数据迁出 export  : hadoop平台数据----》 mysql|oracle

4 Sqoop的本质(工作机制)

将导入或导出命令翻译成 MapReduce 程序来实现,在翻译出的MapReduce 中主要是对 InputFormat 和 OutputFormat 进行定制

(1)sqoop数据迁入:从mysql读取数据  将数据输出到hdfs

map端:

           默认的FileInputFormat是针对文本的,需要重新定义输入为DBInputFormat

           将数据库的数据,一行一行的读取过来

           map() {输出}

重新定义了数据输入类 InputFormat,只需要maptask 

(2)sqoop数据迁出:从hdfs 读取数据,将数据迁出到 mysql中

map端:   

           输入不用变,FileInputFormat   一行一行的读取过来

           map(){

                      将数据输出到mysql中

                      重新定义  OutputFormat--> DBOutputFormat  

           }
    重新定义了OutputFormat,只需要maptask

5 Sqoop安装

(1)上传,解压,配置环境变量

(2)修改配置文件:mv sqoop-env-template.sh sqoop-env.sh 


#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/home/refuel/opt/module/hadoop-2.7.7

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/home/refuel/opt/module/hadoop-2.7.7

#set the path to where bin/hbase is available
export HBASE_HOME=/home/home/refuel/opt/module/hbase-1.2.6

#Set the path to where bin/hive is available
export HIVE_HOME=/home/home/refuel/opt/module/apache-hive-2.3.2-bin

#Set the path for where zookeper config dir is
export ZOOCFGDIR=/home/refuel/opt/module/zookeeper-3.4.10/conf

由于CDH版本的Haoop的Yarn和haoop是分开安装的,所以有两个haoop目录需要配置

(3)将mysql的驱动添加到sqoop的lib下

(4)测试

查看mysql中所有数据库
sqoop list-databases \
--connect jdbc:mysql://bigdata01:3306/ \
--username root \
--password 123456

6 Sqoop操作

6.1 数据导入

参数说明:
--connect     指定mysql连接
--password    指定mysql的密码
--username    指定mysql的用户名
-m   指定maptask的任务数量 
--target-dir   指定hdfs的输出目录
--fields-terminated-by  指定输入到hdfs的文件的字段之间的分隔符
--columns      指定需要导入的列
--where        指定过滤条件
--split-by    指定切分maptask的依据字段的
--table       指定mysql中需要导入到大数据平台的表名

(1)Mysql导入到Hdfs

①普通导入

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

默认输出目录  /user/用户名/表名
默认的分隔符 ,

②指定输出目录和分隔符 

sqoop import \
--connect jdbc:mysql://bigdata01:3306/mysql \
--username root \
--password 123456 \
--table help_keyword \
--target-dir /user/data01/mydata/help_keyword \
--fields-terminated-by '\t' \
-m 1

③指定需要导入的字段

// 查询指定列
sqoop import   \
--connect jdbc:mysql://bigdata01:3306/mysql   \
--username root  \
--password 123456 \
--columns "name" \
--table help_keyword  \
--target-dir /user/sqoop/outputdata01  \
-m 1

④指定过滤条件

sqoop import   \
--connect jdbc:mysql://bigdata01:3306/mysql   \
--username root  \
--password 123456   \
--columns "name" \
--where "help_keyword_id>100" \
--table help_keyword  \
--target-dir /user/sqoop/outputdata02  \
-m 1

⑤指定sql查询语句结果导入

sqoop import   \
--connect jdbc:mysql://bigdata01:3306/mysql   \
--username root  \
--password 123456   \
--query 'select * from help_keyword where  help_keyword_id>200 and $CONDITIONS' \
--target-dir /user/sqoop/outputdata03  \
-m 1

注意:
    ① --query 和  --where  --columns  --table不可以一起使用的
    ②报错
    Query [select * from help_keyword where help_keyword_id>200] must contain '$CONDITIONS' in WHERE clause
    $CONDITIONS 没有实际含义,但语法要求要有
    ③)使用单引号

⑥指定启动多个maptask任务

sqoop import   \
--connect jdbc:mysql://bigdata01:3306/  \
--username root  \
--password 123456   \
--target-dir /user/sqoop/outputdata04  \
--query 'select * from mysql.help_keyword where help_keyword_id > 100 and $CONDITIONS' \
--split-by  help_keyword_id \
--fields-terminated-by '\t'  \
-m 3

注意: -m是多个   必须配合 --split-by 整型,可以是自增主键  须配合plit-by不然会报错,
多个maptask任务数据的划分是先获取最小id,然后获取最大id (最大id-最小id +1 ) /maptask 求的是每一个maptask分配的数据条数,每一个maptask顺序获取数据,所以也是有可能造成数据倾斜的

(2)Mysql导入到Hive 

步骤:①先把这个数据导入到hdfs的默认路径下;②在hive中建表;③将hdfs的文件  加载到hive的表中

注意:在sqoop导入数据到hive 时候,默认会建表,但是数据库不会创建的,数据库需要手动创建的

参数说明
--hive-import   指定导入到hive中
--hive-overwrite   覆盖导入
--hive-database  指定数据库
--hive-table 指定hive中的表

①普通导入

sqoop import   \
--connect jdbc:mysql://bigdata01:3306/mysql   \
--username root  \
--password 123456   \
--table help_keyword   \
--hive-import \
-m 1

②指定导入的hive的库和表

sqoop import  \
--connect jdbc:mysql://bigdata01:3306/mysql  \
--username root  \
--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  test_sqoop \
--hive-table new_help_keyword

(3)Mysql导入到HBase

参数说明
--hbase-table  指定hbase的表名
--column-family 指定hbase对应的列族下
--hbase-row-key 指定hbase的rowkey 
注意:hbase中的表  需要手动创建的
create "new_help_keyword","info"
sqoop import \
--connect jdbc:mysql://bigdata01:3306/mysql \
--username root \
--password 123456 \
--table help_keyword \
--hbase-table new_help_keyword \
--column-family info \
--hbase-row-key help_keyword_id

(4)增量数据导入

全量数据导入:每次导入全部的数据

增量数据导入:每次导入新增的数据

三个重要参数
Incremental import arguments:

   --check-column <column>        Source column to check for incremental change  校验键,一般选主键,因为主键是自增

   --incremental <import-type>    Define an incremental import of type 'append' or 'lastmodified'  指定增量导入的类型
        
        append  追加
        lastmodified  最后一次修改的时间或建

   --last-value <value>           Last imported value in the incremental check column  指定上一次的最后最后一个增量的建的值,这次导入则是从这个值的下一个值开始导入
   
sqoop import   \
--connect jdbc:mysql://bigdata01:3306/mysql   \
--username root  \
--password 123456   \
--table help_keyword  \
--target-dir /user/outputdata06  \
--incremental  append  \
--check-column  help_keyword_id \
--last-value 200  \
-m 1

6.2 数据导出

(1)Hdfs导出到Mysql

sqoop export \
--connect jdbc:mysql://bigdata01:3306/sqoopdb  \
--username root \
--password 123456 \
--table sqoopfur \
--export-dir /user/outputdata03/help_keyword \
--fields-terminated-by '\t'



--export-dir 指定导出的hdfs的路径
--fields-terminated-by  指定hdfs的文件的字段分割符
--table  指定的导出的mysql中的表

mysql中的数据库和表都需要自己手动创建的
create database sqoopdb;
use sqoopdb;
CREATE TABLE sqoopfur ( 
   id INT, 
   name VARCHAR(60)
);

(2)Hive导出到Mysq

sqoop export \
--connect jdbc:mysql://bigdata01:3306/sqoopdb \
--username root \
--password 123456 \
--table uv_info \
--export-dir /user/hive/warehouse/test_sqoop.db/new_help_keyword \
--input-fields-terminated-by '\t'

--export-dir   指定hive表所在的hdfs的路径
--input-fields-terminated-by  指定hive的表文件的分隔符

CREATE TABLE uv_info ( 
   id INT, 
   name VARCHAR(60)
);

(3)HBase导入Mysql

没有一种直接的方式 可以hbase的数据直接导出mysql中。可以将hbase和hive整合,导出mysql 

上一篇:sqoop的安装部署


下一篇:Sqoop原理和架构