Sqoop - 使用 Avro 格式将表从 Oracle 导入 Hive 的最佳选择是啥?

Posted

技术标签:

【中文标题】Sqoop - 使用 Avro 格式将表从 Oracle 导入 Hive 的最佳选择是啥?【英文标题】:Sqoop - What is the best option to import a table from Oracle to Hive using the Avro format?Sqoop - 使用 Avro 格式将表从 Oracle 导入 Hive 的最佳选择是什么? 【发布时间】:2017-03-08 11:49:53 【问题描述】:

使用 Sqoop 将表从 Oracle 导入 Hive 有(至少)两个选项。

第一个选项

create-hive-table 工具使用基于先前导入 HDFS 的数据库表或计划导入的数据库表的表定义填充 Hive 元存储。在以下示例中,我们正在创建表 emps

$ sqoop create-hive-table \
--connect jdbc:mysql://localhost/dualcore \
--username training \
--password training \
--table employees \
--hive-table emps

然后你执行导入到 emps 表中

 $ sqoop import \
 --connect jdbc:mysql://localhost/dualcore \
 --username training \
 --password training \
 --m 1 \
 --target-dir /queryresult \
 --hive-table emps \
 --hive-import

https://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_literal_sqoop_create_hive_table_literal

第二个选项(看起来更高效)

使用 --hive-import 命令:

在 Hive(元存储)中创建表 将数据从 RDBMS 导入到 HDFS 中的表目录

示例:

 $ sqoop import \
 --connect jdbc:mysql://localhost/dualcore \
 --username training \
 --password training \
 --m 1 \
 --target-dir /queryresult \
 --table employees \
 --hive-import

这两个选项哪个更好?

【问题讨论】:

我总是使用第二个,因为它只是一个执行相同操作的命令。使用hive-import 确实会使导入为镶木地板表之类的事情变得更复杂一些,但是一旦你克服了这一点,如果你可以一步完成,为什么还要分两步做某事......请注意,使用--hive-import 时您需要指定其他选项,例如 --hive-database--hive-table 谢谢 spijs 我也认为这是最好的选择。然而,他们要求我使用第一个选项,并在下面添加的答案中解释了为什么在某些情况下最好使用两个不同的命令,一个用于生成表格,另一个用于导入数据。 【参考方案1】:

即使第二个选项看起来更有效,但在某些情况下是不可能的。

我不得不面对的一个情况是当您需要在 Hive 中创建一个外部表时。由于 Sqoop 不支持创建 Hive 外部表,因此需要另一种解决方法。

题外话 - Hive 中的内部表与外部表

HIVE 中的外部表

(将数据存储在 HDFS 上)

什么是外部表

外部表在 HDFS 服务器上存储文件,但表不是 完全链接到源文件。 如果删除外部表,文件仍保留在 HDFS 上 服务器。 文件和表格链接在那里,但只读。 例如,如果您在 HIVE 使用 HIVE-QL 并将表链接到文件“flat_file.txt”,然后 从 HIVE 中删除“my_test”,这不会删除“flat_file.txt” 来自 HDFS。 任何有权访问 HDFS 的人都可以访问外部表文件 文件结构,因此需要在 HDFS 上管理安全性 文件/文件夹级别。 在主节​​点上维护元数据并删除外部表 从 HIVE,只删除元数据而不是数据/文件。

如果您满足以下条件,请使用外部表:

想要在 HIVE 之外管理数据。因此,数据文件由不锁定文件的现有程序读取和处理,例如您打算使用 ETL 工具来加载/合并数据文件等。 想将最新信息加载到表中但仍想 出于监管/法律目的,将旧数据集保留在 HDFS 上的文件中。

不打算从另一个表架构创建表,例如 将table1创建为(从table2中选择*)

即使在 DROP 之后,数据也需要保留在底层位置 桌子。如果您指向多个模式(表或 视图)在单个数据集上,或者如果您正在迭代各种 可能的模式。

您想使用自定义位置,例如 ASV。

Hive 不应该拥有数据和控制设置、目录等,你有 另一个可以做这些事情的程序或进程。

HIVE 中的内部表

(将数据存储在 HDFS 上,但在某种受限区域内)

什么是内部表

内部表文件安全仅通过 HIVE 控制。例如。 tbl_batting 只能通过 HDFS 内部帐户访问:r = read w = write x = execute

删除表会从主节点和数据中删除元数据和数据 HDFS分别

需要在 HIVE 中管理安全性,可能在架构中 级别(取决于组织到组织)。 HDFS 安全性已失效 在这种情况下的范围。

如果您满足以下条件,请使用内部表:

想要临时存储数据。

想使用 HIVE 管理表和数据的生命周期。

来源:

https://www.linkedin.com/pulse/internal-external-tables-hadoop-hive-big-data-island-amandeep-modgil https://blogs.msdn.microsoft.com/cindygross/2013/02/05/hdinsight-hive-internal-and-external-tables-intro/

解决方案(使用 Sqoop 在 Hive 中创建外部表的解决方法)

需要从 Oracle 导入表样本来创建 avro 文件,该文件将用于生成 hive 表。然后将整个表从 oracle 导入到 hdfs。

1 生成 Avro 文件

sqoop import --connect jdbc:oracle:thin:@//url:port/database \ --username my_user --password my_password -m 1 --fetch-size 10 \ --table table_to_import \ --columns columns_to_import \ --create-hive-table --hive-table dummy_table \ --as-avrodatafile --target-dir hdfs:///user/my_user/dummytab/

2 在本地生成架构

avro-tools 获取模式 hdfs://urlhadoop:port/user/my_user/dummytab/part-m-00000.avro

schematab.avsc

3 将架构移回 hdfs

hdfs dfs -copyFromLocal schematab.avsc /user/my_user/schemas

4 在 Hive 中创建表

hive -e "创建外部表 MyHiveTable 行格式 SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' 存储为输入格式 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' 输出格式 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' 位置 'hdfs:///user/my_user/tables/' TBLPROPERTIES ('avro.schema.url'='hdfs:///user/my_user/schemas/schematab.avsc');"

5 导入所有数据

sqoop import --connect jdbc:oracle:thin:@//url:port/database \ --username my_user --password my_password -m 1 \ --table table_to_import \ --columns columns_to_import \ --hive-table MyHiveTable \ --as-avrodatafile --target-dir hdfs:///user/my_user/tables/ --append

来源:http://wpcertification.blogspot.com/2015/05/importing-data-from-sqoop-into-hive.html?_sm_au_=iVV10VW0vW1Z7Z42

【讨论】:

以上是关于Sqoop - 使用 Avro 格式将表从 Oracle 导入 Hive 的最佳选择是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sqoop 将表从 AWS RDS 移动到 AWS EMR 的问题

如何使用 Java 将表从 MySQL 导入 Hive?

Dataproc 上的 Sqoop 无法将数据导出为 Avro 格式

Sqoop 导入具有 avro 格式的换行符的数据,然后使用 hive 查询

avro 格式的日期数据类型的 Sqoop 导入

SQOOP 导出失败