Sqoop
什么是 Sqoop
- Sqoop 是一款开源的工具,主要用于在 Hadoop(Hive)与传统的数据库(mysql、postgresql...) 间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres 等)中的 数据导进到 Hadoop 的 HDFS 中,也可以将 HDFS 的数据导进到关系型数据库中
- Sqoop2 的最新版本是 1.99.7。请注意,2 与 1 不兼容,且特征不完整,它并不打算用于生产部署。
Sqoop 原理
- 将导入或导出命令翻译成 mapreduce 程序来实现。
- 在翻译出的 mapreduce 中主要是对 inputformat 和 outputformat 进行定制。
Sqoop 安装(重点)
-
解压 Sqoop 包到指定目录
- tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/module/
-
修改 & 重命名配置文件
-
重命名配置文件
- mv sqoop-env-template.sh sqoop-env.sh
-
修改配置文件
-
export HADOOP_COMMON_HOME={hadoop 安装目录}
export HADOOP_MAPRED_HOME={hadoop 安装目录}
export HIVE_HOME={Hive 安装目录} -
注:配置文件中还可以添加其他组件的配置,例如 Zookeeper,Hbase 等,不设置的情况下,会报警告
-
-
-
拷贝 jdbc 驱动到 sqoop 的 lib 目录下
- cp mysql-connector-java-5.1.37.jar /opt/module/sqoop-1.4.6/lib/
-
配置环境变量,方便执行命令
-
export SQOOP_HOME={sqoop 安装目录}
export PATH=$PATH:$SQOOP_HOME/bin -
生效环境变量
- source /etc/profile
-
-
连接 MySQL 测试
-
sqoop list-databases --connect jdbc:mysql://主机名:3306/ --username root --password mysql密码
-
出现的日志包含如下结果则 MySQL 连接成功
-
information_schema
metastore
mysql
oozie
performance_schema
-
-
Sqoop 使用
环境准备
- 创建 MySQL 数据库
- create database sqoop_test;
- 创建表
- create table sqoop_tbl (id int(4) PRIMARY KEY AUTO_INCREMENT,name varchar(255));
- 添加数据
- insert into sqoop_tbl (name) values ('zhangsan');
- insert into sqoop_tbl (name) values ('lisi');
- insert into sqoop_tbl (name) values ('wangwu');
- insert into sqoop_tbl (name) values ('zhaoliu');
导入数据(重点)
- 在 Sqopp 中,导入的概念指的是从非大数据集群(MySQL等)向大数据集群(HDFS,HIVE等)传输数据,叫做导入,使用 import 关键字
全部数据导入
-
sqoop import
--connect jdbc:mysql://master-3.x-wfb:3306/sqoop_test
--username root --password 111111
--table sqoop_tbl
--target-dir /user/sqoop_test
--delete-target-dir
--num-mappers 1
--fields-terminated-by "\t"
sqoop import Sqoop 导入命令
--connect jdbc:mysql://master-3.x-wfb:3306/sqoop_test 导入的目标连接
--username root --password 密码 连接的密码
--table sqoop_tbl 导入数据的来源表
--target-dir /user/sqoop_test 导入到 hdfs 上的目录
--delete-target-dir 若 hdfs 上的目录存在,则删除
--num-mappers 1 设置 MapTask 的任务数
--fields-terminated-by "\t" 导入的数据使用什么分隔符
查询导入
-
sqoop import
--connect jdbc:mysql://master-3.x-wfb:3306/sqoop_test
--username root
--password 111111
--target-dir /user/sqoop_test2
--delete-target-dir
--num-mappers 1
--fields-terminated-by "\t"
--query 'select * from sqoop_tbl where id =1 and $CONDITIONS;'
--query 'select * from sqoop_tbl where id =1 and $CONDITIONS;' 查询的语句,其中,$CONDITIONS 是一个必须值
注: 如果 query 后使用的是双引号,则$CONDITIONS 前必须加转移符,防止 shell 识别为自己的 变量。
导入指定列
-
sqoop import --connect jdbc:mysql://master-3.x-wfb:3306/sqoop_test --username root --password 111111 --target-dir user/sqoop_test4 --delete-target-dir --num-mappers 1 --fields-terminated-by '\t' --columns id,name --table sqoop_tbl
--columns id,name 导入指定的字段
查询条件导入
-
sqoop import --connect jdbc:mysql://master-3.x-wfb:3306/sqoop_test --username root --password 111111 --target-dir /user/sqoop-test4 --delete-target-dir --num-mappers 1 --fields-terminated-by "\t" --table sqoop_tbl --where 'id=4'
where 'id=4' 导入数据时,加上条件
导入数据到 Hive
-
sqoop import --connect jdbc:mysql://master-3.x-wfb:3306/sqoop_test --username root --password 111111 --table sqoop_tbl --num-mappers 1 --hive-import --fields-terminated-by '\t' --hive-overwrite --hive-table sqoop_tbl
--hive-import 导入数据到 Hive
--fields-terminated-by '\t' 行数据使用 \t 作为分隔符
--hive-overwrite 覆盖 Hive 中的数据
--hive-table sqoop_tbl 指定导入到 Hive 的那张表补充: 该过程分为两步,第一步将数据导入到 hdfs ,默认路径是 /user/用户名/表名,第二步将导入的数据迁移到 Hive 仓库
导入数据到 Hbase
-
sqoop import --connect jdbc:mysql://hadoop102:3306/company --username root --password 000000 --table company --columns "id,name,sex" --column-family "info" --hbase-create-table --hbase-row-key "id" --hbase-table "hbase_company" --num-mappers 1 --split-by id
若没学过 Hbase 了解即可,比赛时,大概率使用 Hive
导出数据(重点)
- 在 Sqoop 中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群 (RDBMS)中传输数据,叫做:导出,即使用 export 关键字。
Hive 导出到 MySQL
-
sqoop export --connect jdbc:mysql://master-3.x-wfb:3306/sqoop_test --username root --password 111111 --table sqoop_tbl --num-mappers 1 --export-dir /user/hive/warehouse/sqoop_tbl --input-fields-terminated-by '\t'
--export-dir /user/hive/warehouse/sqoop_tbl 导出数据的目录
--input-fields-terminated-by '\t' 导出数据时,使用什么分隔符分割字段
--table sqoop_tbl 导出到 MySQL 的那张表