将参数传递给sqoop作业

a8jjtwal  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(320)

我正在crceating一个sqoop作业,它将被安排在oozie中,以便将每日数据加载到hive中。
我想根据日期作为参数向配置单元中进行增量加载,该参数将传递给sqoop作业
在研究了很多之后,我找不到一种方法将参数传递给sqoop作业

9jyewag0

9jyewag01#

下面的解决方案来自apachesqoop食谱。
保留上次导入的值
问题
增量导入是您经常使用的一个很好的功能。承担起记住最后一次进口价值的责任是一件麻烦事。
解决方案
您可以利用内置的sqoop元存储,它允许您保存所有参数以供以后重用。可以使用以下命令创建简单的增量导入作业:

sqoop job \
--create visits 3.3. Preserving the Last Imported Value | 27
-- import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--password sqoop \
--table visits \
--incremental append \
--check-column id \
--last-value 0

然后从 --exec parameter :

sqoop job --exec visits

讨论
sqoop元存储是sqoop的一个强大部分,它允许您保留作业定义并随时轻松地运行它们。每个保存的作业都有一个用于引用的逻辑名称。您可以使用 --list 参数:

sqoop job --list

可以删除不再需要的旧作业定义 --delete 参数,例如:

sqoop job --delete visits

最后,还可以使用 --show parameter ,例如:

sqoop job --show visits

输出 --show 命令将以属性的形式出现。不幸的是,sqoop当前无法重建用于创建已保存作业的命令行。
内置sqoop元存储最重要的好处是与增量导入结合使用。在每个成功的增量作业之后,sqoop将自动将最后一个导入的值序列化回metastore。这样,用户不需要记住每次执行后最后导入的值;一切都是自动处理的。

ac1kyiln

ac1kyiln2#

您可以通过两个阶段来传递日期:
工作流协调员
在coordinator中,您可以将日期传递给工作流,该工作流作为 <property> ,如下所示:

<coordinator-app name="schedule" frequency="${coord:days(1)}"
                 start="2015-01-01T00:00Z" end="2025-01-01T00:00Z"
                 timezone="Etc/UTC" xmlns="uri:oozie:coordinator:0.2">
    ...
    <action>
        <workflow>
            <app-path>${nameNode}/your/workflow.xml</app-path>
            <configuration>
                <property>
                    <name>workflow_date</name>
                    <value>${coord:formatTime(coord:nominalTime(), 'yyyyMMdd')}</value>
                </property>
            </configuration>
        </workflow>
    </action>
    ...
</coordinator-app>

工作流到sqoop
在工作流中,可以使用 ${workflow_date} 变量,如下所示:

<sqoop xmlns="uri:oozie:sqoop-action:0.2">
    ...
    <command>import --connect jdbc:connect:string:here --table tablename --target-dir /your/import/dir/${workflow_date}/ -m 1</command>
    ...
</sqoop>

相关问题