一、Sqoop简明笔记
1、Sqoop概述
-
简介
Sqoop 是一款开源的工具,主要用于在 Hadoop(Hive)与传统的数据库(mysql、postgresql...) 间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres 等)中的 数据导进到 Hadoop 的 HDFS 中,也可以将 HDFS 的数据导进到关系型数据库中。
-
原理
将导入或导出命令翻译成mapreduce程序,即对inputformat和outputformat进行定制。
-
官方文档
2、Sqoop安装
-
下载地址
-
解压缩防止到对应目录
-
修改配置文件
[1] cd $SQOOP_HOME/conf [2] cp mv sqoop-env-template.sh sqoop-env.sh [3] vim sqoop-env.sh
# 添加以下内容 export HADOOP_COMMON_HOME=/opt/software/hadoop-3.1.3 export HADOOP_MAPRED_HOME=/opt/software/hadoop-3.1.3 export HIVE_HOME=/opt/software/hive-3.1.2 export ZOOKEEPER_HOME=/opt/software/zookeeper-3.4.10 export ZOOCFGDIR=//opt/software/zookeeper-3.4.10
-
拷贝JDBC驱动到$SQOOP_HOME/lib中
-
添加到myenv.sh
# 6.配置Sqoop目录 # SQOOP_HOME export SQOOP_HOME=/opt/software/sqoop-1.4.7 export PATH=$PATH:$SQOOP_HOME/bin
-
验证Sqoop
sqoop help # 可以通过command来验证sqoop配置是否正确,出现的Warin警告属于未配置对象,不影响使用
-
测试Sqoop是否能够成功连接数据库
sqoop list-databases --connect jdbc:mysql://pc001:3306/ --username root --password root
3、Sqoop使用
3.1 导入数据
在 Sqoop 中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE, HBASE)中传输数据,叫做:导入,即使用 import 关键字。
3.1.1 mysql数据准备
create database sqoop_test;
-- 创建mysql表
create table table_test(
id int(4) primary key not null auto_increment,
name varchar(255),
sex varchar(255)
);
-- 创建数据到Mysql
insert into table_test(name,sex) values("Tom","M");
insert into table_test(name,sex) values("Happy","W");
3.1.2 RDBMS到HDFS
-
全部导入
# 全部导入 sqoop import \ --connect jdbc:mysql://pc001:3306/sqoop_test \ --username root \ --password root \ --table table_test \ --target-dir /user/sqoop_test \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by ","
-
查询导入
-
查询导入时,查询条件中,必须包含 “$CONDITIONS”
-
如果 query 后使用的是双引号,则$CONDITIONS 前必须加转移符,防止 shell 识别为自己的变量
-- 查询导入 sqoop import \ --connect jdbc:mysql://pc001:3306/sqoop_test \ --username root \ --password root \ --target-dir /user/sqoop_test \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by "," \ --query 'select name,sex from table_test where id<=1 and $CONDITIONS;'; sqoop import \ --connect jdbc:mysql://pc001:3306/sqoop_test \ --username root \ --password root \ --target-dir /user/sqoop_test \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by "," \ --query "select name,sex from table_test where id<=1 and \$CONDITIONS";
-
-
导入指定列
- columns 中如果涉及到多列,用逗号分隔,分隔时不要添加空格
sqoop import \ --connect jdbc:mysql://pc001:3306/sqoop_test \ --username root \ --password root \ --columns id,sex \ --table table_test \ --target-dir /user/sqoop_test \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by "," ;
-
使用 sqoop 关键字筛选查询导入数据
sqoop import \ --connect jdbc:mysql://pc001:3306/sqoop_test \ --username root \ --password root \ --table table_test \ --where "id=1" \ --target-dir /user/sqoop_test \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by ",";
3.1.3 RDBMS到HIVE
该过程分为两步,第一步将数据导入到 HDFS,第二步将导入到 HDFS 的数据迁移到 Hive 仓库,第一步默认的临时目录是/user/nuochengze/表名
sqoop import \
--connect jdbc:mysql://pc001:3306/sqoop_test \
--username root \
--password root \
--table table_test \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "," \
--hive-overwrite \
--hive-table test.sqoop_test;
3.4 导出数据
在 Sqoop 中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群 (RDBMS)中传输数据,叫做:导出,即使用 export 关键字。
说明:Mysql 中如果表不存在,不会自动创建。
sqoop export \
--connect jdbc:mysql://pc001:3306/sqoop_test \
--username root \
--password root \
--table table_test \
--num-mappers 1 \
--export-dir /user/hive/warehouse/test.db/sqoop_test \
--input-fields-terminated-by ",";
3.5 脚本打包
sqoop命令一般以opt格式的文件存储打包内容