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

时间:2017-03-08 11:49:53

标签: oracle hive sqoop avro

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

第一个选项

create-hive-table 工具根据先前导入HDFS的数据库表或计划导入的数据库表填充Hive Metastore,其中包含表的定义。在以下示例中,我们将创建表 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(Metastore)中创建表
  • 将数据从RDBMS导入HDFS中的表目录

示例:

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

这两个选项中哪一个更好?

1 个答案:

答案 0 :(得分:0)

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

我必须面对的一个案例是你需要在Hive中创建一个外部表。由于Sqoop不支持创建Hive外部表,因此需要另一种解决方法。

关闭主题 - Hive中的内部与外部表

HIVE中的外部表

(在HDFS上存储数据)

什么是外部表格

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

如果您:

,请使用外部表格
  • 想要管理HIVE以外的数据。因此,数据文件由不锁定文件的现有程序读取和处理,例如您计划使用ETL工具加载/合并数据文件等。
  • 想要将最新信息加载到表中但仍想要 为了监管/法律目的,将旧数据集保留在HDFS上的文件中。
  • 不打算从其他表架构创建表格,例如 将table1创建为(Select * from table2)

  • 即使在DROP之后,数据也需要保留在基础位置 表。如果您指向多个模式(表或表),这可以适用 在单个数据集中或者如果您正在迭代各种数据集 可能的模式。

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

  • Hive不应该拥有您拥有的数据和控制设置,dirs等 另一个会做这些事情的程序或过程。

HIVE中的内部表格

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

什么是内部表格

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

  • 删除表会删除元数据&来自masternode和。的数据 HDFS分别

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

如果您:

,请使用内部表格
  • 想暂时存储数据。

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

来源:

解决方案(使用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 getschema   HDFS:// urlhadoop:端口/用户/ my_user / dummytab /部分-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'地点   ' HDFS:///用户/ my_user /表/' 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