1 Sqoop 简介
Sqoop 是一款开源的工具,主要用于在 Hadoop 与传统的数据库间进行数据的传递,可以将一个关系型数据库中的数据导进到 HDFS 中,也可以将 HDFS 的数据导进到关系型数据库中。
2 Sqoop 原理
将导入或导出命令翻译成 MapReduce 程序来实现
在翻译出的 MapReduce 中主要是对 InputFormat 和 OutputFormat 进行定制
3 Sqoop 安装
1、解压
tar -zxf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/module/
2、重命名配置文件
mv sqoop-env-template.sh sqoop-env.sh
3、修改配置文件
vim sqoop-env.sh
export HADOOP_COMMON_HOME=/opt/module/hadoop-2.7.2
export HADOOP_MAPRED_HOME=/opt/module/hadoop-2.7.2
export HIVE_HOME=/opt/module/hive
export ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.10
export ZOOCFGDIR=/opt/module/zookeeper-3.4.10
export HBASE_HOME=/opt/module/hbase
4、将 JDBC 驱动拷贝到 lib 下
cp mysql-connector-java-5.1.27-bin.jar /opt/module/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/lib/
5、验证 Sqoop
bin/sqoop help
6、测试 Sqoop 是否能正确连接到数据库
bin/sqoop list-databases --connect jdbc:mysql://hadoop102:3306/ --username root --password 123456
4 Sqoop 常用命令
序号 | 命令 | 类 | 说明 |
---|---|---|---|
1 | import | ImportTool | 将数据导入到集群 |
2 | export | ExportTool | 将集群数据导出 |
3 | codegen | CodeGenTool | 获取数据库中某张表数据生成Java并打包Jar |
4 | create-hive-table | CreateHiveTableTool | 创建Hive表 |
5 | eval | EvalSqlTool | 查看SQL执行结果 |
6 | import-all-tables | ImportAllTablesTool | 导入某个数据库下所有表到HDFS中 |
7 | job | JobTool | 用来生成一个sqoop的任务,生成后,该任务并不执行,除非使用命令执行该任务 |
8 | list-databases | ListDatabasesTool | 列出所有数据库名 |
9 | list-tables | ListTablesTool | 列出某个数据库下所有表 |
10 | merge | MergeTool | 将HDFS中不同目录下面的数据合在一起,并存放在指定的目录中 |
11 | metastore | MetastoreTool | 记录sqoop job的元数据信息,如果不启动metastore实例,则默认的元数据存储目录为:~/.sqoop,如果要更改存储目录,可以在配置文件sqoop-site.xml中进行更改 |
12 | help | HelpTool | 打印sqoop帮助信息 |
13 | version | VersionTool | 打印sqoop版本信息 |
5 案例实战
5.1 RDBMS 到 HDFS
1、全部导入
bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 123456 \
--table staff \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"
2、查询导入
bin/sqoop import --connect jdbc:mysql://hadoop102:3306/company --username root --password 123456 --target-dir /user/company --delete-target-dir --num-mappers 1 --fields-terminated-by "\t" --query 'select name,sex from staff where id <=1 and $CONDITIONS;
must contain '$CONDITIONS' in WHERE clause,如果 query 使用的是双引号,$CONDITIONS 前必须加转义字符
3、导入指定列
bin/sqoop import --connect jdbc:mysql://hadoop102:3306/company --username root --password 123456 --target-dir /user/company --delete-target-dir --num-mappers 1 --fields-terminated-by "\t" --columns id,sex --table staff
4、使用 Sqoop 关键字筛选查询导入数据
bin/sqoop import --connect jdbc:mysql://hadoop102:3306/company --username root --password 123456 --target-dir /user/company --delete-target-dir --num-mappers 1 --fields-terminated-by "\t" --table staff --where "id=1"
5、增量导入
先导入一部分数据:
bin/sqoop import --connect jdbc:mysql://hadoop102:3306/company --username root --password 123456 --table staff_timestamp --delete-target-dir --m 1
再增量导入一部分数据:
$ bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company --username root --password 123456 --table staff_timestamp --check-column last_modified --incremental lastmodified --last-value "2017-09-28 22:20:38" --m 1 --append
使用 lastmodified 方式导入数据要指定增量数据是要 --append(追加)还是要 --merge-key(合并)
last-value 指定的值是会包含于增量导入的数据中
5.2 RDBMS 到 Hive
1、全部导入
bin/sqoop import --connect jdbc:mysql://hadoop102:3306/company --username root --password 123456 --table staff --num-mappers 1 --hive-import --fields-terminated-by "\t" --hive-overwrite --hive-table staff_hive
2、增量导入
bin/sqoop import --connect jdbc:mysql://hadoop102:3306/company --username root --password 123456 --table staff --num-mappers 1 --fields-terminated-by "\t" --target-dir /user/hive/warehouse/staff_hive --check-col umn id --incremental append --last-value 3
append 不能与 --hive- 等参数同时使用
5.3 RDBMS 到 HBase
bin/sqoop import --connect jdbc:mysql://hadoop102:3306/company --username root --password 123456 --table staff --columns "id,name,sex" --column-family "info" --hbase-create-table --hbase-row-key "id" --hbase-table "hbase_company" --num-mappers 1 --split-by id
Sqoop1.4.6 只支持 HBase1.0.1 之前的版本的自动创建 HBase 表
5.4 Hive/HDFS 到 RDBMS
bin/sqoop export --connect jdbc:mysql://hadoop102:3306/company --username root --password 123456 --table staff --num-mappers 1 --export-dir /user/hive/warehouse/staff_hive --input-fields-terminated-by "\t"
5.5 将 RDBMS 中的表映射为一个 Java 类
bin/sqoop codegen --connect jdbc:mysql://hadoop102:3306/company --username root --password 123456 --table staff --bindir /home/admin/Desktop/staff --class-name Staff --fields-terminated-by "\t"
5.6 生成与 RDBMS 结构对应的 Hive 表结构
bin/sqoop create-hive-table --connect jdbc:mysql://hadoop102:3306/company --username root --password 123456 --table staff --hive-table hive_staff
5.7 判断 SQL 是否正确
bin/sqoop eval --connect jdbc:mysql://hadoop102:3306/company --username root --password 123456 --query "SELECT * FROM staff"
5.8 将 RDBMS 中的所有表导入到 HDFS 中,每一个表都对应一个 HDFS 目录
bin/sqoop import-all-tables --connect jdbc:mysql://hadoop102:3306/company --username root --password 123456 --warehouse-dir /all_tables
5.9 生成一个 Sqoop 任务,生成后不会立即执行,需要手动执行
生成任务:
bin/sqoop job --create myjob -- import-all-tables --connect jdbc:mysql://hadoop102:3306/company --username root --password 123456
查看任务列表:
bin/sqoop job --list
执行任务:
$ bin/sqoop job --exec myjob
5.10 查看 RDBMS 列表
bin/sqoop list-databases --connect jdbc:mysql://hadoop102:3306/ --username root --password 123456
5.11 查看 RDBMS 的 company 的所有表
bin/sqoop list-tables --connect jdbc:mysql://hadoop102:3306/company --username root --password 123456
5.12 将 HDFS 中不同目录下面的数据合并在一起并放入指定目录中
创建JavaBean:
bin/sqoop codegen --connect jdbc:mysql://hadoop102:3306/company --username root --password 123456 --table staff --bindir /home/admin/Desktop/staff --class-name Staff --fields-terminated-by "\t"
开始合并:
$ bin/sqoop merge --new-data /test/new/ --onto /test/old/ --target-dir /test/merged --jar-file /home/admin/Desktop/staff/Staff.jar --class-name Staff --merge-key id