sqoop是一个hadoop(hdfs、hbase、hive)和结构数据库(关系型数据库)之间进行数据整合的工具。
2、sqoop的本质
将sqoop的语句转换成mapreduce来进行转换。
3、sqoop的命令
import:将结构数据库中的数据导入的hdfs中。
export:将hadoop中的数据导出到关系型数据库中。
关系型数据库 <---> hdfs
关系型数据库 ---> hive、hbase
4sqoop的安装
(1)解压并配置环境变量
(2)、配置配置文件./conf/sqoop-env.sh (./conf/sqoop-site.xml不用配置即可)
配置时指定HADOOP_COMMEN_HOME=、 HBASE_HOME=、HIVE_HOME=、
ZOOCFGDIR=(指定hadoop 、hbase、hivezookeeper、等安装的路径即可)
cp /home/mysql-connector-java-5.1.6-bin.jar /usr/local/sqoop-1.4.6/lib/
(4)、测试运行:
sqoop verison
sqoop help
5、sqoop的语句()
注意 当需要换行是时 结尾使用 “\”
sqoop list-databases -connect jdbc:mysql://hadoop01:3306/ \
-username root -password root;
sqoop list-tables -connect jdbc:mysql://hadoop01:3306/ywp \
-username root -password root;
(1)、import导入:
sqoop import -connect jdbc:mysql://hadoop02:3306/ywp --driver com.mysql.jdbc.Driver \
-username root -password root \
-table hfile --target-dir /sqo/01;
sqoop import -connect jdbc:mysql://hadoop01:3306/ywp --driver com.mysql.jdbc.Driver \
-username root -password root \
-table hfile -m 1 --fields-terminated-by '\t' --lines-terminated-by '\n' \
--null-string '\\N' --null-non-string '\\N' \
--target-dir /sqo/05;
(2)、import指定列导入:
sqoop import -connect jdbc:mysql://hadoop01:3306/ywp --driver com.mysql.jdbc.Driver \
-username root -password root \
-table hfile -m 1 \
--columns 'id,fname,fpath,owner' \
--fields-terminated-by '\t' --lines-terminated-by '\n' \
--null-string '\\N' --null-non-string '\\N' \
--target-dir /sqo/06;
(3)、import导入到hive表:
sqoop import -connect jdbc:mysql://hadoop01:3306/ywp --driver com.mysql.jdbc.Driver \
-username root -password root \
-table hfile -m 1 \
--columns 'id,fname,fpath,owner' \
--fields-terminated-by '\t' --lines-terminated-by '\n' \
--null-string '\\N' --null-non-string '\\N' \
--create-hive-table --hive-import --hive-overwrite \
--hive-table gp1702.sq1 --delete-target-dir \
;
(4)\import指定where来导入:
sqoop import -connect jdbc:mysql://hadoop01:3306/ywp --driver com.mysql.jdbc.Driver \
-username root -password root \
-table hfile -m 1 \
--columns 'id,fname,fpath,owner' \
--where 'id > 5' \
--fields-terminated-by '\t' --lines-terminated-by '\n' \
--null-string '\\N' --null-non-string '\\N' \
--target-dir /sqo/08 --delete-target-dir;
(5)、import指定query来导入:
Cannot specify --query and --table together.
sqoop import -connect jdbc:mysql://hadoop01:3306/ywp --driver com.mysql.jdbc.Driver \
-username root -password root -m 1 \
--query 'select id,fname,fpath from hfile WHERE id > 3 and $CONDITIONS' \
--fields-terminated-by '\t' --lines-terminated-by '\n' \
--null-string '\\N' --null-non-string '\\N' \
--target-dir /sqo/10 --delete-target-dir;
(6)、import指定split-by来导入:
sqoop import -connect jdbc:mysql://hadoop01:3306/ywp --driver com.mysql.jdbc.Driver \
-username root -password root -m 2 -table hfile --split-by id \
--fields-terminated-by '\t' --lines-terminated-by '\n' \
--null-string '\\N' --null-non-string '\\N' \
--target-dir /sqo/12 --delete-target-dir;
(7)、导出到mysql中:
CREATE TABLE `hfile1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`fname` varchar(255) NOT NULL,
`fpath` varchar(255) NOT NULL,
`owner` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
sqoop export -connect jdbc:mysql://hadoop01:3306/ywp --driver com.mysql.jdbc.Driver \
-username root -password root -table hfile1 -m 1 \
--export-dir '/sqo/07' --update-mode updateonly \
--update-key id \
--input-fields-terminated-by '\t' --input-lines-terminated-by '\n' \
--input-null-string '\\N' --input-null-non-string '\\N' \
;
6、sqoop的import运行机制
Sqoop在import时,需要制定split-by参数。Sqoop根据不同的split-by参数值来进行切分,然后将切分出来的区域分配到不同map中。每个map中再处理数据库中获取的一行一行的值,写入到HDFS中。同时split-by根据不同的参数类型有不同的切分方法,如比较简单的int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来确定划分几个区域。比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分别为1000和1,而num-mappers为2的话,则会分成两个区域(1,500)和(501-100),同时也会分成2个sql给2个map去进行导入操作,分别为select XXX from table where split-by>=1 and split-by<500和select XXXfrom table where split-by>=501 and split-by<=1000。最后每个map各自获取各自SQL中的数据进行导入工作。
7、应用场景
Sqoop可以在HDFS/Hive和关系型数据库之间进行数据的导入导出,其中主要使用了import和export这两个工具。这两个工具非常强大,提供了很多选项帮助我们完成数据的迁移和同步。比如,下面两个潜在的需求:
(1)、业务数据存放在关系数据库中,如果数据量达到一定规模后需要对其进行分析或同统计,单纯使用关系数据库可能会成为瓶颈,这时可以将数据从业务数据库数据导入(import)到Hadoop平台进行离线分析。
(2)、 对大规模的数据在Hadoop平台上进行分析以后,可能需要将结果同步到关系数据库中作为业务的辅助数据,这时候需要将Hadoop平台分析后的数据导出(export)到关系数据库。