Java Flink调用Python脚本示例【亲测成功】

1、本地安装Python3.8版本【注意!!! 一定是3.7或者3.8,建议是3.8,3.10版本亲测失败】

2、Python安装 apache-flink

python -m pip install apache-flink==1.13.6

 3、Pom文件依赖【Java版本一定要和Python版本 Flink版本一样】

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <flink.version>1.13.6</flink.version>
  <target.java.version>1.8</target.java.version>
  <scala.binary.version>2.11</scala.binary.version>
  <maven.compiler.source>${target.java.version}</maven.compiler.source>
  <maven.compiler.target>${target.java.version}</maven.compiler.target>
  <log4j.version>2.12.1</log4j.version>
  <logback.version>1.2.3</logback.version>
  <log4j-over-slf4j.version>1.7.30</log4j-over-slf4j.version>
</properties>
  <dependencies>

    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-streaming-java_2.11</artifactId>
      <version>${flink.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-python_2.11</artifactId>
      <version>${flink.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-table-planner-blink_2.11</artifactId>
      <version>${flink.version}</version>
    </dependency>


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

    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-table-api-java</artifactId>
      <version>${flink.version}</version>
    </dependency>

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>${logback.version}</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-access</artifactId>
      <version>${logback.version}</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>${logback.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>log4j-over-slf4j</artifactId>
      <version>${log4j-over-slf4j.version}</version>
    </dependency>
  </dependencies>

4、 Java Flink的样例Demo【LocalRunningDataSourceTest.java】

package org.example;

import org.apache.flink.api.java.tuple.Tuple1;
import org.apache.flink.python.PythonOptions;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.types.Row;

import static org.apache.flink.table.api.Expressions.$;


public class LocalRunningDataSourceTest {
    private static StreamExecutionEnvironment env;
    private static StreamTableEnvironment tableEnv;
    public static void main(String[] args) throws Exception {

        env = StreamExecutionEnvironment.createLocalEnvironment();
        EnvironmentSettings build = EnvironmentSettings.newInstance().inStreamingMode().useBlinkPlanner().build();
        tableEnv = StreamTableEnvironment.create(env,build);
        tableEnv.getConfig().getConfiguration().setString(PythonOptions.PYTHON_FILES, "/Users/mengchen1/IdeaProjects/py_flink_test/src/main/resources/python/test1.py");
        tableEnv.getConfig().getConfiguration().setString(PythonOptions.PYTHON_CLIENT_EXECUTABLE, "/usr/local/anaconda3/envs/py38/bin/python3");
        tableEnv.getConfig().getConfiguration().setString(PythonOptions.PYTHON_EXECUTABLE, "/usr/local/anaconda3/envs/py38/bin/python3");
        tableEnv.executeSql("CREATE TEMPORARY SYSTEM FUNCTION FunctionName AS 'test1.FunctionName' LANGUAGE PYTHON");

        DataStream<Tuple1<String>> dataStream = env.fromElements(
                new Tuple1<>("Alice"),
                new Tuple1<>("Bob"),
                new Tuple1<>("Charlie"));


        Table table = tableEnv.fromDataStream(dataStream, $("name")).select("FunctionName(name)");

        tableEnv.toAppendStream(table, Row.class).print();

        env.execute();
    }


}

5、Python文件【test1.py】

#!/usr/bin/env python3

from pyflink.table import DataTypes
from pyflink.table.udf import udf, ScalarFunction


@udf(input_types=DataTypes.STRING(), result_type=DataTypes.STRING())
def FunctionName(id):
    # output temperature: pandas.Series
    return f"{id}|123"

6、工程目录结构

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Flink Java 项目中运行 Python 代码可以使用 PyFlink。PyFlinkFlinkPython API,它提供了一种简单的方式来编写 Flink Job,而无需编写 Java 或 Scala 代码。 以下是一些使用 PyFlink 运行 Python 代码的步骤: 1. 安装 PyFlink:可以使用 pip 命令安装 PyFlink。 ``` pip install apache-flink ``` 2. 编写 Python 代码:编写你的 PyFlink 代码。例如: ```python from pyflink.table import * from pyflink.table.descriptors import FileSystem, OldCsv, Schema t_env = BatchTableEnvironment.create() t_env.connect(FileSystem().path('/path/to/your/file')) \ .with_format(OldCsv() .field('name', DataTypes.STRING()) .field('age', DataTypes.INT())) \ .with_schema(Schema() .field('name', DataTypes.STRING()) .field('age', DataTypes.INT())) \ .create_temporary_table('mySource') t_env.connect(FileSystem().path('/path/to/your/output')) \ .with_format(OldCsv() .field('name', DataTypes.STRING()) .field('age', DataTypes.INT())) \ .with_schema(Schema() .field('name', DataTypes.STRING()) .field('age', DataTypes.INT())) \ .create_temporary_table('mySink') t_env.from_path('mySource') \ .filter("age > 18") \ .insert_into('mySink') t_env.execute("MyPyFlinkJob") ``` 3. 运行 Python 代码:在 Flink 集群上运行 Python 代码。可以使用以下命令提交 PyFlink 作业: ``` bin/flink run -p <parallelism> -py <path/to/your/python/file> <path/to/your/flink/job/config/file> ``` 其中,`<parallelism>` 是作业的并行度,`<path/to/your/python/file>` 是你的 Python 代码的路径,`<path/to/your/flink/job/config/file>` 是你的 Flink 配置文件的路径。 这些步骤可以帮助你在 Flink Java 项目中运行 Python 代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊猫码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值