Sqoop 入门

偶尔善良 提交于 2019-11-30 12:31:07

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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!