使用 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(并行导入,增量导入)