Apache Sqoop(TM) is a tool designed for efficiently transferring bulk da
Sqoop successfully graduated from the Incubator in March of 2012 and is now a Top-Level Apache project: More information
Latest stable release is 1.4.6 (download, documentation). Latest cut of Sqoop2 is 1.99.7 (download, documentation). Note that 1.99.7 is not compatible with 1.4.6 and not feature complete, it is not intended for production deployment.
Apache Sqoop(TM)是一种旨在有效地在Apache Hadoop和诸如关系数据库等结构化数据存储之间传输大量数据的工具。
Sqoop于2012年3月孵化出来,现在是一个顶级的Apache项目。
最新的稳定版本是1.4.6。Sqoop2的最新版本是1.99.7。请注意,1.99.7与1.4.6不兼容,且没有特征不完整,它并不打算用于生产部署
Sqoop原理
将导入或导出命令翻译成mapreduce程序来实现。
在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。
Sqoop安装
安装Sqoop的前提是已经具备Java和Hadoop的环境。
3.1、下载并解压
1) 最新版下载地址:http://mirrors.hust.edu.cn/apache/sqoop/1.4.6/
2) 上传安装包sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz到虚拟机中,如我的上传目录是:/home/admin/softwares/installation
3) 解压sqoop安装包到指定目录,如:
$ tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C ~/modules/ |
3.2、修改配置文件
Sqoop的配置文件与大多数大数据框架类似,在sqoop根目录下的conf目录中。
1) 重命名配置文件
$ mv sqoop-env-template.sh sqoop-env.sh $ mv sqoop-site-template.xml sqoop-site.xml |
2) 修改配置文件
sqoop-env.sh
export HADOOP_COMMON_HOME=/home/admin/modules/hadoop-2.7.2 export HADOOP_MAPRED_HOME=/home/admin/modules/hadoop-2.7.2 export HIVE_HOME=/home/admin/modules/apache-hive-1.2.2-bin export ZOOKEEPER_HOME=/home/admin/modules/zookeeper-3.4.5 export ZOOCFGDIR=/home/admin/modules/zookeeper-3.4.5 |
3.3、拷贝JDBC驱动
拷贝jdbc驱动到sqoop的lib目录下,如:
$ cp -a mysql-connector-java-5.1.27-bin.jar ~/modules/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/lib/ |
3.4、验证Sqoop
我们可以通过某一个command来验证sqoop配置是否正确:
$ bin/sqoop help 出现一些Warning警告(警告信息已省略),并伴随着帮助命令的输出: Available commands: codegen Generate co create-hive-table Imp ev export Export an HDFS directory to a database table help List available commands imp imp imp job Work with saved jobs list-databases List available databases on a server list-tables List available tables in a database merge Merge results of incremental imp metastore Run a standalone Sqoop metastore version Display version information |
3.5、测试Sqoop是否能够成功连接数据库
$ bin/sqoop list-databases --connect jdbc:mysql://linux01:3306/ --username root --password 123456 出现如下输出: information_schema metastore mysql performance_schema |
4.1、导入数据
在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据,叫做:导入,即使用imp
4.1.1、RDBMS到HDFS
1) 确定Mysql服务开启正常
2) 在Mysql中新建一张表并插入一些数据
$ mysql -uroot -p123456 mysql> create database company; mysql> create table company.staff(id int(4) primary key not null auto_increment, name varchar(255), sex varchar(255)); mysql> insert into company.staff(name, sex) values('Thomas', 'Male'); mysql> insert into company.staff(name, sex) values('Catalina', 'FeMale'); |
3) 导入数据
(1)全部导入
$ bin/sqoop imp --connect jdbc:mysql://hadoop102:3306/company \ --username root \ --password 000000 \ --table staff \ --target-dir /user/company \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by "\t" |
(2)查询导入
$ bin/sqoop imp --connect jdbc:mysql://hadoop102:3306/company \ --username root \ --password 000000 \ --target-dir /user/company \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by "\t" \ --query 'select name,sex from staff where id <=1 and $CONDITIONS;' |
尖叫提示:must contain '$CONDITIONS' in WHERE clause.
尖叫提示:如果query后使用的是双引号,则$CONDITIONS前必须加转移符,防止shell识别为自己的变量。
(3)导入指定列
$ bin/sqoop imp --connect jdbc:mysql://hadoop102:3306/company \ --username root \ --password 000000 \ --target-dir /user/company \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by "\t" \ --columns id,sex \ --table staff |
尖叫提示:columns中如果涉及到多列,用逗号分隔,分隔时不要添加空格
(4)使用sqoop关键字筛选查询导入数据
$ bin/sqoop imp --connect jdbc:mysql://hadoop102:3306/company \ --username root \ --password 000000 \ --target-dir /user/company \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by "\t" \ --table staff \ --where "id=1" |
尖叫提示:在Sqoop中可以使用sqoop imp
4.1.2、RDBMS到Hive
$ bin/sqoop imp --connect jdbc:mysql://hadoop102:3306/company \ --username root \ --password 000000 \ --table staff \ --num-mappers 1 \ --hive-imp --fields-terminated-by "\t" \ --hive-overwrite \ --hive-table staff_hive |
尖叫提示:该过程分为两步,第一步将数据导入到HDFS,第二步将导入到HDFS的数据迁移到Hive仓库
尖叫提示:第一步默认的临时目录是/user/admin/表名
4.2、导出数据
在Sqoop中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS)中传输数据,叫做:导出,即使用export关键字。
4.2.1、HIVE/HDFS到RDBMS
$ bin/sqoop export \ --connect jdbc:mysql://hadoop102:3306/company \ --username root \ --password 000000 \ --table staff \ --num-mappers 1 \ --export-dir /user/hive/warehouse/staff_hive \ --input-fields-terminated-by "\t" |
尖叫提示:Mysql中如果表不存在,不会自动创建
思考:数据是覆盖还是追加
4.3、脚本打包
使用opt格式的文件打包sqoop命令,然后执行
1) 创建一个.opt文件
$ mkdir opt $ touch opt/job_HDFS2RDBMS.opt |
2) 编写sqoop脚本
$ vi opt/job_HDFS2RDBMS.opt
export --connect jdbc:mysql://linux01:3306/company --username root --password 123456 --table staff --num-mappers 1 --export-dir /user/hive/warehouse/staff_hive --input-fields-terminated-by "\t" |
3) 执行该脚本
$ bin/sqoop --options-file opt/job_HDFS2RDBMS.opt |