什么是Sqoop?它的工作机制是什么?
一、Sqoop是什么
Sqoop是一种用于在Hadoop和结构化数据存储(如关系数据库)之间高效传输大批量数据的工具。它允许用户将数据从结构化存储器抽取到Hadoop中,用于进一步处理。
例如,可以利用Sqoop从关系型数据库管理系统(如MySQL或者Oracle或者主机)向Hadoop分布式文件系统(HDFS)中导入数据,可以通过MapReduce处理这些数据,同时这些数据也可以被Hive使用,甚至可以使用Sqoop将数据从数据库转移到HBase上。同时Sqoop可以将数据从Hadoop中(如Hive中)导入到关系型数据库中,Sqoop 会基于配置文件,完成数据的导入和导出工作。
二、Sqoop 工作机制
Sqoop的成层原理本质上是MapRatuce 任务。Sqoop是通过个MapReduve作业从数据库中导入一个表,这个作业从表中逐行抽取数据,接着将一行行的数据写入HDFS。
那么底层是如何实现的呢?下面我们具体介绍Sqoop如何将数据从数据库中导入到HDFS中以及从HDFS中导入到数据库中的过程,以此来更好地了解Sqop的工作机制。如下图所示为Sqoop将数据从关系型数据库导入到HDFS中的原理图。
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 vold write (PreparedStatement dbstmt) throws SQLException;
在导入过程中,Sqoop 会启动相应的MapReduce 作业,而MapReduce作业会通InpuFormat以JDBC的方式从数据库中读取数据,Hadop中的DataDrivenDBInpuFormat能够为不同的Map任务将查询结果进行划分。
在生成反序列化代码和配置了InpuFormat之后,Sqoop就会将作业发到MapReduce集群,Map任务会把查询到的ResultSet数据填充到类的实例中。在导出数据时,如果不想取出全部数据,可以通过类似于where的语句进行限制,如图所示。
Sqoop的导出通常是将HDFS的数据导入到关系型数据库中,关系型数据库中的表必须提前创建好。在底层方面,导出之前,Sqoop会选择导出方法,通常是JDBC,接着Sqoop会生成一个Java 类,这个类可以解析文本中的数据,并将相应的值插入表中。在启动MapReduce之后,会从HDFS中读取并解析数据,同时执行选定的导出方法。基于JDBC的导出方法会生成多条insert 语句,每条insert语句均会向表中插入多条数据,同时为了确保不同IO的操作可以并行执行,在从HDFS读取数据并与数据库通信时,是多个单独线程同时运行的。