Java
快速入门 # 本文档提供了一个关于如何使用Flink ML的快速入门。阅读本文档的用户将被指导提交一个简单的Flink作业,用于训练机器学习模型并提供预测服务。
求助,我卡住了!# 如果你遇到困难,请查看社区支持资源。特别是,Apache Flink的用户邮件列表一直被评为Apache项目中最活跃的之一,是快速获得帮助的好途径。
前提条件 # 确保Java 8或更高版本已经安装在您的本地计算机上。要检查已安装的Java版本,请在终端中输入:
$ java -version 下载 Flink # 下载1.15或更高版本的Flink,然后解压缩存档文件:
$ tar -xzf flink-*.tgz 设置 Flink 环境变量 # 下载Flink后,请将$FLINK_HOME注册为本地环境中的环境变量。
cd ${path_to_flink} export FLINK_HOME=pwd 将 Flink ML库添加到 Flink 的库文件夹中 # 您需要将Flink ML的库文件复制到Flink的文件夹中以便正确初始化。
请下载相应的Flink ML二进制发行版,然后解压缩存档文件:
tar -xzf flink-ml-*.tgz 然后,您可以使用以下命令将解压后的库文件复制到Flink的文件夹中。
cd ${path_to_flink_ml} cp ./lib/*.jar $FLINK_HOME/lib/ 运行 Flink ML 示例作业 # 请使用以下命令在本地环境中启动一个Flink独立集群。
$FLINK_HOME/bin/start-cluster.sh 您应该能够导航至localhost:8081查看Flink仪表板并确认集群已启动并运行。
然后,您可以按照如下方式将Flink ML示例提交给集群。
$FLINK_HOME/bin/flink run -c org.apache.flink.ml.examples.clustering.KMeansExample $FLINK_HOME/lib/flink-ml-examples*.jar 上述命令将提交并执行Flink ML的KMeansExample作业。还有其他Flink ML算法的示例作业,您可以在flink-ml-examples模块中找到它们。
终端中的示例输出如下所示。
Features: [9.0, 0.0] Cluster ID: 1
Features: [0.3, 0.0] Cluster ID: 0
Features: [0.0, 0.3] Cluster ID: 0
Features: [9.6, 0.0] Cluster ID: 1
Features: [0.0, 0.0] Cluster ID: 0
Features: [9.0, 0.6] Cluster ID: 1
现在您已经成功运行了一个FlinkML Job。
您将构建什么? Kmeans是一种广泛使用的聚类算法,并得到了Flink ML的支持。本教程将指导您使用Flink ML创建一个Flink作业,初始化并训练一个Kmeans模型,最后使用它来预测某些数据点的聚类ID。
先决条件 # 本教程假定您对Java有一定了解,但即使您使用的是不同的编程语言,也应该能够跟随教程进行。
帮助,我遇到困难了!如果你遇到困难,请查看社区支持资源。特别是,Apache Flink的用户邮件列表一直被评为Apache项目中最活跃的之一,是快速获得帮助的好方法。
如何跟随教程 # 如果您想跟随教程,您需要一台具有以下配置的计算机:
Java 8 Maven 3 尽管在以下步骤中提供了要在CLI中执行的命令以完成此示例,但建议使用IDE,如IntelliJ IDEA,来管理、构建和执行下面的示例代码。
请使用以下命令创建一个Flink Maven Archetype,它提供了一个项目的基本框架,并附带一些必要的Flink依赖项。
$ mvn archetype:generate
-DarchetypeGroupId=org.apache.flink
-DarchetypeArtifactId=flink-quickstart-java
-DarchetypeVersion=1.15.1
-DgroupId=kmeans-example
-DartifactId=kmeans-example
-Dversion=0.1
-Dpackage=myflinkml
-DinteractiveMode=false 上面的命令将在您当前的目录中创建一个名为kmeans-example的maven项目,结构如下:
$ tree kmeans-example
kmeans-example
├── pom.xml
└── src
└── main
├── java
│ └── myflinkml
│ └── DataStreamJob.java
└── resources
└── log4j2.properties
将pom.xml中提供的依赖项更改为以下内容:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-ml-uber</artifactId>
<version>2.2-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-files</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java-bridge</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-runtime</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner-loader</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>statefun-flink-core</artifactId>
<version>3.2.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.12</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.flink</groupId>
<artifactId>flink-metrics-dropwizard</artifactId>
</exclusion>
</exclusions>
</dependency>
创建文件src/main/java/myflinkml/KMeansExample.java,并将以下内容保存到文件中。您可以随意忽略并删除src/main/java/myflinkml/DataStreamJob.java,因为它在本教程中不会被使用。
package myflinkml;
import org.apache.flink.ml.clustering.kmeans.KMeans;
import org.apache.flink.ml.clustering.kmeans.KMeansModel;
import org.apache.flink.ml.linalg.DenseVector;
import org.apache.flink.ml.linalg.Vectors;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.types.Row;
import org.apache.flink.util.CloseableIterator;
public class KMeansExample {
public static void main(String[] args) {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);
String featuresCol = "features";
String predictionCol = "prediction";
// Generate train data and predict data as DataStream.
DataStream<DenseVector> inputStream = env.fromElements(
Vectors.dense(0.0, 0.0),
Vectors.dense(0.0, 0.3),
Vectors.dense(0.3, 0.0),
Vectors.dense(9.0, 0.0),
Vectors.dense(9.0, 0.6),
Vectors.dense(9.6, 0.0)
);
// Convert data from DataStream to Table, as Flink ML uses Table API.
Table input = tEnv.fromDataStream(inputStream).as(featuresCol);
// Creates a K-means object and initialize its parameters.
KMeans kmeans = new KMeans()
.setK(2)
.setSeed(1L)
.setFeaturesCol(featuresCol)
.setPredictionCol(predictionCol);
// Trains the K-means Model.
KMeansModel model = kmeans.fit(input);
// Use the K-means Model for predictions.
Table output = model.transform(input)[0];
// Extracts and displays prediction result.
for (CloseableIterator<Row> it = output.execute().collect(); it.hasNext(); ) {
Row row = it.next();
DenseVector vector = (DenseVector) row.getField(featuresCol);
int clusterId = (Integer) row.getField(predictionCol);
System.out.println("Vector: " + vector + "\tCluster ID: " + clusterId);
}
}
}
在将上述代码放入您的Maven项目之后,您可以使用以下命令或IDE来构建和执行示例作业。
cd kmeans-example/
mvn clean package
mvn exec:java -Dexec.mainClass="myflinkml.KMeansExample" -Dexec.classpathScope="compile"
如果您在IDE中运行项目,您可能会遇到java.lang.NoClassDefFoundError异常。这可能是因为您没有将所有所需的Flink依赖项隐式加载到类路径中。
IntelliJ IDEA:转到 Run > Edit Configurations > Modify options > 选择“Provided”的范围内的依赖项。此运行配置现在将包括所有从IDE内运行应用程序所需的类。
执行作业后,类似以下信息将输出到您的终端窗口。
Vector: [0.3, 0.0] Cluster ID: 1
Vector: [9.6, 0.0] Cluster ID: 0
Vector: [9.0, 0.6] Cluster ID: 0
Vector: [0.0, 0.0] Cluster ID: 1
Vector: [0.0, 0.3] Cluster ID: 1
Vector: [9.0, 0.0] Cluster ID: 0
程序可能在打印出上述信息后卡住,您可能需要输入^C终止进程。这种情况只会发生在本地执行程序时,而在提交作业到Flink集群时则不会发生。
解析代码#
执行环境#
前几行设置了StreamExecutionEnvironment以执行Flink ML作业。如果您有使用Flink的经验,您对此概念应该很熟悉。对于本文档中的示例程序,一个简单的StreamExecutionEnvironment,没有特定配置就足够了。
考虑到Flink ML使用Flink的Table API,接下来的程序还需要一个StreamTableEnvironment。
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);
创建训练和推理数据表#
接下来,程序创建了包含Kmeans算法训练和预测过程数据的表。Flink ML操作符会搜索输入表中的列名以获取输入数据,并将预测结果输出到指定的输出表列。
DataStream<DenseVector> inputStream = env.fromElements(
Vectors.dense(0.0, 0.0),
Vectors.dense(0.0, 0.3),
Vectors.dense(0.3, 0.0),
Vectors.dense(9.0, 0.0),
Vectors.dense(9.0, 0.6),
Vectors.dense(9.6, 0.0)
);
Table input = tEnv.fromDataStream(inputStream).as(featuresCol);
创建、配置、训练和使用Kmeans#
Flink ML的Kmeans算法类包括KMeans和KMeansModel。KMeans基于提供的训练数据实现Kmeans算法的训练过程,并最终生成一个KMeansModel。
将输入表与数据流相连接:
Table input = tEnv.fromDataStream(inputStream).as(featuresCol);
创建、配置、训练和使用 Kmeans #
Flink ML 中与 Kmeans 算法相关的类包括 KMeans 和 KMeansModel。KMeans 基于提供的训练数据实现 Kmeans 算法的训练过程,并最终生成一个 KMeansModel。KmeansModel.transform() 方法编码了此算法的转换逻辑,用于预测。
KMeans 和 KMeansModel 都为 Kmeans 算法的配置参数提供 getter/setter 方法。示例程序显式设置以下参数,其他配置参数将使用其默认值。
K,要创建的聚类数量
seed,用于初始化聚类中心的随机种子
featuresCol,包含输入特征向量的列名
predictionCol,用于输出预测结果的列名
当程序调用 KMeans.fit() 生成一个 KMeansModel 时,KMeansModel 将继承 KMeans 对象的配置参数。因此,可以直接在 KMeans 对象中设置 KMeansModel 的参数。
KMeans kmeans = new KMeans()
.setK(2)
.setSeed(1L)
.setFeaturesCol(featuresCol)
.setPredictionCol(predictionCol);
KMeansModel model = kmeans.fit(input);
Table output = model.transform(input)[0];
收集预测结果 #
与所有其他 Flink 程序一样,上述各节中描述的代码仅配置 Flink 作业的计算图,程序仅在调用 execute() 方法后评估计算逻辑并收集输出。从输出表收集的输出结果将是行,其中 featuresCol 包含输入特征向量,predictionCol 包含输出预测结果,即,簇 ID。
for (CloseableIterator<Row> it = output.execute().collect(); it.hasNext(); ) {
Row row = it.next();
DenseVector vector = (DenseVector) row.getField(featuresCol);
int clusterId = (Integer) row.getField(predictionCol);
System.out.println("Vector: " + vector + "\tCluster ID: " + clusterId);
}
Vector: [0.3, 0.0]Cluster ID: 1
Vector: [9.6, 0.0]Cluster ID: 0
Vector: [9.0, 0.6]Cluster ID: 0
Vector: [0.0, 0.0]Cluster ID: 1
Vector: [0.0, 0.3]Cluster ID: 1
Vector: [9.0, 0.0]Cluster ID: 0
Python
快速入门 # 本文档提供了关于使用 Flink ML 的快速入门。本文档的读者将被引导创建一个简单的 Flink 作业,用于训练一个机器学习模型,并使用它提供预测服务。
您将构建什么? # Kmeans 是一种广泛使用的聚类算法,已被 Flink ML 支持。本教程将指导您使用 Flink ML 创建一个 Flink 作业,初始化并训练一个 Kmeans 模型,最后使用它来预测某些数据点的簇 ID。
前提条件 # 本教程假定您对 Python 有一定的熟悉程度,但即使您使用的是其他编程语言,您也应该能够跟随进行。
我遇到困难了! # 如果你遇到困难,请查看社区支持资源。特别是,Apache Flink 的用户邮件列表一直被评为任何 Apache 项目中最活跃的之一,是快速获得帮助的好方法。
如何跟随操作 # 如果您想跟随操作,您需要一台电脑,配置如下:
Java 8 Python 3.6、3.7 或 3.8 本教程需要安装 Flink ML Python SDK,该 SDK 可在 PyPi 上获取,可使用 pip 轻松安装。
$ python -m pip install apache-flink-ml==2.2.0 编写 Flink ML Python 程序 # Flink ML 程序首先需要设置 StreamExecutionEnvironment 以执行 Flink ML 作业。如果您有使用 Flink 的经验,您应该已经熟悉这个概念。对于本文档中的示例程序,一个简单的 StreamExecutionEnvironment,不需要特定配置即可。
考虑到 Flink ML 使用 Flink 的 Table API,接下来的程序还需要一个 StreamTableEnvironment。
创建一个新的 StreamExecutionEnvironment
env = StreamExecutionEnvironment.get_execution_environment()
创建一个 StreamTableEnvironment
t_env = StreamTableEnvironment.create(env) 接下来,您可以创建包含以下 Kmeans 算法的训练和预测过程数据的表。Flink ML 操作符会搜索输入表的列名以获取输入数据,并将预测结果输出到指定的输出表的列中。
生成输入数据
input_data = t_env.from_data_stream(
env.from_collection([
(Vectors.dense([0.0, 0.0]),),
(Vectors.dense([0.0, 0.3]),),
(Vectors.dense([0.3, 3.0]),),
(Vectors.dense([9.0, 0.0]),),
(Vectors.dense([9.0, 0.6]),),
(Vectors.dense([9.6, 0.0]),),
],
type_info=Types.ROW_NAMED(
['features'],
[DenseVectorTypeInfo()])))
Flink ML 中与 Kmeans 算法相关的类包括 KMeans 和 KMeansModel。KMeans 基于提供的训练数据实现 Kmeans 算法的训练过程,并最终生成一个 KMeansModel。KmeansModel.transform() 方法编码了此算法的转换逻辑,用于预测。
KMeans 和 KMeansModel 都为 Kmeans 算法的配置参数提供 getter/setter 方法。此示例程序明确设置了以下参数,其他配置参数将使用其默认值。
k,要创建的聚类数量
seed,用于初始化聚类中心的随机种子
当程序调用 KMeans.fit() 生成一个 KMeansModel 时,KMeansModel 将继承 KMeans 对象的配置参数。因此,可以直接在 KMeans 对象中设置 KMeansModel 的参数。
创建一个 kmeans 对象并初始化其参数
kmeans = KMeans().set_k(2).set_seed(1)
训练 kmeans 模型
model = kmeans.fit(input_data)
使用 kmeans 模型进行预测
output = model.transform(input_data)[0]
与所有其他 Flink 程序一样,上述各节中描述的代码仅配置 Flink 作业的计算图,程序仅在调用 execute() 方法后评估计算逻辑并收集输出。从输出表收集的输出结果将是行,其中 featuresCol 包含输入特征向量,predictionCol 包含输出预测结果,即,簇 ID。
提取并显示结果
field_names = output.get_schema().get_field_names()
for result in t_env.to_data_stream(output).execute_and_collect():
features = result[field_names.index(kmeans.get_features_col())]
cluster_id = result[field_names.index(kmeans.get_prediction_col())]
print('Features: ' + str(features) + ' \tCluster Id: ' + str(cluster_id))
到目前为止的完整代码:
from pyflink.common import Types
from pyflink.datastream import StreamExecutionEnvironment
from pyflink.ml.linalg import Vectors, DenseVectorTypeInfo
from pyflink.ml.clustering.kmeans import KMeans
from pyflink.table import StreamTableEnvironment
# create a new StreamExecutionEnvironment
env = StreamExecutionEnvironment.get_execution_environment()
# create a StreamTableEnvironment
t_env = StreamTableEnvironment.create(env)
# generate input data
input_data = t_env.from_data_stream(
env.from_collection([
(Vectors.dense([0.0, 0.0]),),
(Vectors.dense([0.0, 0.3]),),
(Vectors.dense([0.3, 3.0]),),
(Vectors.dense([9.0, 0.0]),),
(Vectors.dense([9.0, 0.6]),),
(Vectors.dense([9.6, 0.0]),),
],
type_info=Types.ROW_NAMED(
['features'],
[DenseVectorTypeInfo()])))
# create a kmeans object and initialize its parameters
kmeans = KMeans().set_k(2).set_seed(1)
# train the kmeans model
model = kmeans.fit(input_data)
# use the kmeans model for predictions
output = model.transform(input_data)[0]
# extract and display the results
field_names = output.get_schema().get_field_names()
for result in t_env.to_data_stream(output).execute_and_collect():
features = result[field_names.index(kmeans.get_features_col())]
cluster_id = result[field_names.index(kmeans.get_prediction_col())]
print('Features: ' + str(features) + ' \tCluster Id: ' + str(cluster_id))
在本地执行 Flink ML Python 程序 # 在创建了一个 python 文件(例如 kmeans_example.py)并将上述代码保存到该文件后,你可以在命令行中运行示例:
python kmeans_example.py 上述命令将构建示例作业并在本地小型集群中运行。你的终端中的示例输出如下。
Features: [9.6,0.0] Cluster Id: 0
Features: [9.0,0.6] Cluster Id: 0
Features: [0.0,0.3] Cluster Id: 1
Features: [0.0,0.0] Cluster Id: 1
Features: [0.3,3.0] Cluster Id: 1
Features: [9.0,0.0] Cluster Id: 0
在 Flink 集群上执行 Flink ML Python 程序 #
先决条件 #
确保在本地计算机上已安装 Java 8 或更高版本。要检查已安装的 Java 版本,请在终端中键入:
$ java -version
下载 Flink #
下载 1.15 或更高版本的 Flink,然后解压缩存档:
$ tar -xzf flink-*.tgz
设置 Flink 环境变量 #
下载 Flink 后,请将 $FLINK_HOME 作为环境变量注册到本地环境中。
cd ${path_to_flink}
export FLINK_HOME=pwd
将 Flink ML 库添加到 Flink 的库文件夹中 #
你需要将 Flink ML 的库文件复制到 Flink 的文件夹以进行正确的初始化。
请下载 Flink ML 的相应二进制发布版本,然后解压缩存档:
tar -xzf flink-ml-*.tgz
然后,你可以使用以下命令将提取的库文件复制到 Flink 的文件夹。
cd ${path_to_flink_ml}
cp ./lib/*.jar $FLINK_HOME/lib/
运行 Flink ML 作业 #
请使用以下命令在本地环境中启动 Flink 独立集群。
$FLINK_HOME/bin/start-cluster.sh
你应该能够导航到 localhost:8081 的 web UI,查看 Flink 仪表板并查看集群已启动并运行。
在创建了一个 python 文件(例如 kmeans_example.py)并将上述代码保存到该文件后,你可以按照如下方式将示例作业提交给集群。
$FLINK_HOME/bin/flink run -py kmeans_example.py
终端中的示例输出如下
Features: [9.6,0.0] Cluster Id: 0
Features: [9.0,0.6] Cluster Id: 0
Features: [0.0,0.3] Cluster Id: 1
Features: [0.0,0.0] Cluster Id: 1
Features: [0.3,3.0] Cluster Id: 1
Features: [9.0,0.0] Cluster Id: 0
开发
概述#
本文档简要介绍了 Flink ML 中的基本概念。
Table API #
Flink ML 的 API 基于 Flink 的Table API。Table API 是 Java、Scala 和 Python 的语言集成查询 API,允许以非常直观的方式从关系运算符(如选择、过滤和连接)组成查询。
Table API 允许使用多种数据类型。Flink 文档数据类型页面提供了支持类型的列表。除这些类型外,Flink ML 还为 VectorType 提供支持。
Table API 与 Flink 的 DataStream API 无缝集成。您可以轻松在所有 API 和构建在其上的库之间切换。请参阅 Flink 文档了解如何在 Table 和 DataStream 之间转换,以及 Flink 表 API 的其他用法。
阶段 #
阶段(Stage)是 Pipeline 或 Graph 中的一个节点。它是 Flink ML 中的基本组件。这个接口只是一个概念,没有实际功能。其子类包括以下内容。
估算器:估算器(Estimator)是负责机器学习算法训练过程的阶段(Stage)。它实现了一个 fit() 方法,该方法接受一个Table列表并生成一个模型(Model)。
AlgoOperator:AlgoOperator 是一个阶段(Stage),用于编码通用多输入多输出计算逻辑。它实现了一个 transform() 方法,该方法将特定计算逻辑应用于给定输入Table,并返回结果Table列表。
转换器:转换器(Transformer)是具有语义差异的 AlgoOperator,它编码了转换逻辑,这样输出中的记录通常对应于输入中的一个记录。相比之下,AlgoOperator 更适合表达聚合逻辑,其中输出中的记录可以从输入中的任意数量的记录计算得出。
模型:模型(Model)是具有额外 API 用于设置和获取模型数据的转换器(Transformer)。它通常由在Table列表上拟合估算器(Estimator)生成。它提供了 getModelData() 和 setModelData(),允许用户显式地将模型数据表读取或写入转换器。每个Table都可以是无界的模型数据无界流。
典型的阶段(Stage)用法是首先创建一个估算器(Estimator)实例,通过调用其 fit() 方法触发其训练过程,并使用生成的模型(Model)实例进行预测。下面的代码示例了这种用法。
// 假设 SumModel 是 Model 的具体子类,SumEstimator 是 Estimator 的具体子类。
Table trainData = ...;
Table predictData = ...;
SumEstimator estimator = new SumEstimator();
SumModel model = estimator.fit(trainData);
Table predictResult = model.transform(predictData)[0];
构建器#
为了将 Flink ML 阶段组织成更复杂的格式以实现高级功能,例如将数据处理和机器学习算法链接在一起,Flink ML 提供了有助于管理 Flink 任务中阶段关系和结构的 API。这些 API 的入口包括 Pipeline 和 Graph。
管道#
Pipeline 充当 Estimator。它由有序阶段列表组成,每个阶段可以是 Estimator、Model、Transformer 或 AlgoOperator。其 fit() 方法按顺序遍历此管道的所有阶段,并在最后一个 Estimator(包括)之前的每个阶段执行以下操作。
如果一个阶段是 Estimator,它将使用输入表调用该阶段的 fit() 方法以生成 Model。如果在此阶段之后还有 Estimator,它将使用生成的 Model 转换输入表以获取结果表,然后将结果表作为输入传递给下一个阶段。
如果一个阶段是 AlgoOperator 且在此阶段之后有 Estimator,它将使用此阶段转换输入表以获取结果表,然后将结果表作为输入传递给下一个阶段。
在所有的 Estimators 都经过训练以适应其输入表之后,将使用与此管道中相同的阶段创建一个新的 PipelineModel,只是 PipelineModel 中的所有 Estimators 都被在上述过程中生成的模型替换。
PipelineModel 充当 Model。它由有序阶段列表组成,每个阶段可以是 Model、Transformer 或 AlgoOperator。其 transform() 方法按顺序将此 PipelineModel 中的所有阶段先应用于输入表。一个阶段的输出用作下一个阶段(如果有)的输入。最后一个阶段的输出作为此方法的结果返回。
可以通过将 Stages 列表传递给 Pipeline 的构造函数来创建 Pipeline。例如,
// 假设 SumModel 是 Model 的具体子类,SumEstimator 是 Estimator 的具体子类。
Model modelA = new SumModel().setModelData(tEnv.fromValues(10));
Estimator estimatorA = new SumEstimator();
Model modelB = new SumModel().setModelData(tEnv.fromValues(30));
List<Stage<?>> stages = Arrays.asList(modelA, estimatorA, modelB);
Estimator<?, ?> estimator = new Pipeline(stages);
以上命令创建了如下所示的管道。
编辑
添加图片注释,不超过 140 字(可选)
Graph#
AGraph充当估算器。AGraph由一个有向无环图(DAG)组成,每个阶段可以是估算器、模型、转换器或算法运算符(Estimator,Model,TransformerorAlgoOperator)。当调用Graph::fit时,按照拓扑排序顺序执行阶段。如果某个阶段是估算器,它的Estimator::fit方法将在输入Table(来自输入边)上调用,以适应模型。然后,该模型将用于转换输入表并生成输出表到输出边。如果某个阶段是算法运算符,那么其AlgoOperator::transform方法将在输入表上调用,并生成输出表到输出边。从AGraph拟合出的GraphModel由拟合的模型和算法运算符组成,对应于AGraph的阶段。
AGraphModel充当模型。AGraphModel由一个有向无环图(DAG)组成,每个阶段可以是估算器、模型、转换器或算法运算符。当调用GraphModel::transform时,按照拓扑排序顺序执行阶段。执行阶段时,将在输入表(来自输入边)上调用其AlgoOperator::transform方法,并生成输出表到输出边。
通过GraphBuilder类可以构建AGraph,它提供了如addAlgoOperator或addEstimator等方法来帮助向图中添加阶段。Flink ML还引入了TableId类来表示阶段的输入/输出,并帮助表示图中阶段之间的关系,从而允许用户在具体表可用之前构建DAG。
以下示例代码演示了如何构建AGraph。
// 假设 SumModel 是 Model 的具体子类。
GraphBuilder builder = new GraphBuilder();
// 创建节点。
SumModel stage1 = new SumModel().setModelData(tEnv.fromValues(1));
SumModel stage2 = new SumModel();
SumModel stage3 = new SumModel().setModelData(tEnv.fromValues(3));
// 创建输入和 modelDataInputs。
TableId input = builder.createTableId();
TableId modelDataInput = builder.createTableId();
// 输入数据并获取输出。
TableId output1 = builder.addAlgoOperator(stage1, input)[0];
TableId output2 = builder.addAlgoOperator(stage2, output1)[0];
builder.setModelDataOnModel(stage2, modelDataInput);
TableId output3 = builder.addAlgoOperator(stage3, output2)[0];
TableId modelDataOutput = builder.getModelDataFromModel(stage3)[0];
// 从图中构建模型。
TableId[] inputs = new TableId[] {input};
TableId[] outputs = new TableId[] {output3};
TableId[] modelDataInputs = new TableId[] {modelDataInput};
TableId[] modelDataOutputs = new TableId[] {modelDataOutput};
Model<?> model = builder.buildModel(inputs, outputs, modelDataInputs, modelDataOutputs);
上述代码构建了如下的AGraph。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
参数#
Flink MLStage是WithParams的一个子类,它提供了一个统一的API来获取和设置参数。
Param是参数的定义,包括名称、类、描述、默认值和验证器(name, class, description,default value and the validator)。
为了设置算法的参数,用户可以使用以下任何一种方法。
调用参数的特定设置方法。例如,为了设置K-means算法的K值(聚类数目),用户可以直接在KMeans实例上调用setK()方法。
通过ParamUtils.updateExistingParams()方法将包含新值的参数映射传递给阶段。
如果一个Model是通过Estimator的fit()方法生成的,那么Model将继承Estimator对象的参数。因此,如果参数没有改变,就不需要再次设置参数。
迭代 #
迭代是机器学习库的基本构建块。在机器学习算法中,迭代可能用于离线或在线训练过程。通常需要两种类型的迭代,而Flink ML为了支持各种算法&