手推FlinkML2.2(一)

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为了支持各种算法,支持这两种迭

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值