【问题标题】:Import Oracle Data To Hadoop将 Oracle 数据导入 Hadoop
【发布时间】:2014-08-04 18:33:00
【问题描述】:

预警:我是数据科学/数据工程师/hadoop 领域的新手;我一直在寻找将大量数据(数百万行)导入我们设置的 Hadoop 集群的解决方案。数据库是Oracle,我一直在探索很多方法来运行这样的工作;最终目标是尽可能接近集群内数据的实时导入。

我在这里看到的第一个工作是通过使用 sqlplus 的 shell 文件。我创建了这个 sql 脚本来运行并将表和日期作为工作参数,然后为我们希望每天在集群中查看的特定表运行 shell 脚本。然后可以安排此任务在每晚自动执行。这种方法的问题在于,它的速度似乎太慢了。据我所知,UTL_FILE 和 Pro*C 同样慢。

这让我发现了我们已经安装的 Sqoop,但我不明白为什么它比 sqlplus 快得多。使用 SQLPlus,我只需选择表语句并将其假脱机到一个文本分隔的文件(比如 csv)中。这是一个过程。在 Sqoop 中,它是如何进行多个并行调用的?

任何对此问题的见解将不胜感激!

【问题讨论】:

    标签: sql oracle hadoop sqlplus sqoop


    【解决方案1】:

    你知道“UTL_FILE 和 Pro*C 同样慢”……你是怎么学的?你测量了什么?我想知道为什么 Pro*C 应该很慢?毕竟是C。

    当导入 hadoop HDFS 比导入本地文件系统更快时——它们都在类似的磁盘上——那么肯定是因为一个正在执行顺序写入(附加块),而另一个正在写入随机块...

    当您想要接近实时导入时,您必须维护某种更改跟踪。在 Oracle 中执行此操作的最佳方法是使用物化视图日志。

    【讨论】:

    • 我说它们很慢,因为它们是按顺序写入行的。
    • 这不是工具的错,而是它们的使用方式。甚至 utl_file 也能够以接近 os 的速度写入文件
    【解决方案2】:

    Sqoop 通过利用 rowid 的概念避免读取相同的 oracle 块。这样做可以确保没有两个并行运行的任务会从同一个 Oracle 块中读取数据。这降低了数据库服务器上的磁盘操作,显着提高了性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      相关资源
      最近更新 更多