手动安装 Hadoop 生态:Flink 配置与测试

想在 JupyterLab 里手动把 PyFlink 跑起来(本地 / 对接 HiveCatalog)时读这篇

平台使用 / 在线开发
Flinkpyflinkapache-flinkHiveCatalogHiveMavenflink-depJDK8flink-connector-hiveTableEnvironmentdatagen

手动安装 Hadoop 生态:Flink 配置与测试

本文是“基于已有镜像手动安装”路线的第二部分(Flink)。前置环境(启动容器、Hadoop 配置)见 01-手动安装:Spark 配置与测试。版本号沿用原始教程示例(Flink 1.15.1),如需与集成镜像一致请改用 README 中的版本(1.17.0)。

一、安装配置 Flink

1.1 安装 PyFlink

pip install apache-flink==1.15.1

如果不需要用到 HiveCatalog,可直接进入 二、测试 Flink 进行测试。

1.2 修改 JDK 版本

镜像里自带的是 JDK11,但 Hive3 是基于 Java8 编译的,基于 JDK11 运行时 PyFlink 连接 HiveCatalog 会报错。因此修改 JDK 版本为 8:

# 删除已有的 JDK11
rm -rf /usr/lib/jvm/

# 安装 JDK8
apt-get update
apt-get install -y openjdk-8-jdk

# 设置环境变量
vi ~/.bashrc

# java
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

source ~/.bashrc

# 测试 java 命令
java -version

1.3 安装 Maven

PyFlink 连接 Hive Catalog 时要配置一些依赖 jar 包,可以通过 maven 一次性批量安装:

cd /opt/third
wget http://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz

tar -xvzf apache-maven-3.8.6-bin.tar.gz
ln -s apache-maven-3.8.6 maven

# 配置 maven 镜像
vi maven/conf/settings.xml
# <mirrors> 内添加如下内容
    <!-- 华为云镜像 -->
    <mirror>
        <id>huaweimaven</id>
        <name>huawei maven</name>
        <url>https://mirrors.huaweicloud.com/repository/maven/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
    <!-- 阿里云镜像 -->
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
# 设置环境变量
vi ~/.bashrc

# maven
export M2_HOME=/opt/third/maven
export PATH=$PATH:$M2_HOME/bin

source ~/.bashrc
mvn -v

1.4 批量安装依赖

mkdir -p /opt/third/flink

cd /opt/third/flink
mkdir lib
# 新建 flink-dep.xml 定义依赖的 jar(后续可直接扩展)
vi flink-dep.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.flink.dep</groupId>
  <artifactId>flink-dep</artifactId>
  <version>1.0.0</version>

  <properties>
    <flink.version>1.15.1</flink.version>
    <hadoop.version>3.2.2</hadoop.version>
    <hive.version>3.1.2</hive.version>
    <scala.binary.version>2.12</scala.binary.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-connector-hive_${scala.binary.version}</artifactId>
      <version>${flink.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>${hive.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-mapreduce-client-core</artifactId>
      <version>${hadoop.version}</version>
    </dependency>
  </dependencies>
</project>
# 运行命令下载依赖
mvn -f flink-dep.xml dependency:copy-dependencies -DoutputDirectory=/opt/third/flink/lib

集成镜像中也内置了这份 flink-dep.xml(见 images/jupyter-notebook/bigdata/conf/flink/flink-dep.xml),可直接参考。

1.5 上传 Hive 配置文件

在 JupyterLab 新建 Terminal 执行:

# 新建目录
mkdir -p /opt/third/hive/conf

在 Web 界面中上传 hive-site.xml/opt/third/hive/conf 目录下。

二、测试 Flink

新建 Python3 Notebook 来测试。

2.1 本地运行

pyflink_sql.ipynb

from pyflink.table import EnvironmentSettings, TableEnvironment

env_settings = EnvironmentSettings.in_streaming_mode()
t_env = TableEnvironment.create(env_settings)

t_env.execute_sql("""
    CREATE TABLE random_source(
        id BIGINT,
        data TINYINT
    ) WITH (
        'connector' = 'datagen',
        'fields.id.kind'='sequence',
        'fields.id.start'='1',
        'fields.id.end'='8',
        'fields.data.kind'='sequence',
        'fields.data.start'='4',
        'fields.data.end'='11'
    )
""")

t_env.execute_sql("""
    CREATE TABLE print_sink (
        id BIGINT,
        data_sum TINYINT
    ) WITH (
        'connector' = 'print'
    )
""")

t_env.execute_sql("""
    INSERT INTO print_sink
        SELECT id, sum(data) as data_sum FROM
            (SELECT id / 2 as id, data FROM random_source )
        WHERE id > 1
        GROUP BY id
""").wait()

2.2 本地运行(HiveCatalog)

元数据会存储到 Hive MetaStore 中,pyflink_sql_hivecatalog.ipynb

import os
from pyflink.table import EnvironmentSettings, TableEnvironment

env_settings = EnvironmentSettings.in_streaming_mode()
t_env = TableEnvironment.create(env_settings)

flink_lib_path = "/opt/third/flink/lib"
jars = []
for file in os.listdir(flink_lib_path):
    if file.endswith('.jar'):
        jars.append(os.path.basename(file))
str_jars = ';'.join(['file://' + flink_lib_path + '/' + jar for jar in jars])
t_env.get_config().get_configuration().set_string("pipeline.jars", str_jars)

from pyflink.table.catalog import HiveCatalog

# Create a HiveCatalog
catalog_name = "hive"
default_database = "default"
catalog = HiveCatalog(catalog_name, default_database, "/opt/third/hive/conf")
t_env.register_catalog(catalog_name, catalog)
t_env.use_catalog(catalog_name)

t_env.execute_sql("DROP TABLE IF EXISTS random_source_pyflink")
t_env.execute_sql("""
    CREATE TABLE IF NOT EXISTS random_source_pyflink (
        id BIGINT,
        data TINYINT
    ) WITH (
        'connector' = 'datagen',
        'fields.id.kind'='sequence',
        'fields.id.start'='1',
        'fields.id.end'='8',
        'fields.data.kind'='sequence',
        'fields.data.start'='4',
        'fields.data.end'='11'
    )
""")

t_env.execute_sql("DROP TABLE IF EXISTS print_sink_pyflink")
t_env.execute_sql("""
    CREATE TABLE IF NOT EXISTS print_sink_pyflink  (
        id BIGINT,
        data_sum TINYINT
    ) WITH (
        'connector' = 'print'
    )
""")

t_env.execute_sql("""
    INSERT INTO print_sink_pyflink
        SELECT id, sum(data) as data_sum FROM
            (SELECT id / 2 as id, data FROM random_source_pyflink )
        WHERE id > 1
        GROUP BY id
""").wait()

上述操作完成后,可通过 pyspark 作业查看到新建的表 random_source_pyflinkprint_sink_pyflink

import os
import findspark

os.environ['SPARK_HOME'] = '/opt/third/spark'
findspark.init()

from pyspark.sql import SparkSession

if __name__ == "__main__":
    spark = SparkSession.builder \
        .appName('spark-hive-demo') \
        .config("hive.metastore.uris", "thrift://192.168.90.150:9083") \
        .enableHiveSupport() \
        .getOrCreate()

    spark.sql("show tables").show()
最后更新 2026-06-30完整文档以官方仓库为准:GitHub Wiki