
# 如何贡献

> 译者：[flink.sojb.cn](https://flink.sojb.cn/)


Flink社区高度赞赏对FlinkML的各种贡献。FlinkML为那些对机器学习感兴趣的人们提供了一个高度活跃的开源项目，该项目可以实现可扩展的ML现实。以下文档描述了如何为FlinkML做出贡献。

## 入门

为了开始先阅读Flink的[贡献指南](http://flink.apache.org/how-to-contribute.html)。本指南中的所有内容也适用于FlinkML。

## 选择一个主题

如果您正在寻找一些新想法，首先应该查看我们的[路线图](https://cwiki.apache.org/confluence/display/FLINK/FlinkML%3A+Vision+and+Roadmap)，然后您应该查看[JIRA](https://issues.apache.org/jira/issues/?jql=component%20%3D%20%22Machine%20Learning%20Library%22%20AND%20project%20%3D%20FLINK%20AND%20resolution%20%3D%20Unresolved%20ORDER%20BY%20priority%20DESC)上[尚未解决的问题](https://issues.apache.org/jira/issues/?jql=component%20%3D%20%22Machine%20Learning%20Library%22%20AND%20project%20%3D%20FLINK%20AND%20resolution%20%3D%20Unresolved%20ORDER%20BY%20priority%20DESC)列表。一旦您决定为其中一个问题做出贡献，您应该对其拥有所有权并跟踪此问题的进度。这样，其他贡献者就知道了不同问题的状态，避免了冗余工作。

如果你已经知道你想要为FlinkML做出什么贡献了。尽管如此，仍然建议为您的想法创建一个JIRA问题，告诉Flink社区您想要做什么。

## 测试

应该通过测试来提供新的贡献来验证算法的正确行为。这些测试有助于在整个代码更改过程中保持算法的正确性，例如重构。

我们区分了在Maven测试阶段执行的单元测试和在maven验证阶段执行的集成测试。Maven通过使用以下命名规则自动进行区分：所有类名以满足正则表达式的后缀结尾的测试用例`(IT|Integration)(Test|Suite|Case)`都被视为集成测试。其余的被认为是单元测试，应该只测试被测组件的本地行为。

集成测试是一项测试，需要启动完整的Flink系统。为了做到这一点，所有集成测试用例都必须混合使用特性`FlinkTestBase`。此特性将设置为正确，`ExecutionEnvironment`以便测试将在特定的`FlinkMiniCluster`特定测试目的上执行。因此，集成测试可能会出现以下情况：



```
class ExampleITSuite extends FlatSpec with FlinkTestBase {
  behavior of "An example algorithm"

  it should "do something" in {
    ...
  }
}
```



测试样式不一定是，`FlatSpec`但可以是任何其他scalatest `Suite`子类。有关更多信息，请参阅[ScalaTest测试样式](http://scalatest.org/user_guide/selecting_a_style)。

## 文档

在提供新算法时，需要添加描述算法工作方式的代码注释以及用户可以控制其行为的参数。此外，我们还希望鼓励贡献者将此信息添加到在线文档中。可以在目录中找到FlinkML组件的在线文档`docs/libs/ml`。

每个新算法都由一个markdown文件描述。该文件至少应包含以下几点：

1.  算法做了什么
2.  算法如何工作（或参考描述）
3.  带有默认值的参数说明
4.  显示如何使用算法的代码段

要在markdown文件中使用latex语法，您必须包含`mathjax: include`在YAML前端内容中。



```
---
mathjax: include
htmlTitle: FlinkML - Example title
title: <a href="../ml">FlinkML</a> - Example title
---
```



为了使用显示的数学，你必须将你的乳胶代码放入`$$ ... $$`。对于在线数学，请使用`$ ... $`。此外，一些预定义的乳胶命令包含在markdown文件的范围内。有关`docs/_include/latex_commands.html`预定义乳胶命令的完整列表，请参阅。

## 特约

一旦您使用足够的测试覆盖率和添加的文档实现了算法，您就可以打开拉取请求了。有关如何打开拉取请求的详细信息，请参见[此处](http://flink.apache.org/how-to-contribute.html#contributing-code--documentation)。

