Hive 集成

Apache Hive 已经成为了数据仓库生态系统中的核心。 它不仅仅是一个用于大数据分析和ETL场景的SQL引擎,同样它也是一个数据管理平台,可用于发现,定义,和演化数据。

Flink 与 Hive 的集成包含两个层面。

一是利用了 Hive 的 MetaStore 作为持久化的 Catalog,用户可通过HiveCatalog将不同会话中的 Flink 元数据存储到 Hive Metastore 中。 例如,用户可以使用HiveCatalog将其 Kafka 表或 Elasticsearch 表存储在 Hive Metastore 中,并后续在 SQL 查询中重新使用它们。

二是利用 Flink 来读写 Hive 的表。

HiveCatalog的设计提供了与 Hive 良好的兼容性,用户可以”开箱即用”的访问其已有的 Hive 数仓。 您不需要修改现有的 Hive Metastore,也不需要更改表的数据位置或分区。

支持的Hive版本

Flink 支持一下的 Hive 版本。

  • 1.0
    • 1.0.0
    • 1.0.1
  • 1.1
    • 1.1.0
    • 1.1.1
  • 1.2
    • 1.2.0
    • 1.2.1
    • 1.2.2
  • 2.0
    • 2.0.0
    • 2.0.1
  • 2.1
    • 2.1.0
    • 2.1.1
  • 2.2
    • 2.2.0
  • 2.3
    • 2.3.0
    • 2.3.1
    • 2.3.2
    • 2.3.3
    • 2.3.4
    • 2.3.5
    • 2.3.6
  • 3.1
    • 3.1.0
    • 3.1.1
    • 3.1.2

请注意,某些功能是否可用取决于您使用的 Hive 版本,这些限制不是由 Flink 所引起的:

  • Hive 内置函数在使用 Hive-1.2.0 及更高版本时支持。
  • 列约束,也就是 PRIMARY KEY 和 NOT NULL,在使用 Hive-3.1.0 及更高版本时支持。
  • 更改表的统计信息,在使用 Hive-1.2.0 及更高版本时支持。
  • DATE列统计信息,在使用 Hive-1.2.0 及更高版时支持。
  • 使用 Hive-2.0.x 版本时不支持写入 ORC 表。

依赖项

要与 Hive 集成,您需要在 Flink 下的/lib/目录中添加一些额外的依赖包, 以便通过 Table API 或 SQL Client 与 Hive 进行交互。 或者,您可以将这些依赖项放在专用文件夹中,并分别使用 Table API 程序或 SQL Client 的-C-l选项将它们添加到 classpath 中。

Apache Hive 是基于 Hadoop 之上构建的, 首先您需要 Hadoop 的依赖,请参考 Providing Hadoop classes.

有两种添加 Hive 依赖项的方法。第一种是使用 Flink 提供的 Hive Jar包。您可以根据使用的 Metastore 的版本来选择对应的 Hive jar。第二个方式是分别添加每个所需的 jar 包。如果您使用的 Hive 版本尚未在此处列出,则第二种方法会更适合。

使用 Flink 提供的 Hive jar

下表列出了所有可用的 Hive jar。您可以选择一个并放在 Flink 发行版的/lib/ 目录中。

Metastore versionMaven dependencySQL Client JAR
1.0.0 - 1.2.2flink-sql-connector-hive-1.2.2Download
2.0.0 - 2.2.0flink-sql-connector-hive-2.2.0Download
2.3.0 - 2.3.6flink-sql-connector-hive-2.3.6Download
3.0.0 - 3.1.2flink-sql-connector-hive-3.1.2Download

用户定义的依赖项

