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、工程目录结构