1. 什么是Sqoop
Sqoop是一种用于在Hadoop和结构化数据存储之间高效传输大批量数据的工具。它允许用户将数据从结构化存储器抽取到Hadoop中,用于进一步处理。举个栗子:
Sqoop可以从关系型数据库管理系统向Hadoop分布式文件系统中导入数据,可以通过MapReduce处理或者被Hive使用,甚至可以使用Sqoop将数据从数据库转移到HBase上。同时Sqoop可以将数据从Hadoop中(如Hive中)导入到关系型数据库,会基于配置文件来完成数据的导入和导出工作。
2. Sqoop的工作机制
Sqoop的底层工作原理本质上是MapReduce任务。Sqoop是通过一个MapReduce作业从数据库中导入一个表,这个job从表中逐行抽取数据,接着将一行行的数据写入到HDFS中。下面分别介绍Sqoop的导入导出机制:
2.1 Sqoop的导入机制
下图为Sqoop数据导入机制图:
Sqoop底层是Java,而Java提供了JDBC API,通过JDBC API,应用程序可以访问存储在关系型数据库中的数据。Sqoop在进行数据的导入导出操作时都会用到JDBC。在导入数据之前,Sqoop会通过JDBC查询出表中的列和列的类型,同时这些类型会与Java的数据类型相匹配,而底层运行的MapReduce会根据这些Java类型来保存字段对应的值。
在数据导入的过程中,有两个DBWritable接口的序列化方法,通过这两个方法可以实现对JDBC的交互,其中readFields()方法将ResultSet中的数据填充到对象的字段中。
//方法一:
public void readFields(resultSet _dbResults) throws SQLException;
//方法二:
public void write(PreparedStatement _dbstmt) throws SQLException;
在导入的过程中,Sqoop会启动相应的MapReduce作业,而MapReduce作业会通过InputFormat以JDBC的方式从数据库中读取数据,Hadoop中的DataDrivenDBInputFormat能够为不同的Map任务将查询结果进行划分。
在生成反序列化代码和配置了InputFormat之后,Sqoop就会将作业发到MapReduce集群,Map任务会把查询到的ResultSet数据填充到类的实例中。在导入数据时,如果不想取出全部数据,可以通过类似于where的语句进行限制。
2.2 Sqoop的导出机制
下图为Sqoop数据导出机制图:
Sqoop的导出通常是将HDFS的数据导入到关系型数据库中,关系型数据库中的表必须提前创建好。在底层方面,导出之前,Sqoop会选择导出方法,通常是JDBC,接着Sqoop会生成一个Java类,这个类可以解析文本中的数据,并将相应的值插入表中,在启动MapReduce之后,会从HDFS中读取并解析数据,同时执行选定的导出方法。
基于JDBC的导出方法会生成多条insert语句,每条insert语句均会向表中插入多条数据,同时为了确保不同I/O可以并行执行,在从HDFS读取数据并与数据库通信的时候,多个单线程同时运行。