第1章 下载flink源码
Flink因为阿里的加入,对国内IT人员变得越来越友好了,官网也出了中文版,也有很多中文文档了。
官网:
或者安装git后去github上拉取源码。
github:
https://github.com/apache/flink
第2章 准备环境
2.1.Jdk
jdk1.8.0
2.2.Maven
maven-3.2.5
2.3.Git
Git-2.27.0
2.4.Node.js
node-v12.0.0
注:笔者在windows环境下编译时出现问题才单独安装了node.js,linux下笔者尝试确实不用单独安装,macos系统据说不用安装,仅供参考
2.5.Flink
flink-1.11.0
第3章 配置仓库路径
这里把我最终编译成功的两个关键的配置文件附上,仅供参考。
{用户}/.m2/settings.xml
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots,!mapr-releases</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>mapr-public</id>
<mirrorOf>mapr-releases</mirrorOf>
<name>mapr-releases</name>
<url>https://maven.aliyun.com/repository/mapr-public</url>
</mirror>
</mirrors>
flink-1.11.0/flink-runtime-web/pom.xml
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>install node and npm</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
<configuration>
<nodeDownloadRoot>https://registry.npm.taobao.org/dist/</nodeDownloadRoot>
<npmDownloadRoot>https://registry.npmjs.org/npm/-/</npmDownloadRoot>
<nodeVersion>v12.0.0</nodeVersion>
</configuration>
</execution>
<execution>
<id>npm install</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>install -g -registry=https://registry.npm.taobao.org --cache-max=0 --no-save </arguments>
<environmentVariables>
<HUSKY_SKIP_INSTALL>true</HUSKY_SKIP_INSTALL>
</environmentVariables>
</configuration>
</execution>
<execution>
<id>npm run build</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>run build</arguments>
<npmRegistryURL>https://registry.npm.taobao.org</npmRegistryURL>
</configuration>
</execution>
</executions>
<configuration>
<workingDirectory>web-dashboard</workingDirectory>
</configuration>
</plugin>
第4章 编译命令
自动使用pom里面的hadoop版本去编译,但是一般情况下,我们都会有自己指定的版本,所以一般不用这个
# 删除已有的build,编译flink binary
# 接着把flink binary安装在maven的local repository(默认是~/.m2/repository)中
mvn clean install -DskipTests
# 另一种编译命令,相对于上面这个命令,主要的确保是:
# 不编译tests、QA plugins和JavaDocs,因此编译要更快一些
mvn clean install -DskipTests -Dfast
另外,在一些情况下,我们可能并不想把编译后的flink binary安装在maven的local repository下,我们可以使用下面的命令:
# 删除已有的build,编译flink binary
mvn clean package -DskipTests
# 另一种编译命令,相对于上面这个命令,主要的确保是:
# 不编译tests、QA plugins和JavaDocs,因此编译要更快一些
mvn clean package -DskipTests -Dfast
如果你需要使用指定hadoop的版本,可以通过指定“-Dhadoop.version”来设置,编译命令如下:
mvn clean install -DskipTests -Dhadoop.version=2.6.0
# 或者
mvn clean package -DskipTests -Dhadoop.version=2.6.1
maven 编译的时候跳过测试代码、javadoc 和代码风格检查,这样可以减少不少时间。
-Dmaven.javadoc.skip=true -Dcheckstyle.skip=true
笔者最后决定用的命令是:
mvn clean install -DskipTests -Dhadoop.version=3.1.2
编译成功后,编译出完整的flink-binary,在源码目录flink-dist/target/中:
注:据说Linux、MacOS为了方便使用,编译时会为flink binary目录在flink当前code path下建立一个名为build-target的软链接。
第5章 执行编译和问题解决
mvn clean install -DskipTests -Dhadoop.version=3.1.2
发生如下ERROR
认证问题,笔者在Centos下编译没有发生,可能与我用windos系统进行编译有关,这里解决办法时暂时跳过认证。
解决办法:
增加 -Drat.skip=true 参数 ,跳过认证检查,重新执行如下命令。
mvn clean install -DskipTests -Dhadoop.version=3.1.2 -Drat.skip=true
出现新的ERROR
注意这里开始进入flink-runtime-web这个项目,这个项目用到了node.js的一些东西,由于国外部分网址被禁,这里编译会出现各种问题,后面几步,笔者决定先单独编译flink-runtime-web,这个项目成功后再编译其他的项目,笔者只记录自己发生的问题,和解决的办法,仅供大家参考。
提示很明显,Node.js的安装包Download不下来。看了下本地仓库,确实下载半天,下载不动,一直是1kb。
解决办法
笔者手动下载后放到文件夹内,重新执行编译命令,这里提供一个淘宝的nodejs镜像仓库https://npm.taobao.org/mirrors/node
出现新的ERROR,关键字 Running 'npm ci --cache-max=0 --no-save'
这个错误提示看flink-runtime-web的pom.xml文件,时开始执行npm install了,跟node.js相关的东西,这里flink的仪表板用到了node.js,从错误来看像是npm命令执行install的错误,也或者是权限访问问题。
这里查找了一些资料,可能是安装仓库的地址问题,把flink-runtime-web的pom.xml文件做如下修改:
<execution>
<id>npm install</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>install -g -registry=https://registry.npm.taobao.org --cache-max=0 --no-save</arguments>
<environmentVariables>
<HUSKY_SKIP_INSTALL>true</HUSKY_SKIP_INSTALL>
</environmentVariables>
</configuration>
</execution>
再重新执行编译命令
出现新的ERROR,关键字npm run build
这里看到已经运行到build了,继续修改build的仓库地址尝试
<execution>
<id>npm run build</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>run build</arguments>
<npmRegistryURL>https://registry.npm.taobao.org</npmRegistryURL>
</configuration>
</execution>
重新执行命令
出现新的ERROR
仔细看错误信息'ng' 不是内部或外部命令,也不是可运行的程序,这里已经开始执行build了,刚好是flink-runtime-web下package.json下第7行的build代码。
于是笔者决定直接装上node.js,将node、npm、ng工具都装好,并配置好npm和node的环境变量,同事安装好ng命令
安装ng命令:
npm install -g @angular/cli
安装配置好后,再重新编译,BUT
还是ERROR
这里看到,提示node.js版本低了,好吧,升级。笔者按提示升级到v12.0.0(到这里发现错误越来越清晰了,离SUCCESS应该不远了)
BUT,还是出现了新的ERROR
根据提示信息,查看log
找不到模块,继续安装这个模块
到flink-runtime-web目录D:\flink-1.11.0\flink-runtime-web\web-dashboard\node_modules\@angular\cli路径下执行命令:
npm install -save-dev @angular-devkit/build-angular
执行完后这个module就会产生。再重新编译
这个flink-runtime-web总算是SUCCESS了。
但是这里注意,这一步花了很久的时间,虽然成功了,但这里到最后CPU爆满了,结尾出现了一个Java heap的错误(可以尝试修改maven的jvm参数重试,笔者在另外一台内存较大的Win7电脑下尝试了重新编译,不会有这个错误)
这里显示flink-runtime-web项目已经成功(笔者最后拿到Centos上安装运行,flink的web-dashboard可用,确认没有问题。)
总算是BUILD SUCCESS了,注意这一步会花很久的时间,到这里flink-runtime-web这个工程算是顺利编译通过了。
接下来,咱们开始编译整个Flink工程,不想再花时间编译flink-runtime-web的同学,可以到主目录下pom.xml中注释掉flink-runtime-web的moudle
<!-- <module>flink-runtime-web</module> -->
然后执行命令重新编译,这里为了加快时间,我更换了命令
mvn clean install -DskipTests -Dhadoop.version=3.1.2 -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Drat.skip=true
新的ERROR
这里原因是找不到kafka-schema-registry-client-4.1.0.jar
这里可以自己单独下载下来安装。
到上面这个地址进行下载,然后到文件所在目录执行命令进行安装
mvn install:install-file -DgroupId=io.confluent -DartifactId=kafka-schema-registry-client -Dversion=4.1.0 -Dpackaging=jar -Dfile=kafka-schema-registry-client-4.1.0.jar
然后,再重新编译:
全部SUCCESS
编译后的文件在flink-dist\target
笔者编译的包下载地址:Flink-1.11.0源码手动编译包
编译的时候会遇到各种问题,笔者再flink-runtime-web下花了大量的时间,重点是大部分是国内网络隔离了,导致各种包下载不下来。最好还是翻墙,并linux或者MacOS下进行编译。宗旨就是根据自己的编译情况,观察自己的实际的错误信息,一个一个进行解决。