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



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

第一个选项

创建配置单元表工具使用基于先前导入到 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中创建一个外部表时。由于 Sqoop 不支持创建 Hive 外部表,因此需要另一种解决方法。

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

蜂巢中的外部表

(将数据存储在HDFS上)

什么是外部表

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

在以下情况下使用外部表:

  • 想要管理 Hare 外部的数据。因此,数据文件由不锁定文件的现有程序读取和处理,例如,您计划使用 ETL 工具来加载/合并数据文件等。
  • 想要将最新信息加载到表中,但仍希望 出于监管/法律目的,将旧数据集保留在 HDFS 上的文件中。
  • 不打算从另一个表模式创建表,例如 将表1创建为(从表2中选择*)

  • 即使在 DROP 之后,数据也需要保留在底层位置 桌子。如果要指向多个架构(表或 视图),或者如果您正在遍历各种数据集 可能的架构。

  • 您希望使用自定义位置,例如 ASV。

  • Hive 不应该拥有数据和控制设置、目录等,你有 另一个程序或进程将执行这些操作。

蜂巢中的内部表

(将数据存储在HDFS上,但存储在一种限制区域)

什么是内部表

  • 内部表文件的安全性仅通过 Hare 控制。例如 tbl_batting只能通过 HDFS 内部帐户访问:
    r = 读取 w = 写入 x = 执行

  • 删除表会从主节点中删除元数据和数据,并且 分别是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 文件,该文件将用于生成配置单元表。然后,您将整个表从oracle导入hdfs。

1 生成 Avro 文件

sqoop import --connect jdbc:oracle:thin:@//url:port/database \ --用户名my_user --密码 my_password -m 1 --获取大小 10 \ --表 table_to_import \ --列 columns_to_import \ --创建配置单元表 --配置单元表 dummy_table \ --as-avrodatafile --target-dir hdfs:///user/my_user/dummytab/

2 在本地生成架构

avro-tools getschema 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 "CREATE EXTERNAL TABLE MYHIVETABLE ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' 存储为 INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' 输出格式 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' LOCATION "hdfs:///user/my_user/tables/"特利属性 ('avro.schema.url'='hdfs:///user/my_user/schemas/schematab.avsc');">

5 导入所有数据

sqoop import --connect jdbc:oracle:thin:@//url:port/database \ --用户名my_user --密码 my_password -m 1 \ --表 table_to_import \ --列 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

最新更新