Apache Falcon:定义具有多个 Hive 表的进程

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

有时,我们可能需要使用两个或多个 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)"/>
&lt;clusters&gt;
    &lt;cluster name="test-primary-cluster" type="source"&gt;
                    &lt;validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" /&gt;
                    &lt;retention limit="months(9999)" action="archive" /&gt;
    &lt;/cluster&gt;
&lt;/clusters&gt;

&lt;table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" /&gt;

&lt;ACL owner="rishav" group="hdpuser" permission="0770"/&gt;
&lt;schema location="hcat" provider="hcat"/&gt;

</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)"/>
&lt;clusters&gt;
    &lt;cluster name="test-primary-cluster" type="source"&gt;
                    &lt;validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" /&gt;
                    &lt;retention limit="months(9999)" action="archive" /&gt;
    &lt;/cluster&gt;
&lt;/clusters&gt;

&lt;table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" /&gt;

&lt;ACL owner="rishav" group="hdpuser" permission="0770"/&gt;
&lt;schema location="hcat" provider="hcat"/&gt;

</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)"/>
&lt;clusters&gt;
    &lt;cluster name="test-primary-cluster" type="source"&gt;
                    &lt;validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" /&gt;
                    &lt;retention limit="months(9999)" action="archive" /&gt;
    &lt;/cluster&gt;
&lt;/clusters&gt;

&lt;table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" /&gt;

&lt;ACL owner="rishav" group="hdpuser" permission="0770"/&gt;
&lt;schema location="hcat" provider="hcat"/&gt;

</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)"/>
&lt;clusters&gt;
    &lt;cluster name="test-primary-cluster" type="source"&gt;
                    &lt;validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" /&gt;
                    &lt;retention limit="months(9999)" action="archive" /&gt;
    &lt;/cluster&gt;
&lt;/clusters&gt;

&lt;table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" /&gt;

&lt;ACL owner="rishav" group="hdpuser" permission="0770"/&gt;
&lt;schema location="hcat" provider="hcat"/&gt;

</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)"/>
&lt;clusters&gt;
    &lt;cluster name="test-primary-cluster" type="source"&gt;
                    &lt;validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" /&gt;
                    &lt;retention limit="months(9999)" action="archive" /&gt;
    &lt;/cluster&gt;
&lt;/clusters&gt;

&lt;table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" /&gt;

&lt;ACL owner="rishav" group="hdpuser" permission="0770"/&gt;
&lt;schema location="hcat" provider="hcat"/&gt;

</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)"/>
&lt;clusters&gt;
    &lt;cluster name="test-primary-cluster" type="source"&gt;
                    &lt;validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" /&gt;
                    &lt;retention limit="months(9999)" action="archive" /&gt;
    &lt;/cluster&gt;
&lt;/clusters&gt;

&lt;table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" /&gt;

&lt;ACL owner="rishav" group="hdpuser" permission="0770"/&gt;
&lt;schema location="hcat" provider="hcat"/&gt;

</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)"/>
&lt;clusters&gt;
    &lt;cluster name="test-primary-cluster" type="source"&gt;
                    &lt;validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" /&gt;
                    &lt;retention limit="months(9999)" action="archive" /&gt;
    &lt;/cluster&gt;
&lt;/clusters&gt;

&lt;table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" /&gt;

&lt;ACL owner="rishav" group="hdpuser" permission="0770"/&gt;
&lt;schema location="hcat" provider="hcat"/&gt;

</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)"/>
&lt;clusters&gt;
    &lt;cluster name="test-primary-cluster" type="source"&gt;
                    &lt;validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" /&gt;
                    &lt;retention limit="months(9999)" action="archive" /&gt;
    &lt;/cluster&gt;
&lt;/clusters&gt;

&lt;table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" /&gt;

&lt;ACL owner="rishav" group="hdpuser" permission="0770"/&gt;
&lt;schema location="hcat" provider="hcat"/&gt;

</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)"/>
&lt;clusters&gt;
    &lt;cluster name="test-primary-cluster" type="source"&gt;
                    &lt;validity start="2015-09-20T14:00Z" end="2099-03-09T12:00Z" /&gt;
                    &lt;retention limit="months(9999)" action="archive" /&gt;
    &lt;/cluster&gt;
&lt;/clusters&gt;

&lt;table uri="catalog:tmp_rishav:tbl_1#feed_date=${YEAR}-${MONTH}-${DAY}" /&gt;

&lt;ACL owner="rishav" group="hdpuser" permission="0770"/&gt;
&lt;schema location="hcat" provider="hcat"/&gt;

</feed>

相关文章