Apache Flink 是一个高效的流处理框架,可以以高吞吐量和低延迟处理批处理和实时数据。它具有强大的功能,例如事件时间处理、精确一次语义和多样的窗口机制。将 Apache Flink 和 Apache Iceberg 结合使用带来了许多优势。Iceberg 中的功能,如读取和写入的快照隔离、处理多并发操作的能力、符合 ACID 的查询以及增量读取,使得 Flink 能够完成在旧表格式中通常难以实现的操作。两者结合提供了一个高效且可扩展的平台,用于处理大规模数据,特别是流式处理场景。
在本章中,我们将深入探讨如何实际使用 Apache Flink 和 Apache Iceberg。我们将主要介绍如何配置和设置带有 Iceberg 目录的 Flink SQL 客户端,以便进行大多数示例操作,例如运行 DDL 命令、执行读写查询,并展示如何使用 Java 中的 Flink DataStream 和 Table API 来执行这些操作。通过提供的步骤,这些操作都可以在本地机器上运行。
配置
让我们开始了解 Flink 集群的基本配置和设置,无论您是使用 Java 编写的标准 Flink 作业,还是使用 PyFlink 将 Python 作业编译为 Java。
先决条件
您可以从 Apache Flink 官方网站下载并解压最新的二进制文件,或者使用与 Iceberg 兼容的特定 Flink 版本。在本示例中,我们将使用 Flink 1.16.1。以下命令将设置适当的环境变量,下载二进制文件并解压(假设您已经安装了 Java):
FLINK_VERSION=1.16.1
SCALA_VERSION=2.12
APACHE_FLINK_URL=https://archive.apache.org/dist/flink/
wget ${APACHE_FLINK_URL}/flink-${FLINK_VERSION}/flink-${FLINK_VERSION}-bin-scala_${SCALA_VERSION}.tgz
tar xzvf flink-${FLINK_VERSION}-bin-scala_${SCALA_VERSION}.tgz
接下来,下载兼容的 Iceberg 运行时 JAR 文件,并将其放置在 FLINK_HOME/lib 目录中。该运行时库使 Iceberg 能够与 Flink 集成。如果您想下载最新的 JAR,可以从 Maven 仓库网站上的 iceberg-flink-runtime JAR 页面获取。在这里,我们将使用 iceberg-flink-runtime-1.16。表 9-1 列出了支持的 Flink 版本与 Iceberg 及其对应的运行时 JAR。这些是撰写本章时维护的两个最新版本的 Flink。
表 9-1. Flink 版本和 Iceberg 支持
| 版本 | 初始 Iceberg 支持 | 最新 Iceberg 支持 | 最新运行时 JAR |
|---|---|---|---|
| 1.16 | 1.1.0 | 1.3.0 | iceberg-flink-runtime-1.16 |
| 1.17 | 1.3.0 | 1.3.0 | iceberg-flink-runtime-1.17 |
Hadoop Common 库对于 Flink 与文件系统(如 Amazon Simple Storage Service (Amazon S3) 和 Hadoop Distributed File System (HDFS))的交互是必要的。在这里,您将运行一个位于 Hadoop 环境中的 Flink 集群,并使用 Hadoop 目录来管理 Iceberg 表。因此,您必须下载一个包含这些通用库的兼容 Hadoop 版本。然而,如果您在 Hadoop 之外运行 Flink,您可以下载 JAR 文件(v2.8.3 是一个稳定版本):
APACHE_HADOOP_URL=https://archive.apache.org/dist/hadoop/
HADOOP_VERSION=2.8.5
wget ${APACHE_HADOOP_URL}/common/hadoop-${HADOOP_VERSION}/hadoop-${HADOOP_VERSION}.tar.gz
tar xzvf hadoop-${HADOOP_VERSION}.tar.gz
接下来,将 HADOOP_HOME 设置为指向下载的 Hadoop 版本,并将 Hadoop 的类路径添加到您的环境变量中,如下所示(这将在 Flink 集群启动时使用):
HADOOP_HOME=`pwd`/hadoop-${HADOOP_VERSION}
export HADOOP_CLASSPATH=`$HADOOP_HOME/bin/hadoop classpath`
您可能还需要以下类:
Hadoop AWS 类
这仅在您计划从 Amazon S3 读取或写入数据时需要。您可以从 Maven 仓库下载。
AWS 捆绑类
这些类有助于与众多 AWS 服务进行交互,包括 S3、IAM、AWS Lambda 等。虽然 Hadoop AWS 库提供基本的 S3 操作,但 AWS 捆绑包允许您执行更复杂的任务,例如上传和下载项目。您可以在 Maven 仓库中找到一个稳定版本。
在启动 Flink 集群之前,了解 Flink 架构的两个重要概念:
JobManager
JobManager 是一个协调器。它负责协调和管理 Flink 应用程序中的各种活动,包括调度任务、协调检查点和处理代码的执行(称为 JobGraphs 的有向图)。
TaskManager
TaskManager 负责执行 JobManager 分配的任务。它有一组插槽(资源调度的最小单位),允许它在单独的线程中执行多个任务。
这些组件及其相关参数可以在 FLINK_HOME/lib 目录中的配置文件 flink-conf.yaml 中根据您的需求进行修改。
启动 Flink 集群和 Flink SQL 客户端
现在使用以下命令启动 Flink 集群:
./bin/start-cluster.sh
这将在您的本地机器上启动 Flink 集群,您应该会看到类似如下的信息:
Starting cluster.
Starting standalonesession daemon on host Dipankars-MBP.
Starting taskexecutor daemon on host Dipankars-MBP.
一旦 Flink 集群启动并运行,您可以使用以下命令启动 Flink SQL 客户端:
./bin/sql-client.sh embedded
启动后,您将看到 Flink 标志的 ASCII 文本版本,并且提示符将变为 “Flink SQL>”,以指示您现在已经进入 Flink SQL。
数据定义语言操作
Flink SQL 为 Apache Iceberg 表提供了一系列 DDL 操作。在本节中,我们将介绍一些常见的 DDL 操作。
创建目录
配置以使用 Apache Iceberg 表的第一步是设置目录。Iceberg 默认附带用于 Hadoop 目录的 Hadoop JAR 文件,但 Apache Flink 还有许多其他目录选项,例如 Hive、REST 以及 AWS Glue 和 Project Nessie 等自定义目录。
要使用 Flink SQL 创建 Iceberg 目录,可以使用以下查询:
CREATE CATALOG <catalog_name> WITH (
'type'='iceberg',
'catalog-type'=<values>
<config_key>=<config_value>
);
在 Flink SQL 中为 Apache Iceberg 表配置目录时,有一些重要属性需要考虑。type 属性必须始终设置为 iceberg 以指示目录类型。当使用内置目录(例如 Hive、Hadoop 和 REST)时,您应该相应地指定 catalog-type。然而,如果您使用自定义目录(例如 AWS Glue 和 Project Nessie),则应将 catalog-type 留空。此外,如果您使用自定义目录并将 catalog-type 留空,则必须指定 catalog-impl 属性,其中应包含自定义目录实现的完全限定类名。这些属性在 Flink SQL 环境中配置和定义 Iceberg 目录的行为中起着至关重要的作用。
Hadoop 目录
Iceberg 支持基于目录的目录,例如 HDFS 中的 Hadoop 目录。以下示例展示了如何使用 Flink SQL 配置 Hadoop 目录:
CREATE CATALOG local_catalog WITH (
'type'='iceberg',
'catalog-type'='hadoop',
'warehouse'='hdfs://nn:8020/warehouse/path'
);
此语句将创建一个名为 local_catalog 的 Iceberg 目录。type = 'iceberg' 是一个必需参数,用于让 Flink 知道要创建一个 Iceberg 目录。'catalog-type'='hadoop' 参数告诉 Flink 这是一个 Hadoop 目录,意味着它将使用任何基于目录的目录来管理和存储元数据和数据文件。'warehouse'='hdfs://nn:8020/warehouse/path' 参数指定了 Hadoop 目录将用于存储元数据文件和数据文件的 HDFS 目录。每当在此目录中创建新表时,这些文件将存储在此 HDFS 目录中。如果您希望使用本地文件夹而不是 HDFS 目录,可以通过类似 'warehouse'='file:///absolute/path/to/warehouse' 的方式实现。另一个常见的选项是使用云对象存储,可以通过设置 'warehouse'= 's3://my-bucket/hadoopcatalog/' 来指定。请确保设置 'io-impl'= 'org.apache.iceberg.aws.s3.S3FileIO' 属性,并下载所需的 AWS 依赖项以与 AWS S3 进行交互(如第 5 章所述)。
您可以使用以下命令验证目录是否成功创建:
SHOW CATALOGS;
您应该会看到类似如下的输出:
Flink SQL> SHOW CATALOGS;
catalog name
default_catalog
local_catalog
2 rows in set
创建目录后,您可以使用以下命令将其设置为当前目录:
USE CATALOG local_catalog;
Hive 目录
由于 Iceberg 默认不附带 Hive JAR 文件,您必须确保所需的依赖项在 Flink 环境中可用并在启动 Flink SQL 客户端时加载。您可以从 Maven 仓库下载最新的 JAR 文件。一旦您有了 flink-sql-connector-hive-2.3.9_2.12-1.16.1.jar 文件,需要将其提供给 Flink SQL 客户端。为此,可以将 JAR 文件放在 Flink 文件夹的 /lib 目录中。一旦 JAR 文件在正确的位置,您可以启动 Flink SQL 客户端。
设置依赖项并启动 Flink SQL 客户端后,您可以使用以下查询创建 Iceberg Hive 目录:
CREATE CATALOG hive_catalog WITH (
'type'='iceberg',
'catalog-type'='hive',
'uri'='thrift://localhost:9083',
'clients'='5',
'warehouse'='hdfs://nn:8020/warehouse/path'
);
在配置 Apache Iceberg 表时,有一些关键的 Hive 特定参数需要考虑。'uri' 属性与 Hive Metastore 的 thrift URI 相关,对于建立与 Hive Metastore 的连接至关重要。'clients' 属性虽然是可选的,但允许您指定 Hive Metastore 客户端的池大小,默认值为 2。最后,'warehouse' 属性是关键,因为它指定了存储位置,指示与基于 Hive 的 Iceberg 目录关联的元数据和数据文件的存储位置。这些参数在将 Iceberg 目录与 Hive 集成到 Apache Flink SQL 环境中时,起到了调整其行为的作用。
创建目录后,您可以使用以下命令将其设置为当前目录:
USE CATALOG hive_catalog;
自定义目录
Flink 还支持通过指定 catalog-impl 属性来创建自定义 Iceberg 目录实现。以下是一个示例:
CREATE CATALOG custom_catalog WITH (
'type'='iceberg',
'catalog-impl'='com.my.custom.CatalogImpl',
'my-additional-catalog-config'='my-value'
);
catalog-impl 属性需要您的自定义目录实现的类名。例如,如果您使用 Nessie 作为自定义目录,类名将是 org.apache.iceberg.nessie.NessieCatalog。
创建数据库
Flink SQL 自带一个默认数据库。如果您想创建一个新数据库,可以这样做:
CREATE DATABASE iceberg_db;
上述代码将创建一个名为 iceberg_db 的新数据库。该数据库将存储在当前活动的目录中。要将操作切换到此新数据库,需要使用 USE 语句:
USE iceberg_db;
创建表
下一步是使用 Flink SQL 创建一个 Iceberg 表。以下是创建表的示例:
CREATE TABLE employee (
id BIGINT,
role STRING,
department STRING,
salary FLOAT,
region STRING
) WITH (
'connector'='iceberg'
);
上述查询创建了一个名为 employee 的 Iceberg 表,包含五个列。'connector'='iceberg' 属性告诉 Flink 您正在使用 Iceberg 连接器来创建此表。
创建分区表
要使用 Flink SQL 创建一个分区的 Iceberg 表,可以使用如下查询:
CREATE TABLE emp_partitioned_table (
id BIGINT,
role STRING
) PARTITIONED BY (role) WITH (
'connector'='iceberg'
);
上述查询创建了一个名为 emp_partitioned_table 的表,该表按 role 列进行分区。
需要注意的是,尽管 Iceberg 支持隐藏分区,Flink 目前不支持基于函数的列分区。因此,使用 Flink DDL 时不支持隐藏分区。
创建表…LIKE
在某些情况下,您可能需要创建一个新表,该表镜像现有表的结构和属性。为此,Flink SQL 提供了一个非常方便的命令,CREATE TABLE…LIKE。此命令创建一个具有与现有表相同的架构、分区和表属性的新表。
假设您有一个名为 employee 的表,包含两个列 id 和 role,并且您想要创建一个具有相同架构和属性的新表。您可以使用如下查询:
CREATE TABLE emp_like LIKE employee;
这将创建一个新表 emp_like,其架构、分区策略和属性与 employee 表完全相同。这是一种快速而简单的方式来复制表的结构。
修改表
Flink SQL 提供了使用 ALTER TABLE 语句更改现有 Iceberg 表结构的语句。以下是一些示例。
要重命名一个 Iceberg 表,可以使用以下查询:
ALTER TABLE employee RENAME TO emp_new;
假设您想将名为 emp 的表的默认写入格式更改为 avro,可以这样做:
ALTER TABLE employee SET ('write.format.default'='avro');
删除表
要从目录中删除一个表,可以使用 DROP TABLE 语句:
DROP TABLE employee;
读取数据
Flink SQL 提供了从 Iceberg 表中读取数据的批处理和流处理能力。它允许灵活的执行模式、可定制的查询参数以及检查与表关联的各种元数据属性的能力。在本节中,我们将深入探讨使用 Flink SQL 进行 Iceberg 的不同读取操作。
Flink SQL 批处理读取
要使用 Flink SQL 读取批处理数据,首先应将执行运行时模式设置为批处理。以下是如何以批处理模式从名为 employee 的表中读取所有数据的示例:
SET execution.runtime-mode = batch;
SELECT * FROM employee;
此查询作为批处理作业运行,并一次检索整个数据集。
Flink SQL 流处理读取
如果需要处理增量数据,可以利用 Flink SQL 流处理模式,方法是将执行运行时模式设置为流处理。以下是一个示例:
SET execution.runtime-mode = streaming;
SELECT * FROM employee /*+ OPTIONS('streaming'='true', 'monitor-interval'='1s')*/ ;
在这里,SELECT 语句从 employee 表的当前快照开始读取所有记录,然后继续读取增量数据。/*+ OPTIONS('streaming'='true', 'monitor-interval'='1s')*/ 是一个 SQL 提示。在 Flink 中,SQL 提示是放置在 SQL 语句内的可选指令,用于向 SQL 计划器提供额外信息以更改执行计划。在这种情况下,我们指定查询应在流处理模式下执行,并且监视间隔应设置为 1 秒,这意味着 Flink 每秒钟检查 Iceberg 表是否有新数据或更改。
元数据表
为了深入了解表的历史数据、快照细节以及整体健康状况,例如了解表中包含的小文件或孤立文件的数量,Iceberg 提供了元数据表。这些元数据表可以通过在 Flink SQL 中追加 $ 后跟元数据表名称来访问。让我们看看其中一些元数据表。
历史记录
历史记录元数据表允许您查看表随时间的演变。可以使用以下语句访问此表:
SELECT * FROM `catalog`.`database`.`table`$history;
结果是表的历史记录,可以帮助您了解是否回滚了任何事务,等等。
元数据日志
元数据日志跟踪所有元数据文件,包括最新快照 ID 和最新模式 ID,以及时间戳等信息。以下是如何查询元数据日志表的方法:
SELECT * FROM `catalog`.`database`.`table`$metadata_log_entries;
快照
要获取 Iceberg 表中快照的信息,可以查询快照元数据表。以下是一个示例:
SELECT * FROM `catalog`.`database`.`table`$snapshots;
此表提供了关于任何写操作后添加或删除记录的信息,以及 Flink 作业 ID 等信息。
还有其他可用的元数据表,例如清单和分区。这些等其他表在第 10 章中有详细介绍。
写入数据
Flink SQL 提供了多种写入操作,如 INSERT INTO、INSERT OVERWRITE 和 UPSERT,用于 Apache Iceberg 表。这些操作可以在批处理和流处理模式下使用,但存在一些限制。让我们来看看这些操作。
INSERT INTO
INSERT INTO 命令用于向 Iceberg 表追加新数据。以下是一些示例:
INSERT INTO employee VALUES (1, 'Software Engineer', 'Engineering', 25000, 'NA');
INSERT INTO employee SELECT id, role FROM emp_new;
第一个查询将一行数据插入所选 Iceberg 目录中的 employee 表。第二个查询通过从另一个表 emp_new 中选择 id 和 role 字段值来插入 id 和 role 字段值。
INSERT INTO 在 Flink SQL 的批处理和流处理模式中都受支持。
INSERT OVERWRITE
在 Flink SQL 中,要用查询结果替换表中的数据,可以使用 INSERT OVERWRITE。由于在 Apache Iceberg 中,覆盖操作是原子操作,因此在执行此类查询时提供了数据一致性。
以下是在批处理作业中使用 INSERT OVERWRITE 的示例:
INSERT OVERWRITE employee VALUES (1, 'Software Tester', 'Engineering', 23000, 'NA');
上述查询将用指定的行替换 emp 表中的所有现有数据。
Iceberg 还允许您通过选择值来覆盖特定分区。假设您的 employee 表按部门进行分区,您希望针对 Engineering 部门的员工进行一些更新。您可以使用以下查询在 Flink SQL 中执行此操作:
INSERT OVERWRITE employee PARTITION (department='Engineering') SELECT * FROM updated_emp_data WHERE department='Engineering';
此查询将从 updated_emp_data 表中获取 Engineering 部门员工的记录,并覆盖 employee 表中相应的分区。
请注意,INSERT OVERWRITE 仅在批处理模式下受支持,不支持流处理模式。
UPSERT
Apache Iceberg 支持 UPSERT,它是 INSERT 和 UPDATE 的组合。如果记录存在,则会更新它,如果不存在,则会将其插入为新记录。这类似于 Spark 和 Dremio 等引擎中讨论的 MERGE INTO 操作。请注意,您需要表中的主要标识符才能执行此操作。有两种方法可以执行 UPSERT。
首先,您可以在表级别属性中启用 UPSERT 模式,如下例所示:
CREATE TABLE employee (
`id` INT UNIQUE,
`role` STRING NOT NULL,
`department` STRING NOT NULL,
`salary` FLOAT,
`region` STRING NOT NULL,
PRIMARY KEY(`id`) NOT ENFORCED
) WITH ('format-version'='2', 'write.upsert.enabled'='true');
在这里,当您创建表时设置了 UPSERT 模式,并且将应用于批处理和流处理模式,除非第二种方法覆盖了该属性。
然后,您可以执行 INSERT INTO,并根据表的主要标识符,Iceberg 将决定是执行更新还是插入,如以下示例所示:
INSERT INTO employee VALUES (1, 'Director', 'Product', 33000, 'APAC');
或者,您可以在写入选项中使用 upsert-enabled 启用 UPSERT 模式。
在这种方法中,UPSERT 模式是针对特定的 INSERT 操作启用的,这提供了更大的灵活性。以下是一个示例:
INSERT INTO employee /*+ OPTIONS('upsert-enabled'='true') */ VALUES (3, 'Manager', 'Engineering', 26000, 'NA');
使用 Apache Iceberg 表的 Flink DataFrame 和 Table API
在前一节中,我们进行了一些练习,探讨了如何执行 DDL 语句以及使用 Flink SQL 读取和写入数据等操作。在本节中,我们将讨论如何使用 Java 利用 DataFrame 和 Table API,并对 Apache Iceberg 表进行一些基本操作。
先决条件
与之前一样,您首先需要下载 Apache Flink 以及所需的所有 JAR 文件以供您的配置使用。以下是我们将使用的 JAR 文件列表,附有 Maven 下载链接(请注意,这些是本章节撰写时的稳定版本)。请注意,如果您按照此练习使用了 alexmerced/flink-iceberg Docker 映像,所有这些 JAR 文件已经包含在映像中:
- Iceberg-flink-runtime-1.16-1.3.0.jar(Iceberg-Flink 运行时)
- Hadoop-common-2.8.3.jar(Hadoop 通用类)
- Flink-shaded-hadoop-2-uber-2.8.3-10.0.jar(Hadoop AWS 类)
- Bundle-2.20.18.jar(AWS 打包类)
您还需要确保您已安装了 Java 8+ 和 Maven。如果您想为接下来的练习创建一个本地的 Flink 环境,请参阅本书的 GitHub 存储库。
配置 Flink 作业
第一步是创建一个空的 Maven 项目。为此,请使用以下命令:
mvn archetype:generate
会有几个关于项目的提示,您可以通过按 Enter 键跳过。您将 artifactID 输入为 flink_job,groupID 输入为 com.my_flink_job。artifactID 将是您项目的名称。
在构建成功后,您的项目目录将类似于图 9-1。
请注意以下关于图 9-1 中列出的文件的内容:
- pom.xml 文件是您将定义项目依赖项和插件的地方。
- App.java 文件将包含您的应用程序逻辑。
- AppTest.java 文件将用于单元测试。
由于您将在应用程序中导入一些库,因此需要在 pom.xml 文件中指定它们,以便 Maven 在项目构建过程中自动下载并包含它们。以下是一个片段:
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>1.16.1</version>
</dependency>
<dependency>
<groupId>org.apache.iceberg</groupId>
<artifactId>iceberg-flink-runtime-1.16</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.iceberg</groupId>
<artifactId>iceberg-core</artifactId>
<version>1.3.0</version>
</dependency>
</dependencies>
此外,您还需要确保 Maven 编译器属性设置为 Java 8 或适当的版本号,如果使用其他 Java 版本:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
接下来,您将在与 App.java 相同的文件夹中创建一个名为 EmployeeData 的类,该类将作为将数据映射到进行进一步处理的架构。此类包括一些 getter 和 setter 方法,如以下代码所示:
package com.my_flink_job;
public class EmployeeData {
private Long id;
private String department;
private Long salary;
public EmployeeData() {
}
public EmployeeData(Long id, String department, Long salary) {
this.id = id;
this.department = department;
this.salary = salary;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public Long getSalary() {
return salary;
}
public void setSalary(Long salary) {
this.salary = salary;
}
}
最后,您将编写 App.java 文件的逻辑,该文件将利用 Flink 的 DataStream 和 Table API 创建 Iceberg 目录和表,并插入一些记录。以下是代码的简化版本(要查看 App.java 的完整代码,请访问书籍的 GitHub 存储库):
public class App
{
public static void main(String[] args) throws Exception {
// 设置环境
// ...
// 创建 Nessie 目录
tableEnv.executeSql(
"CREATE CATALOG iceberg WITH ("
+ "'type'='iceberg',"
+ "'catalog-impl'='org.apache.iceberg.nessie."
+ "NessieCatalog',"
+ "'io-impl'='org.apache.iceberg.aws.s3.S3FileIO',"
+ "'uri'='http://catalog:19120/api/v1',"
+ "'authentication.type'='none',"
+ "'ref'='main',"
+ "'client.assume-role.region'='us-east-1',"
+ "'warehouse' = 's3://warehouse',"
+ "'s3.endpoint'='http://{id-address}:9000'"
+ ")");
// 设置当前目录为新目录
tableEnv.useCatalog("iceberg");
// 在当前目录中创建数据库
tableEnv.executeSql("CREATE DATABASE IF NOT EXISTS db");
// 创建表
tableEnv.executeSql(
"CREATE TABLE IF NOT EXISTS db.employees ("
+ "id BIGINT COMMENT 'unique id',"
+ "department STRING,"
+ "salary BIGINT"
+ ")");
// 设置样本数据
// ...
// 将 DataStream 写入表中
tableEnv.executeSql(
"INSERT INTO db.employees SELECT * FROM my_datastream");
}
}
以上代码创建了一个 StreamExecutionEnvironment env,设置了 Flink 作业和计算环境。然后创建了一个 StreamTableEnvironment tableEnv,它允许您使用 Flink 的 DataStream 和 Table API,并使您能够在两者之间进行转换(如代码所示)。在此处,表环境用于执行 SQL 语句,如创建 Iceberg 目录、数据库和表。
在构建包并运行作业之前,还有最后一件事要做,就是在 CREATE CATALOG 部分提供 IP 地址。要获取 IP 地址,请启动集群。如果您正在使用在练习开始时提到的 docker-compose 设置,则这是必需的。如果您部署了具有静态 IP 地址或在域名下的 Nessie 服务器,您可以将其用作 URI。在这种情况下,我们正在确定 Docker 网络中 Nessie 容器的 IP 地址。
启动集群和构建包
要启动您的环境,只需打开您的 shell/终端环境并运行 docker-compose up 命令。
一旦您的所有配置都设置正确,您就可以使用 docker exec -it storage /bin/bash 连接到存储容器的 shell,然后使用 ifconfig 查找 IP 地址。
从输出中,复制 eth0 的 inet 值。您将使用此值来更新您的目录配置。下面是您更新后的代码示例: "'s3.endpoint'='http://172.27.0.4:9000'"
最后,通过进入包含 pom.xml 文件的目录并运行 mvn package 命令来构建 Maven 包。预期的构建输出是在 /target 目录下生成的 flink_job-1.0-SNAPSHOT.jar 文件。这个文件是您需要使用的文件,用来提交一个 Flink 作业,执行您在代码中定义的各种 Iceberg 操作。
运行作业
Apache Flink 提供了一个 Web 界面,您可以在浏览器中通过 localhost:8081 访问。此 UI 允许您管理与 Flink 作业相关的所有内容,包括提交作业、检查作业状态和分析日志。要从 UI 提交和运行您的作业,点击“提交新作业”,然后点击“添加新项目”上传 JAR 文件。在“入口类”下,输入 com.my_flink_job.App(您的包名称)并点击“提交”。
您还可以从 Web UI 中检查作业状态。
记录应该被插入到您的 Apache Iceberg 表中,并可以通过您选择的查询引擎进行查询。