您可以在下方找到不同Hive主版本所需要的依赖项。

  1. /flink-1.11.0
  2. /lib
  3. // Flink's Hive connector.Contains flink-hadoop-compatibility and flink-orc jars
  4. flink-connector-hive_2.11-1.11.0.jar
  5. // Hive dependencies
  6. hive-exec-2.3.4.jar
  1. /flink-1.11.0
  2. /lib
  3. // Flink's Hive connector
  4. flink-connector-hive_2.11-1.11.0.jar
  5. // Hive dependencies
  6. hive-metastore-1.0.0.jar
  7. hive-exec-1.0.0.jar
  8. libfb303-0.9.0.jar // libfb303 is not packed into hive-exec in some versions, need to add it separately
  9. // Orc dependencies -- required by the ORC vectorized optimizations
  10. orc-core-1.4.3-nohive.jar
  11. aircompressor-0.8.jar // transitive dependency of orc-core
  1. /flink-1.11.0
  2. /lib
  3. // Flink's Hive connector
  4. flink-connector-hive_2.11-1.11.0.jar
  5. // Hive dependencies
  6. hive-metastore-1.1.0.jar
  7. hive-exec-1.1.0.jar
  8. libfb303-0.9.2.jar // libfb303 is not packed into hive-exec in some versions, need to add it separately
  9. // Orc dependencies -- required by the ORC vectorized optimizations
  10. orc-core-1.4.3-nohive.jar
  11. aircompressor-0.8.jar // transitive dependency of orc-core
  1. /flink-1.11.0
  2. /lib
  3. // Flink's Hive connector
  4. flink-connector-hive_2.11-1.11.0.jar
  5. // Hive dependencies
  6. hive-metastore-1.2.1.jar
  7. hive-exec-1.2.1.jar
  8. libfb303-0.9.2.jar // libfb303 is not packed into hive-exec in some versions, need to add it separately
  9. // Orc dependencies -- required by the ORC vectorized optimizations
  10. orc-core-1.4.3-nohive.jar
  11. aircompressor-0.8.jar // transitive dependency of orc-core
  1. /flink-1.11.0
  2. /lib
  3. // Flink's Hive connector
  4. flink-connector-hive_2.11-1.11.0.jar
  5. // Hive dependencies
  6. hive-exec-2.0.0.jar
  1. /flink-1.11.0
  2. /lib
  3. // Flink's Hive connector
  4. flink-connector-hive_2.11-1.11.0.jar
  5. // Hive dependencies
  6. hive-exec-2.1.0.jar
  1. /flink-1.11.0
  2. /lib
  3. // Flink's Hive connector
  4. flink-connector-hive_2.11-1.11.0.jar
  5. // Hive dependencies
  6. hive-exec-2.2.0.jar
  7. // Orc dependencies -- required by the ORC vectorized optimizations
  8. orc-core-1.4.3.jar
  9. aircompressor-0.8.jar // transitive dependency of orc-core
  1. /flink-1.11.0
  2. /lib
  3. // Flink's Hive connector
  4. flink-connector-hive_2.11-1.11.0.jar
  5. // Hive dependencies
  6. hive-exec-3.1.0.jar
  7. libfb303-0.9.3.jar // libfb303 is not packed into hive-exec in some versions, need to add it separately

如果使用 Hive 的 HDP 或 CDH 版本,则需要参考上一节中的依赖项并选择一个类似的版本。

并且您需要在定义 yaml 文件,或者创建 HiveCatalog 和 HiveModule 时,指定一个支持的 “hive-version”。

Maven 依赖

如果您在构建自己的应用程序,则需要在 mvn 文件中添加以下依赖项。 您应该在运行时添加以上的这些依赖项,而不要在已生成的 jar 文件中去包含它们。

  1. <!-- Flink Dependency -->
  2. <dependency>
  3. <groupId>org.apache.flink</groupId>
  4. <artifactId>flink-connector-hive_2.11</artifactId>
  5. <version>1.11.0</version>
  6. <scope>provided</scope>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.apache.flink</groupId>
  10. <artifactId>flink-table-api-java-bridge_2.11</artifactId>
  11. <version>1.11.0</version>
  12. <scope>provided</scope>
  13. </dependency>
  14. <!-- Hive Dependency -->
  15. <dependency>
  16. <groupId>org.apache.hive</groupId>
  17. <artifactId>hive-exec</artifactId>
  18. <version>${hive.version}</version>
  19. <scope>provided</scope>
  20. </dependency>

连接到Hive

通过 TableEnvironment 或者 YAML 配置,使用 Catalog 接口HiveCatalog连接到现有的 Hive 集群。

如果hive-conf/hive-site.xml文件存储在远端存储系统,则用户首先应该将hive配置文件下载至其本地环境中。

请注意,虽然 HiveCatalog 不需要特定的 planner,但读写Hive表仅适用于 Blink planner。因此,强烈建议您在连接到 Hive 仓库时使用 Blink planner。

以Hive 2.3.4版本为例:

  1. EnvironmentSettings settings = EnvironmentSettings.newInstance().inBatchMode().build();
  2. TableEnvironment tableEnv = TableEnvironment.create(settings);
  3. String name = "myhive";
  4. String defaultDatabase = "mydatabase";
  5. String hiveConfDir = "/opt/hive-conf"; // a local path
  6. String version = "2.3.4";
  7. HiveCatalog hive = new HiveCatalog(name, defaultDatabase, hiveConfDir, version);
  8. tableEnv.registerCatalog("myhive", hive);
  9. // set the HiveCatalog as the current catalog of the session
  10. tableEnv.useCatalog("myhive");
  1. val settings = EnvironmentSettings.newInstance().inBatchMode().build()
  2. val tableEnv = TableEnvironment.create(settings)
  3. val name = "myhive"
  4. val defaultDatabase = "mydatabase"
  5. val hiveConfDir = "/opt/hive-conf" // a local path
  6. val version = "2.3.4"
  7. val hive = new HiveCatalog(name, defaultDatabase, hiveConfDir, version)
  8. tableEnv.registerCatalog("myhive", hive)
  9. // set the HiveCatalog as the current catalog of the session
  10. tableEnv.useCatalog("myhive")
  1. execution:
  2. planner: blink
  3. ...
  4. current-catalog: myhive # set the HiveCatalog as the current catalog of the session
  5. current-database: mydatabase
  6. catalogs:
  7. - name: myhive
  8. type: hive
  9. hive-conf-dir: /opt/hive-conf

DDL

即将支持在 Flink 中创建 Hive 表,视图,分区和函数的DDL。

DML

Flink 支持 DML 写入 Hive 表,请参考读写 Hive 表