简介
主要用于在 Hadoop(Hive) 与传统的数据库 ( mysql、postgresql... ) 间进行数据的传递
可以将一个关系型数据库(例如 : MySQL, Oracle, Postgres 等)中的数据导进到 Hadoop 的 HDFS 中,也可以将 HDFS 的数据导进到关系型数据库中
最新的稳定版本是 1.4.7
这里使用 centos6.8 与 Sqoop 1.4.6, centos6.8 与 Sqoop 1.4.7 存在不兼容, 而 centos 与 Sqoop 1.4.7 不存在此问题.
sqoop 的本质就是迁移数据, 迁移的方式:把 sqoop 的迁移命令转换成 MapReduce 程序
相关组件:HDFS, MapReduce, YARN, ZooKeeper, Hive, HBase, MySQL
配置
1.下载, 上传, 解压 不再赘述
2. 配置 sqoop.env.sh
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/opt/module/hadoop-2.7.2
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/opt/module/hadoop-2.7.2
#set the path to where bin/hbase is available
export HBASE_HOME=/opt/module/hbase-1.3.2.1
#Set the path to where bin/hive is available
export HIVE_HOME=/opt/module/hive-1.2.2
#Set the path for where zookeper config dir is
export ZOOCFGDIR=/opt/module/zookeeper-3.4.13
3. 添加 MySQL 驱动包
cp mysql-connector-java-5.1.27-bin.jar /opt/module/sqoop-1.4.7/lib
启动
1. 验证启动
bin/sqoop help
2. 连接数据库
sqoop slist-databases --connect jdbc:mysql://hadoop101:3306/ --username root --password 000000
需要保证防火墙关闭, mysql service 启动, , 并且当前用户对数据库有操作权限
使用
Sqoop 中数据的导入和导出都是站在大数据集群的角度来看的
导入是从结构数据库导入到 HDFS, 使用 import
导出是从 HDFS 导出到结构数据库, 使用 export
导入
1. 全部导入
sqoop import \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password 000000 \
--table staff \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"
2. 查询导入
sqoop import \
--connect jdbc:mysql://hadoop101: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 <=2 and $CONDITIONS'
and $CONDITIONS 为关键字, 必须添加
3. 指定导入列
sqoop import \ rayfun@hadoop101
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password 000000 \
--table staff \
--columns id,sex \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"
4. 指定关键字
sqoop import \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password 000000 \
--where 'id=1' \
\
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table staff
5. 导入到 Hive
在 sqoop-env.sh 中下添加如下代码:
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*
导入
sqoop import \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password 000000 \
--table staff \
\
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--delete-target-dir \
--hive-table staff_hive
6. 导入到 HBase
sqoop import \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password 000000 \
--table staff \
\
--hbase-table "hbase_company" \
--column-family "info" \
--columns "id,name,sex" \
--hbase-create-table \
--hbase-row-key "id" \
--num-mappers 1 \
--split-by id
注意: 这里会报错, 因为 Sqoop1.4.6 只支持 HBase1.0.1 之前的版本的自动创建 HBase 表的功能
所以需要手动在 HBase 中创建表
导出
导出到 RDBMS 的时候, 目标表必须已经在数据库中已经存在
sqoop export \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password 000000 \
--table staff \
--num-mappers 1 \
--export-dir /user/hive/warehouse/staff_hive \
--input-fields-terminated-by "\t"
注意:
-
mysql 中的 staff 表必须提前存在, 否则会抛出异常
-
默认情况下是在表中增加新行, 这样会引起主键冲突, 只要有一行插入失败, 剩下的都会插入失败
使用参数 --updata-key --update-mode allowinsert 进行更新操作, 如果不存在就插入
sqoop export \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password 000000 \
--table staff \
--num-mappers 1 \
--export-dir /user/hive/warehouse/staff_hive \
--update-key id \
--update-mode allowinsert \
--input-fields-terminated-by "\t"
打包脚本
每次操作输入参数比较麻烦, 可以使用脚本, 一般以 .opt 结尾
1. 创建文件
touch job_HDFS2RDBMS.opt
2. 编写脚本
# 导出
export
# 连接到 Mysql
--connect
jdbc:mysql://hadoop101:3306/company
--username
root
--password
000000
--table
staff
--num-mappers
1
--export-dir
/user/hive/warehouse/staff_hive
--input-fields-terminated-by
"\t"
注意:
- Sqoop 要求参数和参数值不能放在一行
- 可以有空行
3. 执行
sqoop --options-file job_HDFS2RDBMS.opt