【Flink原理和应用】:记一次Flink源码编译的过程

前言

最近在预研Flink Gelly源码中,给Gelly源码添加了几个功能点,想打包发布,应用在本身的项目中部署。然而源码编译的过程当中,不是一路顺风了,踩了些坑,因此本文记录了一次源码编译的过程。java

1. 克隆Flink源码

首先,把Flink源码克隆到本地:node

git clone https://github.com/apache/flink.git

2. 直接进行打包编译

执行:python

mvn clean package -DskipTests

报错了,有些包在http://maven.aliyun.com/nexus/content/groups/public下载不到。jquery

由于阿里云的镜像有些包估计还不全面。因此须要修改maven的settings.xml文件,用国际化的镜像来作为maven的公共库:git

<mirror>
      	<id>UK</id>
		  <mirrorOf>central</mirrorOf>
		  <name>UK Central</name>
		  <url>http://uk.maven.org/maven2</url>
    </mirror>

注意这里还须要作步操做,删除mavenReposity/org/apache/flink目录。github

而后再一次执行编译,报错了,错误日志:web

Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:2.17

错误日志消息很明显,是maven-checkstyle-plugin出错了。docker

maven checkstyle plugin的简单介绍shell

为了在提交代码以前作一些必要的代码检查,咱们须要使用一些工具来辅助咱们的工做——对于maven工程咱们可使用maven checkstyle plugin。apache

执行:

mvn checkstyle:checkstyle

命令检查工程是否知足checkstyle。

采起对策:就是把根目录flink-release-1.7里的pom.xml文件的这部分注释掉:

<!--<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-checkstyle-plugin</artifactId> <version>2.17</version> <dependencies> <dependency> <groupId>com.puppycrawl.tools</groupId> <artifactId>checkstyle</artifactId> <version>8.9</version> </dependency> </dependencies> <executions> <execution> <id>validate</id> <phase>validate</phase> <goals> <goal>check</goal> </goals> </execution> </executions> <configuration> <suppressionsLocation>/tools/maven/suppressions.xml</suppressionsLocation> <includeTestSourceDirectory>true</includeTestSourceDirectory> <configLocation>/tools/maven/checkstyle.xml</configLocation> <logViolationsToConsole>true</logViolationsToConsole> <failOnViolation>true</failOnViolation> </configuration> </plugin> -->

3. 在intellij IDE编译

Flink的编译须要scala环境。由于个人电脑没有安装全局的scala环境。因此我才用IDE来编译,在IDE里安装scala插件便可。

第一步:将整个Flink项目导入IDE。
第二步:在IDE里执行maven的install指令。报错了:

Failed to execute goal org.apache.maven.plugins ...
There are test failures

这是由于某些模块的test用例测试运行失败,致使咱们的编译终止了。

解决对策:在flink-parent的pom.xml配上:

<build>
   <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <testFailureIgnore>true</testFailureIgnore>            
            </configuration>
        </plugin>
    </plugins>
</build>

而后还有个错误,就是license问题,由于我在源码里添加了些文件,这些文件是没有Licensed to the Apache Software Foundation (ASF)注释的,而后源码编译时,报license错误。那么怎么解决呢?

解决对策:注释掉flink-parent的pom.xml文件的以下部分:

