在 Oozie 中访问和操作日期

Accessing and manipulating the date in Oozie

我有一个 Oozie 工作流程,它需要能够使用不同的日期格式。例如,假设我在 2015 年 1 月 16 日 运行 使用 job.properties 中的 属性 runDate=20150116 设置工作流。我希望能够在 Oozie 操作中自动使用以下路径:

external-file-20150116.csv

和其他一些名为的数据:

/rootDir/resource/150116/*

第一个例子就很简单了,我就简单参考一下:

external-file-${runDate}.csv

但是第二个例子是不可能的。

我只能找到 Oozie 的内置 EL timestamp() 函数,该函数没有用,因为它是固定格式并且不提供任何操作。似乎使用协调器可以解决问题,因为我可以使用所有不错的 coord EL 函数。但是,我偶尔需要 运行 这个工作流程,在临时的基础上,在这种情况下,我会使用 job.properties 文件而不是协调器。

关于如何在不使用协调器的情况下操纵日期的任何建议?

有 3 种方法可以输入 oozie 作业 属性。

  1. 作业属性文件,由oozie用户在运行一个作业
  2. 时提交
  3. config-default.xml,在与workflow.xml(或coordinator.xml / bundle.xml)相同的HDFS路径下。通常用于指定默认作业属性。
  4. oozie CLI 的-D 选项。

在您的用例中,您可以将如下内容添加到 oozie 命令行

-DrunDate=`date +%Y%m%d`

经过大量的折腾和研究,我找到了以下解决方案。与其他答案不同,它不需要将每个所需日期格式的变量插入到作业中。我的解决方案是基于使用 EL function - 基本上是 UDF 但对于 Oozie。

解决方案

创建一个 EL 函数以允许修改日期的格式。 EL 函数是用 Java 编写的,与 Hive UDF 不同,它不需要任何 class 扩展,尽管 Oozie 调用的任何方法都应该是静态的。

此方法的代码是:

package org.watsonb.elfunctions;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class DateEL {
    public static String convertDate(String inputDate, String inputDateFormat, String outputDateFormat) {
        DateTimeFormatter formatter = DateTimeFormat.forPattern(inputDateFormat);
        DateTime dateTime = formatter.parseDateTime(inputDate);
        formatter = DateTimeFormat.forPattern(outputDateFormat);
        return formatter.print(dateTime);
    }
}

构建这个 class,并将生成的 jar 文件放在 Oozie 服务器框的 /var/lib/oozie 中。

在 Ambari 的 Oozie 配置页面上,在 Custom oozie-site.xml 选项卡中创建或找到 oozie.service.ELService.ext.functions.workflow 属性,并添加以下内容(如果已经存在,请将每个函数声明用逗号):

convertDateEl=org.watsonb.elfunctions.DateEL#convertDate

在这个例子中:

  • convertDateEl 是将在 Oozie 工作流中调用的函数的名称,
  • org.watsonb.elfunctions.DateEL 是完整的 class 路径,
  • convertDate是class中的方法名。

如果不使用 Ambari,请将 属性 添加到 oozie-site.xml

重新启动 Oozie 服务。该功能现在可用于任何 Oozie 工作流程。

用法

在工作流中,调用:

${convertDateEl(runDate, "yyyyMMdd", "yy-MM-dd")}

到return一个格式化的日期。例如:

<arg>/output/telephone-records-${convertDate(runDate, "yyyyMMdd", "yy-MM-dd")}.csv</arg>

会在运行时变成:

<arg>/output/telephone-records-12-09-30.csv</arg>

如果运行日期是 20120930

来源: http://blog.cloudera.com/blog/2013/09/how-to-write-an-el-function-in-apache-oozie/ - 我发现这很有用,但有点太冗长了。