Sqoop笔记

Sqoop 是一个开掘工具,它允许用户将数据从关系型数据库抽取到
Hadoop 中,用于进一步的处理。抽取出的数据可以被MapReduce 程序使用,也可
以被其他类似于Hive 的工具使用。一旦形成分析结果, Sqoop 便可以将这些结果
导回数据库,供其他客户端使用。
Sqoop 的import 工具会运行一个MapReduce 作业, ì主作业会连接MySQL 数据库
井读取表中的数据。默认情况下,该作业会井行使用4 个map 任务来加速导入过
程。每个任务都会将其所导入的数据写到一个单独的文件,但所有4 个文件都位于
同一个目录中,默认情况下, Sqoop 会将我们导人的数据保存为逗号分隔的文本文件。如果导人数
据的字段内容中存在分隔符,则我们可以另外指定分隔符、字段包围字符和转义字
符。使用命令行参数可以指定分隔符、文件格式、压缩以及对导人过程进行更细粒
度的控制, Sqoop 自带的"Sqoop User Guide" , ①或在Sqoop 的在线帮助中(sqoop
help import ,在CDH 中使用man sqoop-import) ,可以找到对相关参数的描
述。Sqoop 可以将数据导人成几种不同的格式。文本文件(默认)是一种人类
、可读的数据表示形式,并且是平台独立和最简单的数据格式。但是,
文本文件不能保存二进制字段(例如数据库中类型为VARBINARY 的
列) ,并且不能区分null 值和字符串值"null" 。为了处理这些情
况,应该使用Sqoop 的SequenceFile 格式。这种文件格式的缺点在
于它只面向Java 语言,并且Sqoop 的目前版本还不能将其加载到Hive
中。但是, SequenceFile 格式为导人的数据提供了更精确的表示。
SequenceFile 格式不仅能够使MapReduce 保留其并行处理同一个文
件不同部分的能力,还允许对数据进行压缩。了能够将数据库表的内容写到HDFS , Sqoop 还生成了一个Java 源文件
(widgets. java) ,保存在当前的本地目录中。在运行了前面的sqoop impor吃命
令之后,可以通过1s widgets.java 命令看到这个文件。

运行原理
像Hadoop 一
样, Sqoop 是用Java 语言编写的。]ava 提供了一个称为JDBC(Java Database
Connectivity) 的API ,应用程序可以使用这个API 来访问存储在RDBMS 中的数据
以及检查数据的性质和类型。大多数数据库厂商都提供JDBC 驱动程序,其中实现
了JDBC API 井包含用于连接其数据库服务器的必要代码。
在导入开始之前, Sqoop 使用JDBC 来检查将要导人的表。它检索出表中所有的列
以及列的SQL 数据类型。这些SQL 类型(VARCHAR , INTEGER 等)被映射到Java 数
据类型(String 、Integer 等),在MapReduce 应用中将使用这些对应的Java 类型
来保存字段的值。Sqoop 的代码生成器使用这些信息来创建对应表的类,用于保存
从表中抽取的记录。
但是,为了获得更好的导人性能,人们经常将这样的查询划分到多个节点上执行。
查询是根据一个"划分列" (sp1itting column) 来进行划分的。根据表的元数据,
Sqoop 会选择一个合适的列作为划分列(通常是表的主键)。主键列中的最小值和最
大值会被读出,与目标任务数一起用来确定每个map 任务要执行的查询。
例如,假设widgets 表中有100 000 条记录,其id 列的值为0-99 999 。在导入
这张表肘, Sqoop 会判断出id 是表的主键列。启动MapReduce 作业肘,用来执行
导人的DataDrivenDBlnputFormat 便会发出一条类似于SELECT MIN(i 哟,
MAX(id) FROM widgets 的查询语句。检索出的数据将用于对整个数据集进行划
分。假设我们指定并行运行5 个map 任务(使用-m 5) ,这样便可以确定每个map
任务要执行的查询分别为: SELECT id, widget_name, . . . FROM widgets
ωHERE id >= ø AND id < 2ØØØØ , SELECT id, widget_name, ... FROM
widgetsωHERE id >= 2ØØØØ AND id < 4Øωθ , ...,以此类推。

猜你喜欢

转载自xuxu-dragon.iteye.com/blog/2252036