Apache Sqoop简介
Sqoop是一款开源的工具,主要用于hdfs(hive)与结构化的数据库(例如:关系型数据库mysql)之间,进行高效的传输批量数据。
注意在官网还有一个版本:Sqoop2,这个Sqoop2官方说明不适用于生产环境部署。
Sqoop原理:将导入或导出命令转换成mapreduce程序,实现数据导入导出。在转换出的mapreduce中主要是对inputformat和outputformat进行定制。
Sqoop安装部署
下载解压
到官网进行下载:http://sqoop.apache.org/
笔者下载的是:sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
$ tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/module/
修改配置文件
进入conf目录,修改sqoop-env.sh
$ mv sqoop-env-template.sh sqoop-env.sh
$ vi sqoop-env.sh
笔者这里只配置Hadoop和Hive的路径
#Set path to where bin/hadoop is availableexport HADOOP_COMMON_HOME=$HADOOP_HOME#Set path to where hadoop-*-core.jar is availableexport HADOOP_MAPRED_HOME=$HADOOP_HOME#set the path to where bin/hbase is available#export HBASE_HOME=#Set the path to where bin/hive is availableexport HIVE_HOME=$HIVE_HOME#Set the path for where zookeper config dir is#export ZOOCFGDIR=
Mysql安装配置
Mysql安装
笔者用sqoop将hive的数据导出到mysql,所以这里安装mysql,安装方法略。
放置jdbc驱动
放置mysql的jdbc jar包到sqoop的lib目录下,笔者用的是下面这个版本
mysql-connector-java-5.1.47.jar
注意:sqoop是在执行命令的时候指定mysql的配置参数。不需要单独配置 。
验证安装结果
sqoop直接用命令检查
$ bin/sqoop help
Sqoop使用
参考官方指南:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html
启动sqoop查看数据库
list-databases
$ sqoop list-databases --connect jdbc:mysql://webapp200:3306/ --username root --password 000000
导入数据
导入数据:指从非大数据集群(RDBMS)向大数据集群(HDFS、HIVE、HBASE)中传输数据。关键字import。
RDBMS到HDFS
全部导入
$ bin/sqoop import \--connect jdbc:mysql://webapp200:3306/offlinecalc \--username root \--password 000000 \--table country \--target-dir /user/country \--num-mappers 1 \--fields-terminated-by "\t"
查询导入
$ bin/sqoop import \--connect jdbc:mysql://webapp200:3306/offlinecalc \--username root \--password 000000 \--target-dir /user/country \--num-mappers 1 \--fields-terminated-by "\t" \--query 'select name,count from country where busidate<=getdate() and $CONDITIONS;'
注意:$CONDITIONS保证数据顺序的一个变量,在开启多个mappers(例如:--num-mappers 3)时,可以保证传输到hdfs上的数据顺序不乱。
如果query使用双引号,则需对$CONDITIONS做转义,在前面加“\”
\$CONDITIONS
导入指定的列
$ bin/sqoop import \--connect jdbc:mysql://webapp200:3306/offlinecalc \--username root \--password 000000 \--table country \--columns name,count \--target-dir /user/country \--num-mappers 1 \--fields-terminated-by "\t"
条件筛选导入数据
$ bin/sqoop import \--connect jdbc:mysql://webapp200:3306/offlinecalc \--username root \--password 000000 \--table country \--where "id=1" \--target-dir /user/country \--num-mappers 1 \--fields-terminated-by "\t"
注:“导入指定的列”和“条件筛选导入数据”可以结合使用
RDBMS到HIVE
$ bin/sqoop import \--connect jdbc:mysql://webapp200:3306/offlinecalc \--username root \--password 000000 \--table country \--num-mappers 1 \--hive-import \--fields-terminated-by "\t" \--hive-table country_hive
注意:这里是分两步实现:先导到hdfs,再迁移到hive;第一步默认临时目录是/user/[用户名]/表名
RDBMS到HBASE
$ bin/sqoop import \--connect jdbc:mysql://webapp200:3306/offlinecalc \--username root \--password 000000 \--table country \--columns "id,name,sex" \--columns-family "info" \--hbase-create-table \--hbase-row-key "id" \--hbase-table "hbase_country" \--num-mappers 1 \--split-by id
-- split-by id 按id字段切分工作单元
注意:sqoop和hbase之间的版本问题,例如:sqoop1.4.6只支持HBase1.0.1之前的版本自动创建HBase表的功能。
导出数据
导出数据:指从大数据集群(HDFS、HIVE)向非大数据集群(RDBMS)中传输数据。关键字export。
HIVE/HDFS到RDBMS
$ bin/sqoop export \--connect jdbc:mysql://webapp200:3306/offlinecalc \--username root \--password 000000 \--table country \--num-mappers 1 \--export-dir /user/hive/warehouse/country_hive \--input-fields-terminated-by "\t"
Hive和hdfs两者命令一样;
--export-dir /user/hive/warehouse/country_hive \ 为hive目录或者hdfs目录。
脚本打包
使用opt格式的文件打包sqoop命令,然后执行
创建一个.opt文件
$ touch exportdata.opt
编写sqoop脚本
$ vi /opt/shell/covid19/exportdata.opt
脚本如下(以下脚本是笔者在环境中使用过的)
export--connectjdbc:mysql://webapp200:3306/offline--usernameroot--password000000--tablet_infectstatistics--num-mappers1--export-dir/user/hive/warehouse/covid19count.db/t_infectstatistics/cty=china--input-fields-terminated-by","--update-modeallowinsert--update-keycountry,area
注意格式:每个属性与属性值必须换行,不能有任何空格。
执行脚本文件
$ sqoop --options-file /opt/shell/covid19/exportdata.opt
以上脚本可用crontab、azkaban、oozie等定时任务框架进行调用,设置定时执行。
Azkaban案例:创建job文件:sqoop.job
type=commandcommand=sqoop --options-file /opt/shell/covid19/exportdata.opt
sqoop.job文件和exportdata.opt文件一起压缩成zip包,导入到azkaban中进行任务设置,即可执行。