Sqoop 问题与答案
要连接到不同的关系数据库,sqoop 需要一个连接器。几乎每个 DB 供应商都将此连接器作为特定于该 DB 的 JDBC 驱动程序提供。因此,Sqoop 需要它需要与之连接的每个数据库的 JDBC 驱动程序。
不。Sqoop 需要 JDBC 和连接器才能连接到数据库。
要指定 HDFS 中的特定目录,请使用 --target-dir,但要指定所有 sqoop 作业的父目录,请使用 --warehouse-dir。在这种情况下,在父目录下,sqoop 会创建一个与表同名的目录。
通过在 sqoop import 语句中使用 WHERE 子句,我们可以仅导入行子集。
我们可以在数据库上运行过滤查询,并将结果保存到数据库中的临时表中。
然后使用 sqoop import 命令而不使用 --where 子句
--password-file 选项可以在 sqoop 脚本中使用,而 -P 选项从标准输入读取,从而防止自动化。
.gz
要获取除 .gz 以外的格式(如 .bz2)的 sqoop 导入的输出文件,我们使用 --compress -code参数。
数据库用于支持更快加载的本机实用程序不适用于 SequenceFile 等二进制数据格式。
参数 --num-mapers 用于控制 sqoop 命令执行的映射器数量。我们应该从选择少量的映射任务开始,然后逐渐扩大规模,因为最初选择大量的映射器可能会降低数据库端的性能。
使用命令
sqoop import-all-tables
--connect
--usrename
--password
--exclude-tables table1,table2 ..
这将导入除 exclude-tables 子句中提到的表之外的所有表。
sqoop 可以有两种方法。
a − 使用带有附加选项的 --incremental 参数,其中检查某些列的值,并且仅在修改值的情况下才将行作为新行导入。
b −使用带有 lastmodified 选项的 --incremental 参数,其中检查源中的日期列是否有上次导入后更新的记录。
选项文件用于 sqoop,以在文件中指定命令行值并在 sqoop 命令中使用它。
例如,--connect 参数的值和 --user name 值可以存储在一个文件中,并在不同的 sqoop 命令中反复使用。
是的,我们可以在运行时使用 --exec 选项向已保存的作业添加参数
sqoop job --exec jobname -- -- newparameter
通过使用 --query 参数代替 --table 参数,我们可以指定一个 sql 查询。查询结果将被导入。
使用 --split-by 参数,我们指定列名,sqoop 将根据该列名将要导入的数据分成多个块以并行运行。
通过使用 --mapreduce-job-name 参数。以下是命令的示例。
sqoop import \ --connect jdbc:mysql://mysql.example.com/sqoop \ --username sqoop \ --password sqoop \ --query 'SELECT normcities.id, \ countries.country, \ normcities.city \ FROM normcities \ JOIN countries USING(country_id) \ WHERE $CONDITIONS' \ --split-by id \ --target-dir cities \ --mapreduce-job-name normcities
我们可以使用 --boundary –query 参数,在该参数中我们指定列的最小值和最大值,根据该值可以拆分成多个 mapreduce 任务。这样可以加快速度,因为首先执行 –boundary-query 参数内的查询,并且作业已准备好在执行主查询之前要创建多少个 mapreduce 任务的信息。
参数"sqoop.export.records.per.statement"指定每个插入语句中将使用的记录数。
但参数"sqoop.export.statements.per.transaction"指定在事务期间可以并行处理多少个插入语句。
使用 staging-table 选项,我们首先将数据加载到暂存表中,然后仅在暂存加载成功的情况下将其加载到最终目标表中。
通过指定 –clear-staging-table 选项,我们可以在加载暂存表之前清除暂存表。可以反复执行此操作,直到我们在暂存中获得正确的数据。
参数 --update-key 可用于更新现有行。其中,使用逗号分隔的列列表来唯一标识一行。所有这些列都用于生成的 UPDATE 查询的 WHERE 子句中。所有其他表列都将用于查询的 SET 部分。
截断目标表并再次加载。
通过使用 –column 参数,我们将所需的列名称作为逗号分隔的值列表提及。
通过使用 –input-null-string 参数,我们可以指定一个默认值,这样就可以将行插入到目标表中。
Oozie 具有内置的 sqoop 操作,我们可以在其中提及要执行的 sqoop 命令。
一些导入的记录可能在所有列中都有空值。由于 Hbase 不允许一行中出现所有空值,因此这些行将被删除。
$ sqoop list-databases --connect jdbc:mysql://database.example.com/
Sqoop 可以使用任何 SQL 查询从关系数据库导入数据,而不仅仅是使用表和列名参数。
通过在 import 命令中使用 –m 1 子句,sqoop 仅创建一个 mapreduce 任务,该任务将按顺序导入行。
Mapreduce 集群配置为运行 4 个并行任务。因此,sqoop 命令的并行任务数必须小于或等于 MapReduce 集群的并行任务数。
--split-by 子句提到了列名,根据该列的值,数据将分为记录组。这些记录组将由 mapreduce 任务并行读取。
它将数据从数据库导入到位于目录 /dest 中名为 foo 的 HDFS 文件
使用 --append 参数,Sqoop 将数据导入临时目录,然后以不与该目录中现有文件名冲突的方式将文件重命名为正常目标目录。
通过使用 --map-column-java 属性,我们可以配置映射之间。
下面是一个例子
$ sqoop import ... --map-column-java id = String, value = Integer
通过使用 lastmodified 模式。导入检查列的时间戳比使用 --last-value 指定的时间戳更新的行。
分隔文本和序列文件。
$ sqoop import --connect jdbc:mysql://host/dbname --table EMPLOYEES \ --columns "employee_id,first_name,last_name"
$ sqoop import --connect jdbc:mysql://host/dbname --table table_name\ -m 8
它导入了 2012 年 11 月 9 日之后加入的员工。
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \ --split-by dept_id
在已经导入表的前 100,0 行后,执行新数据的增量导入
sqoop import-all-tables --connect jdbc:mysql://host/DB1
$ sqoop export --connect jdbc:mysql://host/DB1 --call proc1 \ --export-dir /Dir1
它是 Sqoop 用来托管共享元数据存储库的工具。多个用户和/或远程用户可以定义和执行此元存储中定义的已保存作业(使用 sqoop 作业创建)。
必须将客户端配置为在 sqoop-site.xml 中或使用 --meta-connect 参数连接到元存储。
合并工具组合了两个数据集,其中一个数据集中的条目应覆盖旧数据集的条目,仅保留两个数据集之间记录的最新版本。
sqoop 作业 –list
Sqoop job –show myjob
运行 sqoop-metastore 会在当前计算机上启动共享 HSQLDB 数据库实例。
metastore 数据库可以托管在 Hadoop 集群内部或外部的任何地方。