Hadoop 每周排班

Hadoop 每周排班,hadoop,mapreduce,oozie,oozie-coordinator,Hadoop,Mapreduce,Oozie,Oozie Coordinator,我刚开始接触Oozie。希望这里有人能提供一些有用的建议 下面是coordinator.xml的一个片段 <coordinator-app name="weeklyABCFacts" frequency="${coord:days(7)}" start="${start}T00:00Z" end="${end}" timezone="CET" xmlns="uri:oozie:coordinator:0.1"> <controls> <t

我刚开始接触Oozie。希望这里有人能提供一些有用的建议

下面是coordinator.xml的一个片段

<coordinator-app name="weeklyABCFacts" frequency="${coord:days(7)}"     start="${start}T00:00Z" end="${end}" timezone="CET" xmlns="uri:oozie:coordinator:0.1">
    <controls>
      <timeout>-1</timeout>
      <concurrency>1</concurrency>
      <execution>FIFO</execution>
    </controls>
<datasets>

  <dataset name="weekly-f_stats-flag" frequency="${coord:days(7)}" initial-instance="2013-07-01T00:00Z" timezone="CET">
        <uri-template>${nameNode}/warehouse/hive/f_stats/dt=${YEAR}W${WEEK}    </uri-template>
      </dataset>
    </datasets>
...
</coordinator-app>
我希望这已经足够清楚了,否则,请让我知道还有什么可以更清楚。

没有(在我正在查看的3.3.2源代码中),但是没有什么可以阻止您下载源代码并修改
core/java/org/apache/oozie/coord/coordelevalator.java
文件,特别是
createUrilevaluator(字符串)
方法:

public static ELEvaluator createURIELEvaluator(String strDate) throws Exception {
    ELEvaluator eval = new ELEvaluator();
    Calendar date = Calendar.getInstance(DateUtils.getOozieProcessingTimeZone());
    // always???
    date.setTime(DateUtils.parseDateOozieTZ(strDate));
    eval.setVariable("YEAR", date.get(Calendar.YEAR));
    eval.setVariable("MONTH", make2Digits(date.get(Calendar.MONTH) + 1));
    eval.setVariable("DAY", make2Digits(date.get(Calendar.DAY_OF_MONTH)));
    eval.setVariable("HOUR", make2Digits(date.get(Calendar.HOUR_OF_DAY)));
    eval.setVariable("MINUTE", make2Digits(date.get(Calendar.MINUTE)));

    // add the following line:
    eval.setVariable("WEEK", make2Digits(date.get(Calendar.WEEK_OF_YEAR)));

    return eval;
}
然后,您应该能够按照说明重新编译oozie

我想指出的是,你应该对周数和年数并不总是很好地结合在一起感到厌倦——例如,2013年第1周实际上从2012年开始:

Tue Dec 25 11:11:52 EST 2012 : 2012 W 52
Wed Dec 26 11:11:52 EST 2012 : 2012 W 52
Thu Dec 27 11:11:52 EST 2012 : 2012 W 52
Fri Dec 28 11:11:52 EST 2012 : 2012 W 52
Sat Dec 29 11:11:52 EST 2012 : 2012 W 52
Sun Dec 30 11:11:52 EST 2012 : 2012 W 1  <= Here's your problem
Mon Dec 31 11:11:52 EST 2012 : 2012 W 1
Tue Jan 01 11:11:52 EST 2013 : 2013 W 1  <= 'Fixed' from here
Wed Jan 02 11:11:52 EST 2013 : 2013 W 1
Thu Jan 03 11:11:52 EST 2013 : 2013 W 1
Fri Jan 04 11:11:52 EST 2013 : 2013 W 1
Sat Jan 05 11:11:52 EST 2013 : 2013 W 1
Sun Jan 06 11:11:52 EST 2013 : 2013 W 2
Mon Jan 07 11:11:52 EST 2013 : 2013 W 2
Tue Jan 08 11:11:52 EST 2013 : 2013 W 2
周二12月25日11:11:52东部时间2012:2012西52
美国东部时间2012年12月26日星期三11:11:52:2012西52
美国东部时间2012年12月27日星期四11:11:52:2012西52
美国东部时间2012年12月28日星期五11:11:52:2012西52
美国东部时间2012年12月29日星期六11:11:52:2012西52

Sun Dec 30 11:11:52 EST 2012:2012 W 1感谢您花时间解释您提出的解决方案。将让团队尝试/批准此解决方案。
Tue Dec 25 11:11:52 EST 2012 : 2012 W 52
Wed Dec 26 11:11:52 EST 2012 : 2012 W 52
Thu Dec 27 11:11:52 EST 2012 : 2012 W 52
Fri Dec 28 11:11:52 EST 2012 : 2012 W 52
Sat Dec 29 11:11:52 EST 2012 : 2012 W 52
Sun Dec 30 11:11:52 EST 2012 : 2012 W 1  <= Here's your problem
Mon Dec 31 11:11:52 EST 2012 : 2012 W 1
Tue Jan 01 11:11:52 EST 2013 : 2013 W 1  <= 'Fixed' from here
Wed Jan 02 11:11:52 EST 2013 : 2013 W 1
Thu Jan 03 11:11:52 EST 2013 : 2013 W 1
Fri Jan 04 11:11:52 EST 2013 : 2013 W 1
Sat Jan 05 11:11:52 EST 2013 : 2013 W 1
Sun Jan 06 11:11:52 EST 2013 : 2013 W 2
Mon Jan 07 11:11:52 EST 2013 : 2013 W 2
Tue Jan 08 11:11:52 EST 2013 : 2013 W 2
@Test
public void testDates() {
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));

    cal.set(2012, 11, 25);

    for (int x = 0; x < 15; x++) {
        System.err.println(cal.getTime() + " : " + cal.get(Calendar.YEAR)
                + " W " + cal.get(Calendar.WEEK_OF_YEAR));

        cal.add(Calendar.DAY_OF_YEAR, 1);
    }
}