使用 Sqoop 并行导入 Oracle 表的最佳方法是啥?

Posted

技术标签:

【中文标题】使用 Sqoop 并行导入 Oracle 表的最佳方法是啥?【英文标题】:What is the best way to import Oracle tables in parallel using Sqoop?使用 Sqoop 并行导入 Oracle 表的最佳方法是什么? 【发布时间】:2019-04-28 16:54:19 【问题描述】:

我正在使用 Sqoop 将 oracle 表导入 HDFS。

我有大约 50 个表要导入,在 50 个表中,有 10-15 个表太大(大约 50GB)。

我第一次想将它们作为完整加载导入,之后我将只导入增量数据。

目前我准备了2个shell脚本如下:- 1. 全转储脚本(每天需要全转储) 2. 增量数据脚本(因为我已经进行了完全转储,现在它只会获取增量数据)。

我已将这 2 个脚本安排在特定时间,比如早上 7 点。

两个脚本都运行良好,但如您所见,它只会并行执行两个 sqoop 作业。

但我想一次启动 4 个 sqoop 作业以获得更多并行度。

那么我如何通过并行执行超过 2 个 sqoop 作业来实现更多的并行性。

我们将不胜感激任何有关这方面的帮助。

这是我的 shell 脚本示例:-

sqoop job --exec sqoop_job1

sqoop job --exec sqoop_job2

【问题讨论】:

【参考方案1】:

Apache Oozie 是一种编排工具,可以帮助您根据需要按顺序或并行运行作业。如果您安装了 Apache Oozie,您可以尝试一下。它对 sqoop 有一个动作,你不需要通过 shell 脚本。 Oozie 具有工作流或编排工具的所有功能,例如重新运行或完全加载无法停止一切等

定义如何运行多个作业的示例 workflow.xml

        <?xml version="1.0" encoding="UTF-8"?>
<workflow-app xmlns="uri:oozie:workflow:0.2" name="sqoop-wf-fork-example">

    <start to="sqoop-wf-fork"/>

    <fork name="sqoop-wf-fork">
        <path start="sqoop-categories"/>
        <path start="sqoop-customers"/>
    </fork>


    <action name="sqoop-categories">
        <sqoop xmlns="uri:oozie:sqoop-action:0.2">
            <job-tracker>$jobTracker</job-tracker>
            <name-node>$nameNode</name-node>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>$queueName</value>
                </property>
            </configuration>
            <command>import --connect jdbc:mysql://localhost:3306/retail_db --username root --password cloudera --table categories --driver com.mysql.jdbc.Driver --delete-target-dir --m 1</command>
        </sqoop>
        <ok to="joinActions"/>
        <error to="fail"/>
    </action>

    <action name="sqoop-customers">
        <sqoop xmlns="uri:oozie:sqoop-action:0.2">
            <job-tracker>$jobTracker</job-tracker>
            <name-node>$nameNode</name-node>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>$queueName</value>
                </property>
            </configuration>
            <command>import --connect jdbc:mysql://localhost:3306/retail_db --username root --password cloudera --table customers --driver com.mysql.jdbc.Driver --delete-target-dir --m 1</command>
        </sqoop>
        <ok to="joinActions"/>
        <error to="fail"/>
    </action>

    <join name="joinActions" to="end-wf"/>

    <kill name="fail">
        <message>Sqoop failed, error message[$wf:errorMessage(wf:lastErrorNode())]</message>
    </kill>
    <end name="end-wf"/>
</workflow-app>

【讨论】:

以上是关于使用 Sqoop 并行导入 Oracle 表的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

利用SQOOP将数据从数据库导入到HDFS(并行导入,增量导入)

运行 Sqoop 导入和导出时如何找到最佳映射器数量?

如何用sqoop查看oracle的表

sqoop安装及使用

sqoop导入数据到mysql原理_sqoop的详细使用及原理

如何将mysql数据导入Hadoop之Sqoop安装