Sqoop 是 Apache 旗下一款“ Hadoop 和关系数据库服务器之间传送数据 ”的工具,实现大数据平台与关系型数据库之间的数据迁移。
导入 import:关系型数据库导入数据到大数据平台
导出 export:大数据平台数据导出到关系型数据库
Sqoop的本质是一个命令行工具,将数据迁移的命令转化为MR程序。传统MR程序的输入输出都是HDFS,Sqoop底层只需重新定义输入 InputFormat 和输出 OutputFormat,以实现从关系型数据库读取数据和向关系型数据库写入数据。
二、安装安装包下载地址:Index of /dist/sqoophttp://archive.apache.org/dist/sqoop/
安装步骤:
三、Sqoop的基本命令1、下载安装包并解压
2、进入conf目录,将sqoop-env-template.sh修改为sqoop-env.sh
mv sqoop-env-template.sh sqoop-env.sh
3、修改sqoop-env.sh
写入HADOOP_COMMON_HOME、HADOOP_MAPRED_HOME
Hbase_HOME、HIVE_HOME、ZOOCFGDIR
其中 ZOOCFGDIR 的路径是Zookeeper的conf目录
export ZOOCFGDIR=/home/hadoop/apps/zookeeper-3.4.10/conf
4、将mysql驱动包添加到 lib 目录下
5、配置环境变量
6、验证 sqoop version
sqoop help 查看 sqoop 支持哪些命令
sqoop help command 查看具体命令的使用。其实没啥用,用的时候根据需求搜博客就行了,只需要知道sqoop可以实现哪些功能,可以大致看懂命令含义就行。
四、数据导入Sqoop可以将RDBMS的数据导入到HDFS、Hive、Hbase ...
常用参数sqoop import (generic-args) (import-args)
1、导入数据到HDFS--connect 数据库链接url
--username 数据库的用户名
--password 数据库的密码
--table 要导出数据的mysql数据库表
-m MapTask的个数
--target-dir 导出数据在HDFS上的存储目录
--fields-terminated-by 每条记录中字段之间的分隔符(HDFS上数据的分隔符)) --columns 指定查询列(需要与--where 一起使用)
--where 查询SQL的where条件
--query 查询SQL
Sqoop从RDBMS导入单个表到HDFS。表中每一行被看做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
带where条件sqoop import
--connect jdbc:mysql://hadoop02:3306/mysql
--username root
--password root
--table help_keyword
--target-dir /user/hadoop11/my_help_keyword1
--fields-terminated-by 't'
-m 2
查询指定列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
指定自定义查询SQLsqoop 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
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
--fields-terminated-by 't'
-m 4# --split-by: 指定数据切分字段,每个MapTask对应(split_max - split_min) / m 的数据
2、导入数据到Hive 普通导入在以上需要按照自定义SQL语句导出数据到HDFS的情况下:
1、引号问题,要么外层使用单引号,内层使用双引号,$CONDITIONS的$符号不用转义, 要么外层使用双引号,那么内层使用单引号,然后$CONDITIONS的$符号需要转义
2、自定义的SQL语句中必须带有WHERe $CONDITIONS
数据存储在默认的default hive库中,表名就是对应的mysql的表名
导入步骤:
1)导入mysql.help_keyword的数据到hdfs的默认路径
2)自动仿造mysql.help_keyword去创建一张hive表, 创建在默认的default库中
3)把临时目录中的数据导入到hive表中
指定行分隔符和列分隔符sqoop import
--connect jdbc:mysql://hadoop02:3306/mysql
--username root
--password root
--table help_keyword
--hive-import # 指定导入到Hive
-m 1
增量导入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表
--delete-target-dir # 指定删除中间结果数据目录
--hive-database mydb_test # 指定Hive数据库
--hive-table new_help_keyword # 指定Hive表名# sqoop会自动创建hive的表。 但是不会自动创建不存在的库
数据抽取通常情况下都是定时抽取,抽取的数据一定是一个增量数据。增量导入使用较多。
全量数据:表中的所有数据
增量数据:数据库中现有数据和原始数据的差,即新增的数据。
增量数据需要一个标记字段,该字段可以代表数据的顺序,通常采用时间戳
增量导入参数:
--incremental
增量数据抽取 # append:追加 lastmodified:最后一次修改 --check-column
顺序标识字段 --last-value
标识字段的最后一个值,从这个值后边的数据开始追加
3、导入数据到Hbasesqoop 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
-m 1
五、数据导出sqoop import
--connect jdbc:mysql://hadoop02:3306/mysql
--username root
--password root
--table help_keyword
--hbase-table new_help_keyword
--column-family person
--hbase-row-key help_keyword_id
Hbase数据不能直接导出到mysql。可以先将Hbase数据导出到HDFS或hive中,再导出到mysql。Hbase数据千亿级别,通常不会导出到mysql中。
[注]:导出的RDBMS的表必须自己预先创建,Sqoop 不会自动创建
1、导出HDFS数据到MySql2、导出Hive数据到MySqlsqoop export
--connect jdbc:mysql://hadoop02:3306/spider
--username root
--password root
--table student # MySql中的表(需要手动创建)
--export-dir /sqoop/student/ # HDFS的数据路径
--fields-terminated-by ',' # 指定HDFS的数据分隔符(默认只支持单字节分割符?有待考证)
六、其它操作 列出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数据的存储路径(HDFS)
--input-fields-terminated-by 't' # 数据的输入分隔符
连接mysql并列出数据库中的表sqoop list-databases
--connect jdbc:mysql://hadoop02:3306/
-username root
-password root
将关系型数据的表结构复制到hive中sqoop list-tables
--connect jdbc:mysql://hadoop02:3306/jdbc_test1704
-username root
-password root
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"