<!-- <plugin> <groupId>org.apache.rat</groupId> <artifactId>apache-rat-plugin</artifactId> <version>0.12</version> <inherited>false</inherited> <executions> <execution> <phase>verify</phase> <goals> <goal>check</goal> </goals> </execution> </executions> <configuration> <excludeSubProjects>false</excludeSubProjects> <numUnapprovedLicenses>0</numUnapprovedLicenses> <licenses> <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense"> <licenseFamilyCategory>AL2 </licenseFamilyCategory> <licenseFamilyName>Apache License 2.0</licenseFamilyName> <notes /> <patterns> <pattern>Licensed to the Apache Software Foundation (ASF) under one</pattern> </patterns> </license> </licenses> <licenseFamilies> <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily"> <familyName>Apache License 2.0</familyName> </licenseFamily> </licenseFamilies> <excludes> <exclude>**/.*/**</exclude> <exclude>**/*.prefs</exclude> <exclude>**/*.log</exclude> <exclude>docs/**/jquery*</exclude> <exclude>docs/**/bootstrap*</exclude> <exclude>docs/Gemfile.lock</exclude> <exclude>docs/ruby2/Gemfile.lock</exclude> <exclude>docs/img/*.svg</exclude> <exclude>**/docs/page/font-awesome/**</exclude> <exclude>**/resources/**/font-awesome/**</exclude> <exclude>**/resources/**/jquery*</exclude> <exclude>**/resources/**/bootstrap*</exclude> <exclude>flink-clients/src/main/resources/web-docs/js/*d3.js</exclude> <exclude>**/packaged_licenses/LICENSE.*.txt</exclude> <exclude>**/licenses/LICENSE*</exclude> <exclude>**/licenses-binary/LICENSE*</exclude> <exclude>flink-runtime-web/web-dashboard/package.json</exclude> <exclude>flink-runtime-web/web-dashboard/bower.json</exclude> <exclude>flink-runtime-web/web-dashboard/vendor-local/d3-timeline.js</exclude> <exclude>flink-runtime-web/web-dashboard/assets/fonts/FontAwesome.otf</exclude> <exclude>flink-runtime-web/web-dashboard/assets/fonts/fontawesome*</exclude> <exclude>flink-runtime-web/web-dashboard/assets/images/manifest.json</exclude> <exclude>flink-runtime-web/web-dashboard/assets/images/safari-pinned-tab.svg</exclude> <exclude>flink-runtime-web/web-dashboard/web/**</exclude> <exclude>flink-runtime-web/web-dashboard/node_modules/**</exclude> <exclude>flink-runtime-web/web-dashboard/bower_components/**</exclude> <exclude>flink-runtime-web/web-dashboard/tmp/**</exclude> <exclude>**/src/test/resources/*-data</exclude> <exclude>flink-tests/src/test/resources/testdata/terainput.txt</exclude> <exclude>flink-formats/flink-avro/src/test/resources/flink_11-kryo_registrations</exclude> <exclude>flink-runtime/src/test/resources/flink_11-kryo_registrations</exclude> <exclude>flink-core/src/test/resources/kryo-serializer-config-snapshot-v1</exclude> <exclude>flink-formats/flink-avro/src/test/resources/avro/*.avsc</exclude> <exclude>out/test/flink-avro/avro/user.avsc</exclude> <exclude>flink-libraries/flink-table/src/test/scala/resources/*.out</exclude> <exclude>flink-yarn/src/test/resources/krb5.keytab</exclude> <exclude>flink-end-to-end-tests/test-scripts/test-data/*</exclude> <exclude>flink-end-to-end-tests/test-scripts/docker-hadoop-secure-cluster/config/keystore.jks</exclude> <exclude>**/src/test/resources/*-snapshot</exclude> <exclude>**/src/test/resources/*.snapshot</exclude> <exclude>**/src/test/resources/*-savepoint</exclude> <exclude>flink-core/src/test/resources/serialized-kryo-serializer-1.3</exclude> <exclude>flink-core/src/test/resources/type-without-avro-serialized-using-kryo</exclude> <exclude>flink-formats/flink-avro/src/test/resources/flink-1.4-serializer-java-serialized</exclude> <exclude>flink-end-to-end-tests/flink-state-evolution-test/src/main/java/org/apache/flink/avro/generated/*</exclude> <exclude>flink-end-to-end-tests/flink-state-evolution-test/savepoints/*</exclude> <exclude>flink-formats/flink-avro/src/test/resources/testdata.avro</exclude> <exclude>flink-formats/flink-avro/src/test/java/org/apache/flink/formats/avro/generated/*.java</exclude> <exclude>flink-formats/flink-parquet/src/test/java/org/apache/flink/formats/parquet/generated/*.java</exclude> <exclude>flink-formats/flink-parquet/src/test/resources/avro/**</exclude> <exclude>flink-libraries/flink-python/src/test/python/org/apache/flink/python/api/data_csv</exclude> <exclude>flink-libraries/flink-python/src/test/python/org/apache/flink/python/api/data_text</exclude> <exclude>flink-runtime/src/test/java/org/apache/flink/runtime/io/network/buffer/AbstractByteBufTest.java</exclude> <exclude>**/flink-bin/conf/slaves</exclude> <exclude>**/flink-bin/conf/masters</exclude> <exclude>**/README.md</exclude> <exclude>.github/**</exclude> <exclude>**/*.iml</exclude> <exclude>flink-quickstart/**/testArtifact/goal.txt</exclude> <exclude>out/**</exclude> <exclude>**/target/**</exclude> <exclude>docs/content/**</exclude> <exclude>**/scalastyle-output.xml</exclude> <exclude>build-target/**</exclude> <exclude>docs/_includes/generated/**</exclude> <exclude>tools/artifacts/**</exclude> <exclude>tools/flink*/**</exclude> <exclude>tools/releasing/release/**</exclude> <exclude>apache-maven-3.2.5/**</exclude> <exclude>**/.idea/**</exclude> <exclude>flink-end-to-end-tests/flink-confluent-schema-registry/src/main/java/example/avro/**</exclude> <exclude>flink-end-to-end-tests/flink-datastream-allround-test/src/main/java/org/apache/flink/streaming/tests/avro/**</exclude> <exclude>flink-jepsen/store/**</exclude> <exclude>flink-jepsen/docker/id_rsa*</exclude> <exclude>flink-jepsen/docker/nodes</exclude> </excludes> </configuration> </plugin> -->

最后在IDE对flink-parent执行:

mvn install -DskipTests

以后。build success。

4. 最后验证

我在某些模块添加的Demo类,而后执行install编译。在mavenReposity/org/apache/flink仓库目录里面生成的jar里包含了个人Demo.class文件。

备注:这个其实还有些细小的坑,我这里没有记录下来,在编译过程当中,要注意调试。之后必定随时作好笔记,把细节流程记录下来,防止下次在同一个坑中消耗时间。