1. 作用
Sqoop 是 Apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具。
导入数据:MySQL,Oracle 导入数据到 Hadoop 的 HDFS、HIVE、HBASE 等数据存储系统
导出数据:从 Hadoop 的文件系统中导出数据到关系数据库 MySQL 等
Sqoop 的本质还是一个命令行工具,和 HDFS,Hive 相比,并没有什么高深的理论。
2.工作机制
将导入导出命令翻译成 MapReduce 程序来实现
在翻译出的 MapReduce 中主要是对 InputFormat 和 OutputFormat 进行定制
3.安装
注意: 目录下要有hive, 因为要拿到 hive 的 home, 执行 hive 操作
1 | 1、 准备安装包 sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar.gz |
4. 基本使用
1 | 1) sqoop help : 查看帮助 |
5. Sqoop 数据导入
常用指令
1 | --connect 指定数据库链接url |
5.1 list mysql 的数据库 & 表, 复制mysql 中表结构相同表 –> hive
1 | 列出MySQL数据有哪些数据库: |
5.2 导入 mysql中表 到 HDFS
1 | |
5.3 导入MySQL数据库中的表数据到Hive中:
1 | |
5.4 增量导入到 HDFS
—-应该也是可以导入到 Hive
1 | |
5.5 第四部分: 导入数据到HBase
1 | |
5.6 导出
1 | |
5.6 导出HBase数据到MySQL
很遗憾,现在还没有直接的命令将 HBase 的数据导出到 MySQL
一般采用如下 3 种方法:
1、将 HBase 数据,扁平化成 HDFS 文件,然后再由 sqoop 导入
2、将 HBase 数据导入 Hive 表中,然后再导入 MySQL
3、直接使用 HBase 的 Java API 读取表数据,直接向 MySQL 导入,不需要使用 sqoop
5.7 sqoop 支持 & 不支持
hdfs to mysql 可以直接使用。!!
hive to mysql 就是hdfs to mysql
hbase to mysql 很不幸,不支持。!
怎么实现?
1、扁平化到HDFS
2、hbase和hive做整合
3、自己编写程序去实现从HBASE当中读取数据,然后写入到mYsql
6.Sqoop Job 作业
查看帮助:
sqoop help job
6.0 mysql 创建数据库 spider 和 表 lagou
1 | # 这样可以直接导入 sql 数据 |
6.1 创建作业 Job (–create)
1 | # 注意: mysql 中此时已经存在 spider 库, 库中有 lagou 表 |
6.2 查看作业 Job (–list)
1 | sqoop job --list |
6.3 查看作业详细信息 (–show)
1 | sqoop job --show my_sqoop_job |
6.4 执行作业
1 | sqoop job --exec my_sqoop_job |
6.5 删除作业
1 | sqoop job --delete my_sqoop_job |
7.Sqoop 导入导出原理
7.1 导入原理
1、第一步,Sqoop 会通过 JDBC 来获取所需要的数据库元数据,例如,导入表的列名,数据 类型等。
2、第二步,这些数据库的数据类型(varchar, number 等)会被映射成 Java 的数据类型(String, int 等),根据这些信息,Sqoop 会生成一个与表名同名的类用来完成序列化工作,保存表中的 每一行记录。
3、第三步,Sqoop 启动 MapReducer 作业
4、第四步,启动的作业在 input 的过程中,会通过 JDBC 读取数据表中的内容,这时,会使 用 Sqoop 生成的类进行反序列化操作
5、第五步,最后将这些记录写到 HDFS 中,在写入到 HDFS 的过程中,同样会使用 Sqoop 生 成的类进行反序列化
7.2 导出原理
1、 第一步,sqoop 依然会通过 JDBC 访问关系型数据库,得到需要导出数据的元数据信息
2、 第二步,根据获取到的元数据的信息,sqoop 生成一个 Java 类,用来进行数据的传输载
体。该类必须实现序列化和反序列化
3、 第三步,启动 mapreduce 作业
4、 第四步,sqoop 利用生成的这个 java 类,并行的从 hdfs 中读取数据
5、 第五步,每个 map 作业都会根据读取到的导出表的元数据信息和读取到的数据,生成一 批 insert 语句,然后多个 map 作业会并行的向数据库 mysql 中插入数据
所以,数据是从 hdfs 中并行的进行读取,也是并行的进入写入,那并行的读取是依赖 hdfs 的性能,而并行的写入到 mysql 中,那就要依赖于 mysql 的写入性能嘞。