Apache Sqoop Cookbook官方文档 中文翻译1-2
Chapter 1 开始
这一章节略过了安装过程,只翻译了后面的使用语法。
1.4. 开始使用Sqoop
问题:
此前你已经成功安装和配置完了sqoop环境,现在你想知道怎么运行它。
解决方案
Sqoop 是一个可以被shell应用调用(bash,zsh)的命令行工具,关于Sqoop命令行的例子如下所示(所有的参数将会在本书后面的章节解释)
sqoop import \
-Dsqoop.export.records.per.statement=1 \
--connect jdbc:postgresql://postgresql.example.com/database \
--username sqoop \
--password sqoop \
--table cities \
-- \
--schema us
讨论
Sqoop的命令行结构如下:
sqoop TOOL PROPERTY_ARGS SQOOP_ARGS [-- EXTRA_ARGS]
TOOL 表示希望执行的操作,最重要的操作 :import 将数据从数据库导入到Hadoop和 export 将 数据从Hadoop导出到数据库。 PROPERTY_ARGS 属性参数,指定一系列的参数,这些参数以Java属性格式方式 -Dname=value 输入。 属性参数在SQOOP_ARGS参数之前,对于SQOOP_ARGS包含了所有的sqoop参数。
【注】不允许将属性和Sqoop参数混合在一起。 此外,所有属性参数必须在所有Sqoop参数之前
EXTRA_ARGS 用来指定额外的参数,这些参数针对于专门的连接机器,额外的参数必须使用 – 来进行区分。
【注】Sqoop支持很多的命令行参数(超过60个).输入sqoop help来检索整个列表.输入sqoop help TOO(比如,sqoop help import) 来获得指明工具的详细的信息.
1.5. 获取Sqoop帮助
问题
你有一些这本书不能回答的问题。
解决方案
您可以通过邮件列表向Sqoop社区寻求帮助,Sqoop邮件列表页面包含使用Sqoop用户和开发邮件列表的一般信息和说明。 以下是一般过程的概述:
- 首先,你需要在Sqoop邮件列表页面订阅用户列表。
- 为了充分利用Sqoop邮件列表,您可能希望阅读Eric Raymond的“如何提出问题的智能方式”。
- 然后提供问题的完整上下文,并提供有关已观察和所需行为的详细信息。 如果合适的话,包括一个最小的自我复制示例,以便其他人可以重现您所面临的问题。
- 最后,发送您的邮件至user@sqoop.apache.org.
讨论
在您发送邮件之前,阅读Sqoop 文档 和邮件列表档案是非常有用的,有很大可能您的问题已经被提出,在这种情况下,您将能够通过搜索档案立即得到答案.如果您的问题还没有被提出,请发送邮件至user@sqoop.apache.org.
【注】如果您还不是列表订阅者,则您的电子邮件提交将被拒绝
您的问题可能与您的Sqoop命令有关,导致错误或给出意外结果。 在后一种情况下,必须包括足够的数据来重现错误。 如果列表阅读器无法重现,则无法对其进行诊断。 包括相关信息大大增加了获得有用答案的可能性。最后,您需要提供以下信息:
- 版本信息:Sqoop,Hadoop,OS,JDBC
- 使用–verbose 标志后的控制台运行日志,捕获所有的输出到重定向文件 sqoop import …&>sqoop.log
- 所有的sqoop 命令(如果使用了options-file的话也要包含文件信息)
- 期望输出和实际输出
- 表定义
- 可以重现问题的微量的输入数据集(特别是导出,格式错误的数据往往是罪魁祸首)
- Hadoop任务日志(通常任务日志包含描述问题的更多的信息)
- 输入目录的权限
虽然该项目有多个沟通渠道,但邮件列表不仅是最活跃的,而且也是决定项目本身的官方渠道。 如果您有兴趣了解更多关于或参与Apache Sqoop项目的信息,那么邮件列表是最好的方法。
Chapter 2 导入数据
接下来的几章,从这一章开始,致力于将数据从关系数据库或仓库系统传输到Hadoop生态系统。 在本章中,我们将介绍Sqoop的基本用例,描述您希望将数据传输到Hadoop生态系统中的数据库系统(例如,MySQL或Oracle)中的单个表中的各种情况。
我们将通过您可以复制并粘贴到控制台然后运行的示例来描述各种Sqoop功能。 为此,您需要首先设置关系数据库。 出于本书的目的,我们将使用帐户sqoop和密码sqoop的MySQL数据库。 我们将连接到名为sqoop的数据库。 您可以使用上传到与本书相关的GitHub项目的脚本mysql.credentials.sql轻松创建凭据。
如果要使用不同的凭据或连接到其他关系系统(例如,Oracle,PostgreSQL,Microsoft SQL Server或任何其他系统),则可以随时更改示例。 更多细节将在本书后面提供。 由于Sqoop主要关注数据传输,因此在运行Sqoop命令之前,我们需要在数据库中提供一些数据。 为了开始,我们创建了包含来自世界各地的几个城市的表城市(参见表2-1)。 您可以使用上述GitHub项目中的脚本mysql.tables.sql来创建和填充所需的所有表(表信息略)。
2.1. 全表传输
问题
您有一张关系型数据库的表(例如,MySQL)并且您需要传输表的数据到HDFS。
解决方案
使用sqoop 导入一张表是非常简单的:您发出sqoop import命令并且指明数据库认证和要传输的表名称
sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--password sqoop \
--table cities
讨论
导入整张表是sqoop中最常见和直接的用例之一,此命令的结果将是逗号分隔的CSV文件,其中每行存储在一行中。 示例表中的城市信息导入的结果如下所示:
1,USA,Palo Alto
2,Czech Republic,Brno
3,USA,Sunnyval
【注】请注意,此CSV文件将在HDFS中创建(而不是本地文件系统)
在这个示例中,Sqoop的主要二进制文件是用几个参数调用的,所以让我们更详细地讨论它们。 sqoop可执行文件之后的第一个参数是import,它指定了相应的工具。 当您想要将关系数据库中的数据传输到Hadoop时,可以使用导入工具。 在本书的后面我们将讨论导出工具,该工具用于向相反方向传输数据(第5章)。 下一个参数–connect包含数据库的JDBC URL。 URL的语法特定于每个数据库,因此您需要查阅数据库手册以获取正确的格式。 该URL后跟两个参数–username和–password,它们是Sqoop在连接到数据库时应使用的凭据。 最后,最后一个参数–table包含要传输的表的名称。
【注】除了使用–password参数在命令行上指定密码之外,还有两个选项。 这些选项在2.4部分中进一步描述。
既然您已经了解了每个参数的作用,那么让我们仔细看看执行此命令后会发生什么。首先,Sqoop将连接到数据库以获取表元数据:表列的数量,它们的名称以及关联的数据类型。例如,对于表city,Sqoop将检索有关三列的信息:id,country和city,其中int,VARCHAR和VARCHAR作为各自的数据类型。根据特定的数据库系统和表本身,也可以检索其他有用的元数据(例如,Sqoop可以确定表是否已分区)。此时,Sqoop不会在数据库和您的机器之间传输任何数据;相反,它正在查询目录表和视图。根据检索到的元数据,Sqoop将生成一个Java类,并使用您机器上可用的JDK和Hadoop库对其进行编译。接下来,Sqoop将连接到您的Hadoop集群并提交MapReduce作业。然后,作业的每个map任务将传输表的数据的一部分。由于MapReduce同时执行多个map,因此Sqoop将并行传输数据,以利用数据库服务器的潜力实现最佳性能。每个映射器直接在数据库和Hadoop集群之间传输表的数据。为避免成为传输瓶颈,Sqoop客户端充当监督者,而不是作为传输数据的积极参与者。这是Sqoop设计的关键原则。
2.2. 指明目标目录
问题
之前的例子运行得很好,所以您计划将Sqoop合并到Hadoop工作流程中。 为此,您需要指定应将数据导入的目录。
解决方案
sqoop提供了两个参数来指定自定义输出目录:–target-dir和–warehouse-dir。使用–target-dir参数指定HDFS上Sqoop应导入数据的目录。 例如,使用以下命令将表城市导入目录/ etl / input / cities:
sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--password sqoop \
--table cities \
--target-dir /etl/input/cities
如果要为您所有的sqoop jobs指定父目录,可以使用–warehouse-dir参数取代:
sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--password sqoop \
--table cities \
--warehouse-dir /etl/input/
讨论
默认情况下,Sqoop将在HDFS上创建一个与主目录中导入的表同名的目录,并在那里导入所有数据。 例如,当用户jarcec导入表城市时,它将存储在/ user / jarcec / cities中。 可以使用–targetdir参数将此目录更改为HDFS上的任意目录。 唯一的要求是在运行Sqoop命令之前,该目录不能存在。
sqoop将拒绝导入已经存在的目录来避免偶然覆盖已经存在的数据
如果要为多个表运行多个Sqoop作业,则需要在每次调用时更改–target-dir参数。 作为替代方案,Sqoop提供了另一个参数来选择输出目录。 参数–warehouse-dir允许您仅指定父目录,而不是直接指定最终目录。 Sqoop不是将数据写入仓库目录,而是创建一个与仓库目录中的表名相同的目录,并在那里导入数据。 这类似于Sqoop将数据导入HDFS上的主目录的默认情况,但明显的例外是–warehouse-dir参数允许您使用主目录以外的目录。 请注意,除非要导入具有相同名称的表,否则此参数不需要随每个表导入而更改。
与–target-dir参数一样,当最终输出目录已存在时,Sqoop将拒绝导入数据。 在这种情况下,名称由–warehouse-dir中指定的目录名称和已传输表的名称组成。
2.3. 导入数据子集
问题
您需要根据可以使用WHERE子句的SQL语句形式表达的各种条件,仅传输整个表的子集,而不是导入整个表。
解决方案
使用–where命令行参数来指定导入的数据满足SQL条件,比如,从cities表中只导入国家是USA的数据,你可以使用以下的sqoop命令:
sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--password sqoop \
--table cities \
--where "country = 'USA'"
讨论
Sqoop会将-where参数的内容传播给所有生成的获取数据的查询。 这提供了一种强大的功能,可以表达您的特定数据库服务器可以处理的任何条件。 可以使用任何特殊功能,转换甚至用户定义的功能。 由于SQL片段将在没有任何Sqoop处理的情况下传播到生成的查询中,因此任何无效片段都可能导致难以调试的非直观异常。 对于新的Sqoop用户,此参数可能会造成混淆。
使用–where参数时,请记住Sqoop传输的并行特性。 数据将在几个并发任务中传输。 任何昂贵的函数调用都会给数据库服务器带来很大的性能负担。 高级功能可以锁定某些表,防止Sqoop并行传输数据。 这将对转移性能产生不利影响。 对于高效的高级过滤,请在导入之前对数据库运行过滤查询,将其输出保存到临时表并运行Sqoop以将临时表导入Hadoop而不使用–where参数。
2.4. 保护你的密码
问题
在命令行界面中键入密码是不安全的。 可以通过列出操作系统的运行进程轻松检索它。
解决方案
除了使用–password参数在命令行上指定密码之外,还有两个选项。 第一个选项是使用参数-P,它将指示Sqoop从标准输入读取密码。 或者,您可以将密码保存在文件中,并使用参数–password-file指定此文件的路径。
下面是读取标准输入的使用方式:
sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--table cities \
-P
下面是使用文件的方式:
sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--table cities \
--password-file my-sqoop-password
讨论
让我们深入了解每种可用的方法。 第一种方法,使用参数-P,将指示Sqoop在采取任何其他Sqoop操作之前提示用户输入密码。 示例提示如下所示:
sqoop import -P --connect ...
Enter password:
您可以在提示中键入任何字符,然后在完成后按Enter键。 Sqoop不会回显任何字符,阻止有人在屏幕上读取密码。 将加载所有输入的字符并将其用作密码(最终输入除外)。 这种方法非常安全,因为密码不存储在任何地方,并且直接从用户加载到每个Sqoop执行上。 缺点是它不能通过脚本轻松实现自动化。‘
第二种解决方案是使用参数–password-file,它将从HDFS集群上的任何指定文件加载密码。 为了使此方法安全,您需要将文件存储在主目录中并将文件的权限设置为400,因此没有其他人可以打开文件并获取密码。 这种保护密码的方法可以通过脚本轻松实现自动化,如果您需要安全地自动化Sqoop工作流程,这是推荐的选项。 您可以使用以下shell和Hadoop命令来创建和保护您的密码文件。
echo "my-secret-password" > sqoop.password
hadoop dfs -put sqoop.password /user/$USER/sqoop.password
hadoop dfs -chown 400 /user/$USER/sqoop.password
rm sqoop.password
sqoop import --password-file /user/$USER/sqoop.password ...
Sqoop将读取文件的整个内容,包括任何尾随的空格字符,这些字符将被视为密码的一部分。 使用文本编辑器手动编辑密码文件时,请确保不要在文件末尾添加额外的空行。
2.5. 使用除CSV的其他文件格式
问题
默认情况下,Sqoop使用的制表符分隔的CSV文件不适合您的用例。 您更喜欢二进制格式而不是纯文本
解决方案
sqoop支持三种不同的文件格式,其中一种是文本,其他另外两种是二进制。分别是Avro和Hadoop的序列化文件。您可以使用–as-sequencefile 参数导入到序列化文件:
sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--password sqoop \
--table cities \
--as-sequencefile
也可以指定–as-avrodatafile参数使用Avro格式:
sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--password sqoop \
--table cities \
--as-avrodatafile
讨论
二进制格式比文本文件有一些好处。 首先,二进制格式非常适合存储图像或PDF文档等二进制值。 如果数据本身包含在文本文件中用作分隔符的字符,它们也更适合存储文本数据。 除了这些好处之外,还有一个缺点:为了访问二进制数据,您需要在应用程序中实现额外的功能或加载特殊库。
SequenceFile是一种特殊的Hadoop文件格式,用于存储对象并实现Writable接口。 这种格式是为MapReduce定制的,因此它希望每条记录包含两部分:键和值。 Sqoop没有键值对的概念,因此使用一个名为NullWritable的空对象代替值。 对于密钥,Sqoop使用生成的类。 为方便起见,将生成的类复制到执行Sqoop的目录中。 如果需要读取Sqoop生成的SequenceFile,则需要将此生成的类集成到应用程序中。
Apache Avro是一种通用数据序列化系统。 指定–asavrodatafile参数指示Sqoop使用其紧凑且快速的二进制编码格式。 Avro是一个非常通用的系统,可以存储任意数据结构。 它使用称为模式的概念来描述文件中存储的数据结构。 模式通常编码为JSON字符串,以便人眼可以辨认。 Sqoop将根据从数据库服务器检索到的元数据信息自动生成模式,并将在每个生成的文件中保留模式。 您的应用程序需要依赖Avro库才能打开和处理存储为Avro的数据。 您不需要导入任何特殊类,例如在SequenceFile案例中,因为所有必需的元数据都嵌入在导入的文件中。
2.6. 压缩导入的数据
问题
您希望通过对生成的文件使用压缩来减少HDFS占用的总体大小。
解决方案
使用–compress参数压缩:
sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--table cities \
--compress
讨论
Sqoop利用Hadoop的执行引擎MapReduce来使用Hadoop固有的并行性来执行数据传输。 由于MapReduce已经拥有出色的压缩支持,Sqoop只是重用其强大的功能来提供压缩选项。 默认情况下,使用–compress参数时,输出文件将使用GZip编解码器进行压缩,所有文件的最终扩展名为.gz。 您可以使用–compression-codec参数选择任何其他编解码器。 以下示例使用BZip2编解码器而不是GZip(HDFS上的文件最终将以.bz2为扩展名):
sqoop import \
--compress \
--compression-codec org.apache.hadoop.io.compress.BZip2Codec
利用MapReduce压缩功能的另一个好处是Sqoop可以开箱即用地使用所有Hadoop压缩编解码器。 您不需要在Sqoop本身内启用压缩代码。 也就是说,Sqoop不能使用Hadoop不知道的任何压缩算法。 在将其与Sqoop一起使用之前,请确保在群集中的所有节点上正确安装和配置了所需的编解码器。
当Sqoop将压缩委托给MapReduce引擎时,您需要确保在Hadoop配置中允许压缩映射输出。 例如,如果在mapred-site.xml文件中,属性mapred.output.compress被设置为false并带有最终标志,那么即使您使用 --compress 来调用它,Sqoop也无法压缩输出文件。
选定的压缩编解码器可能会对后续处理产生重大影响。 有些编解码器不支持在不读取所有先前内容的情况下寻找压缩文件的中间部分,从而有效地防止Hadoop以并行方式处理输入文件。 您应该使用可拆分编解码器来处理您计划在后续处理中使用的数据。
2.7. 传输更快
问题
Sqoop是一个很好的工具,并且它可以很好地处理批量传输,sqoop可以运行得更快吗?
解决方案
对于某些数据库,您可以使用–direct参数来使用直连模式:
sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--table cities \
--direct
讨论
直连模式不是使用JDBC接口传输数据,而是将数据传输到数据库供应商提供的本机实用程序。 对于MySQL来说,mysqldump和mysqlimport将用于从数据库服务器检索数据或移回数据。 对于PostgreSQL来说,Sqoop将利用pg_dump实用程序导入数据。 使用本机实用程序将极大地提高性能,因为它们经过优化可提供最佳的传输速度,同时减轻数据库服务器的负担。 这种更快的导入会带来一些限制。 例如,并非所有数据库都有可用的本机实用程序。 此模式不适用于每个受支持的数据库。 开箱即用的仅支持MySQL和PostgreSQL。
由于所有数据传输操作都是在生成的MapReduce作业内执行的,并且因为数据传输在直接模式下被推迟到本机实用程序,因此您需要确保所有Hadoop TaskTracker节点上都可以使用这些本机实用程序。 例如,在MySQL的情况下,托管TaskTracker服务的每个节点都需要安装mysqldump和mysqlimport实用程序。
直连模式的另一个限制是并非所有参数都受支持。 由于本机实用程序通常会生成文本输出,因此SequenceFile或Avro等二进制格式将不起作用。 此外,在所有情况下可能都不支持自定义转义字符,类型映射,列和行分隔符或NULL替换字符串的参数。
参照
Sqoop还通过一个特殊的内置连接器支持PostgreSQL的pg_bulkload实用程序。 您可以在7.3中找到有关它的更多信息。
2.8. 覆盖类型映射
问题
Sqoop在关系数据库和 Hadoop 之间提供的默认类型映射通常工作得很好。但有时还是需要类型装换。
解决方案
使用参数–map-column-java覆盖默认类型映射。 例如,要将列id的类型覆盖为Java的Long类型:
sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--table cities \
--map-column-java id=Long
讨论
这个参数接受以逗号分割的键值对队列,对于键值对以等号来表示,明确的列名作为键,对于JAVA类型作为值。举例来说,如果你需要改变三列c1,c2和c3的数据类型分别改为float,string和string,于是在sqoop命令行中将会包含一下片段:
sqoop import --map-column-java c1=Float,c2=String,c3=String ...
当在MySQL表中有一个以unsigned int类型定义的主键且这列的值大于2147483647时使用这个参数能够容易处理这种情况。 在这种特殊的情况下,MySQL会显示这个列的类型为integer,即使这列的实际类型是unsigned int类型,这种类型最大的值为4294967295由于显示的 类型是int,sqoop将会使用java的int类型,但是这种类型无法保存大于2147483647的值,你需要手动的提供更合适的类型转换。 使用这个参数不限于对MySQL的unsigned类型问题,这个也适用于在sqoop的默认类型不适合你的环境时的情况,sqoop从数据库数据结构中 获取所有的元数据时不需要和存储的数据发生联系,所以对于数据的额外信息需要和数据分开存储,特别是在你想充分使用数据时 如你想使用blob或binary类型来存储文本数据以避免编码问题,可以使用 --column-map-JAVA列参数来重设类型,并导入文本数据。
2.9. 控制并行度
问题
Sqoop默认使用四个并发映射任务将数据传输到Hadoop。 使用更大的并发度应该可以减少更大的表传输所有数据所需的时间。 您希望灵活地更改每个作业使用的映射任务的数量。
解决方案
如果希望Sqoop使用不同数量的并行度,请使用参数–num-mappers。 例如,要使用10个并发任务,您将使用以下Sqoop命令:
sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--password sqoop \
--table cities \
--num-mappers 10
讨论
参数–num-mappers使用提示: 在大多数情况下,您将获得指定数量的映射器,但不能保证。 如果您的数据集非常小,Sqoop可能会使用较少数量的映射器。 例如,如果您只传输4行但将–num-mappers设置为10个映射器,则Sqoop只使用4个映射器,因为其他6个映射器将不会传输任何数据。
控制Sqoop用于传输数据的并行度是控制数据库负载的主要方法。 使用更多映射器将导致更多的并发数据传输任务,这可以更快地完成作业。 但是,它还会增加数据库的负载,因为Sqoop将执行更多的并发查询。 这样做可能会影响服务器上运行的其他查询,从而对生产环境产生负面影响。 增加映射器的数量并不总能导致更快的作业完成。 在增加映射器的数量的同时,还有一点让数据库完全饱和。 超过这一点增加映射器的数量不会导致更快的作业完成; 事实上,它会产生相反的效果,因为您的数据库服务器花费更多时间进行上下文切换而不是提供数据。
map的最佳数量取决于许多变量:您需要考虑数据库类型,用于数据库服务器的硬件以及对数据库需要服务的其他请求的影响。 没有适用于所有场景的最佳映射器数量。 相反,我们鼓励您尝试为您的环境和用例找到最佳的并行度。 从少量的映射器开始,慢慢增加,而不是从大量的映射器开始,向下工作是一个好主意。
2.10. 编码NULL值
问题
Sqoop使用空字符串常量对数据库NULL值进行编码。 您的下游处理(Hive查询,自定义MapReduce作业或Pig脚本)使用不同的常量来编码缺失值。 现在您想覆盖默认值。
解决方案
您可以使用–null-string和–null-nonstring参数将NULL替换覆盖为任意值字符串。 例如,使用以下命令将其覆盖为\ N:
sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--password sqoop \
--table cities \
--null-string '\\N' \
--null-non-string '\\N'
讨论
几乎所有关系数据库都允许您将列定义为可选列,从而允许列与任何值无关。 此缺失信息通常称为NULL值。 例如,BOOL列通常只包含两个不同的值:true和false。 此外,如果在表创建期间您明确允许该列是可选的,则列可以包含值NULL。 除了列的常用数据之外,数据库通常还将NULL值存储为额外位。 由于Sqoop支持将数据导入到本身不支持NULL值的格式(例如,CSV文件),因此需要将缺失值编码到数据本身中。 默认情况下,Sqoop使用字符串常量null(小写)来表示缺失值。 如果您的数据可以包含与常规值相同的字符串常量,或者您的下游处理期望不同的替换字符串常量,则此默认常量可能不适合您的需要。
为了更容易与其他Hadoop生态系统组件集成,Sqoop在处理缺失值时区分了两种不同的情况。 对于使用VARCHAR,CHAR,NCHAR,TEXT和其他一些类型定义的基于文本的列,可以使用参数–null-string覆盖默认替换字符串。 对于所有其他列类型,可以使用–null-nonstring参数覆盖替换字符串。 某些连接器可能不支持不同列类型的不同替换字符串,因此可能需要您在两个参数中指定相同的值。
在内部,-null(-non)-string参数中指定的值在生成的Java代码中编码为字符串常量。 您可以通过使用八进制表示指定任意字符串来利用此功能,而无需担心正确的编码。 不幸的副作用是要求您在命令行上正确转义字符串,以便它可以用作有效的Java字符串常量。
如果要使用\ N编码缺失值,则需要在命令行中指定\ N; \是Java中特殊的转义字符串字符,将由编译器解释。 您的shell将尝试为您取消参数,因此您需要将这些参数括在单引号(’)中。 使用双引号(“)将使shell解释转义字符,在将参数传递给Sqoop之前更改参数。
参照
导出工具使用不同的参数来覆盖NULL值; 它们将在5.8节中进一步描述。
2.11. 导入所有表
问题
您希望使用一个命令一次性导入数据库中的所有表,而不是逐个导入表。
解决方案
您可以使用import-all-tables工具,而不是将导入工具用于一个表。 例如,要从示例数据库导入所有表,您将使用以下Sqoop命令:
sqoop import-all-tables \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--password sqoop
讨论
使用import-all-tables工具时,Sqoop将使用目录查询来检索数据库中所有表的列表。 随后对于每个表,Sqoop将在内部调用导入工具将您的数据导入Hadoop。 将按顺序导入表,以避免通过同时导入多个表而创建的数据库服务器上的任何不必要的负担。 使用这一个命令,Sqoop会将给定数据库的整个内容导入Hadoop中。
如果您需要导入除几个表之外的所有表,则可以使用参数–exclude-tables接受以逗号分隔的表名列表,这些表名应从批量导入中排除。 例如,如果您需要从数据库导入除城市和国家/地区之外的所有表,则可以使用以下命令:
sqoop import-all-tables \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--password sqoop \
--exclude-tables cities,countries
导入所有表将在内部调用通常的导入工具来传输每个表。 您会发现许多导入参数不能与import-all-tables工具一起使用。
比如,您不能使用参数–target-dir,因为这将指示Sqoop将所有表导入到同一目录中,从而导致HDFS上的文件混乱。
使用–warehouse-dir参数就是很好的选择,因为此参数可以很容易地用于所有导入的表。 您可以利用参数–exclude-tables跳过导入需要特殊参数的表; 然后,您可以使用导入工具单独导入它们,这允许您指定其他参数。
Chapter 3的翻译还在更新中。