Oozie协调员。如何将数据从过去提供给mapreduce工作?

时间:2013-03-11 12:50:26

标签: hadoop mapreduce oozie

我正在尝试创建Ooize协调员。问题是我已经有等待使用oozie进行处理的暂存数据。

想象一下这种情况。

  1. 当前日期为:2013年3月1日(2013年3月1日)

  2. 我确实有这些输入目录:

    / staging / landing / source / xvlr / 2013/02/01/00(2013年2月的第一个小时,第一天的第一个小时) /分期/降落/源极/ xvlr / 2013/02/1月1日

    /分段/降落/源极/ xvlr / 2013/02/01/02

    /分段/降落/源极/ xvlr / 2013/02/01/03

    /分段/降落/源极/ xvlr / 2013/02/1月4日

    ...

    /分段/降落/源极/ xvlr / 2013/02/28/00

    ...

    /分段/降落/源极/ xvlr / 2013/02 /23分之28

  3. 我希望我的oozie协调员使用以前创建的所有登陆数据 并产生这样的输出:

    /masterdata/source/xvlr/2013/02/01/00 
    /masterdata/source/xvlr/2013/02/01/01
    /masterdata/source/xvlr/2013/02/01/02
    /masterdata/source/xvlr/2013/02/01/03
    /masterdata/source/xvlr/2013/02/01/04
    ....
    /masterdata/source/xvlr/2013/02/28/00
    ...
    /masterdata/source/xvlr/2013/02/28/23
    

    然后我希望我的协调员每小时运行并为masterdata生成新的输出。

    我如何使用协调器规范来实现? 这是我的协调员。它什么都不做。它确实达到我需要的时间然后等待。它没有开始这项工作。

    请建议。

    <coordinator-app name="Xvlr-parser-coordinator" frequency="60"
                     start="2013-03-07T05:35Z" end="2113-01-01T00:35Z" timezone="Europe/Moscow"  xmlns="uri:oozie:coordinator:0.3">
        <controls>
            <timeout>5</timeout>
            <concurrency>4</concurrency>
        </controls>
    
        <datasets>
            <dataset name="xvlrInputDataset" frequency="${coord:hours(1)}" initial-instance="2013-03-07T05:35Z" timezone="Europe/Moscow">
                <uri-template>${nameNode}/staging/landing/source/xvlr/${YEAR}/${MONTH}/${DAY}/${HOUR}</uri-template>
                <done-flag></done-flag>
            </dataset>
            <dataset name="xvlrOutputDataset" frequency="${coord:hours(1)}" initial-instance="2013-03-07T05:35Z" timezone="Europe/Moscow">
                <uri-template>${nameNode}/masterdata/source/xvlr/archive/${YEAR}/${MONTH}/${DAY}/${HOUR}</uri-template>
                <done-flag></done-flag>
            </dataset>
    
        </datasets>
    
        <input-events>
            <data-in name="xvlrInputEvent" dataset="xvlrInputDataset">
                <instance>${coord:current(0)}</instance>
            </data-in>
        </input-events>
    
        <output-events>
            <data-out name="xvlrOutputEvent" dataset="xvlrOutputDataset">
                <instance>${coord:current(0)}</instance>
            </data-out>
        </output-events>
        <action>
            <workflow>
                <app-path>${oozieAppHomeCatalog}/sub-workflows/Xvlr-parser-subworkflow.xml</app-path>
                <configuration>
                    <property>
                        <name>inputDir</name>
                        <value>${coord:dataIn('xvlrInputEvent')}</value>
                    </property>
                    <property>
                        <name>outputDir</name>
                        <value>${coord:dataOut('xvlrOutputEvent')}</value>
                    </property>
    
                </configuration>
    
            </workflow>
        </action>
    </coordinator-app>
    

1 个答案:

答案 0 :(得分:4)

这是正确的解决方案(它可以工作几天:)))):

<coordinator-app name="Xvlr-parser-coordinator" frequency="60"
                 start="2013-03-07T16:35Z" end="2113-01-01T00:35Z" timezone="Europe/Moscow"  xmlns="uri:oozie:coordinator:0.3">
    <controls>
        <timeout>3</timeout>
        <concurrency>1</concurrency>
    </controls>

    <datasets>
        <dataset name="xvlrInputDataset" frequency="${coord:hours(1)}" initial-instance="2013-03-07T16:35Z" timezone="Europe/Moscow">
            <uri-template>${nameNode}/staging/landing/source/xvlr/${YEAR}/${MONTH}/${DAY}/${HOUR}</uri-template>
            <done-flag></done-flag>
        </dataset>
        <dataset name="xvlrOutputDataset" frequency="${coord:hours(1)}" initial-instance="2013-03-07T16:35Z" timezone="Europe/Moscow">
            <uri-template>${nameNode}/masterdata/source/xvlr/archive/${YEAR}/${MONTH}/${DAY}/${HOUR}</uri-template>
            <done-flag></done-flag>
        </dataset>

    </datasets>

    <input-events>
        <data-in name="xvlrInputEvent" dataset="xvlrInputDataset">
            <instance>${coord:current(0)}</instance>
        </data-in>
    </input-events>

    <output-events>
        <data-out name="xvlrOutputEvent" dataset="xvlrOutputDataset">
            <instance>${coord:current(0)}</instance>
        </data-out>
    </output-events>
    <action>
        <workflow>
            <app-path>${oozieAppHomeCatalog}/sub-workflows/Xvlr-parser-subworkflow.xml</app-path>
            <configuration>
                <property>
                    <name>inputDir</name>
                    <value>${coord:dataIn('xvlrInputEvent')}</value>
                </property>
                <property>
                    <name>outputDir</name>
                    <value>${coord:dataOut('xvlrOutputEvent')}</value>
                </property>
            </configuration>

        </workflow>
    </action>
</coordinator-app>

它做了什么?

  • 起初它确实从 2013-03-07T16:35Z 开始,所以以前都是 收集的数据已经通过基础工作流程(一个先生的工作 调用解析功能)
    • 使用“过去时间数据集”(数据集时间小于当前时间)时,工作流程逐个运行:它确实消耗了 / pastdate / hour_00,然后立即开始消费 / pastdate / hour_01,e.t.c。
    • 当协调员到达现在时,它开始每小时调用工作流程(按照设计:05:35,06:35 ...... 23:35)。
    • 请参阅超时声明:我确实缺少数据集:例如,3月1日的第10小时没有数据。 工作流程确实等了3分钟然后就死了。

问题解决了。