有时,我们可能需要使用两个或多个 Hive 表作为单个 Apache Falcon 进程的输入。在这篇文章中,我将解释我们如何定义一个 Falcon 进程,该进程接受两个输入表并将输出存储到一个 Hive 表中。
假设有两个输入表,每个表都按 feed_date 列进行分区。对于每个 feed_date,我们想要获得输入表和存储表名称的记录数,以及输出表中的记录数,该输出表也按 feed_date 分区。
第一个 Hive 表的 Falcon 提要定义为:
<feed description="first input table" name="input-table-1" xmlns="uri:falcon:feed:0.1">
<frequency>days(1)</frequency>
<timezone>UTC</timezone>
<late-arrival cut-off="hours(3)"/>
<clusters>
<cluster name="test-primary-cluster" type="source">
<validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" />
<retention limit="months(9999)" action="archive" />
</cluster>
</clusters>
<table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" />
<ACL owner="rishav" group="hdpuser" permission="0770"/>
<schema location="hcat" provider="hcat"/>
</feed>
第二个 feed Hive 表定义为:
<feed description="first input table" name="input-table-1" xmlns="uri:falcon:feed:0.1">
<frequency>days(1)</frequency>
<timezone>UTC</timezone>
<late-arrival cut-off="hours(3)"/>
<clusters>
<cluster name="test-primary-cluster" type="source">
<validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" />
<retention limit="months(9999)" action="archive" />
</cluster>
</clusters>
<table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" />
<ACL owner="rishav" group="hdpuser" permission="0770"/>
<schema location="hcat" provider="hcat"/>
</feed>
我们的输出 Hive 表定义为:
<feed description="first input table" name="input-table-1" xmlns="uri:falcon:feed:0.1">
<frequency>days(1)</frequency>
<timezone>UTC</timezone>
<late-arrival cut-off="hours(3)"/>
<clusters>
<cluster name="test-primary-cluster" type="source">
<validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" />
<retention limit="months(9999)" action="archive" />
</cluster>
</clusters>
<table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" />
<ACL owner="rishav" group="hdpuser" permission="0770"/>
<schema location="hcat" provider="hcat"/>
</feed>
注意:输出 Hive 表的 DDL 是:
<feed description="first input table" name="input-table-1" xmlns="uri:falcon:feed:0.1">
<frequency>days(1)</frequency>
<timezone>UTC</timezone>
<late-arrival cut-off="hours(3)"/>
<clusters>
<cluster name="test-primary-cluster" type="source">
<validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" />
<retention limit="months(9999)" action="archive" />
</cluster>
</clusters>
<table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" />
<ACL owner="rishav" group="hdpuser" permission="0770"/>
<schema location="hcat" provider="hcat"/>
</feed>
Falcon 进程——使用两个输入表并将输出写入一个表——是:
<feed description="first input table" name="input-table-1" xmlns="uri:falcon:feed:0.1">
<frequency>days(1)</frequency>
<timezone>UTC</timezone>
<late-arrival cut-off="hours(3)"/>
<clusters>
<cluster name="test-primary-cluster" type="source">
<validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" />
<retention limit="months(9999)" action="archive" />
</cluster>
</clusters>
<table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" />
<ACL owner="rishav" group="hdpuser" permission="0770"/>
<schema location="hcat" provider="hcat"/>
</feed>
上面的 Falcon 进程调用了一个 Hive 脚本,如下所示:
<feed description="first input table" name="input-table-1" xmlns="uri:falcon:feed:0.1">
<frequency>days(1)</frequency>
<timezone>UTC</timezone>
<late-arrival cut-off="hours(3)"/>
<clusters>
<cluster name="test-primary-cluster" type="source">
<validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" />
<retention limit="months(9999)" action="archive" />
</cluster>
</clusters>
<table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" />
<ACL owner="rishav" group="hdpuser" permission="0770"/>
<schema location="hcat" provider="hcat"/>
</feed>
您可能已经注意到我们正在使用一些变量,如 falcon_output_database、falcon_input1_database 等。这些变量由 Falcon 定义。对于 Falcon 设置的完整变量列表,您可以检查您的流程的 Falcon UI 日志,然后检查此 Oozie 工作流的“操作配置”选项卡。
Falcon 为输入 Hive 提要设置了这些变量 -
<feed description="first input table" name="input-table-1" xmlns="uri:falcon:feed:0.1">
<frequency>days(1)</frequency>
<timezone>UTC</timezone>
<late-arrival cut-off="hours(3)"/>
<clusters>
<cluster name="test-primary-cluster" type="source">
<validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" />
<retention limit="months(9999)" action="archive" />
</cluster>
</clusters>
<table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" />
<ACL owner="rishav" group="hdpuser" permission="0770"/>
<schema location="hcat" provider="hcat"/>
</feed>
变量名称的 input1 部分取决于我们在 Falcon 进程中为提要指定的名称。
如果您定义了多个名称为 input1、input2、input3 等的 Hive 输入提要,则可以通过替换上述变量名称中的 input1 来引用它们。
对于下面的输出 Hive 提要,变量定义如下:
<feed description="first input table" name="input-table-1" xmlns="uri:falcon:feed:0.1">
<frequency>days(1)</frequency>
<timezone>UTC</timezone>
<late-arrival cut-off="hours(3)"/>
<clusters>
<cluster name="test-primary-cluster" type="source">
<validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" />
<retention limit="months(9999)" action="archive" />
</cluster>
</clusters>
<table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" />
<ACL owner="rishav" group="hdpuser" permission="0770"/>
<schema location="hcat" provider="hcat"/>
</feed>
同样,每个变量名称的输出部分取决于我们在 Falcon 进程中为输出提要指定的名称。
在提交/调度这些 Falcon 实体之前,我们需要将 Hive 脚本上传到 HDFS。
现在我们可以提交和调度这些 Falcon 实体。
提交和安排这些 Falcon 实体的命令是:
<feed description="first input table" name="input-table-1" xmlns="uri:falcon:feed:0.1">
<frequency>days(1)</frequency>
<timezone>UTC</timezone>
<late-arrival cut-off="hours(3)"/>
<clusters>
<cluster name="test-primary-cluster" type="source">
<validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" />
<retention limit="months(9999)" action="archive" />
</cluster>
</clusters>
<table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" />
<ACL owner="rishav" group="hdpuser" permission="0770"/>
<schema location="hcat" provider="hcat"/>
</feed>