背景: 最近数据湖技术风风火火,其中三大湖之一的Iceberg,已其不绑定引擎层的特性,引起了作者的注意,作者也想学习一下,奈何自己的CDH里Flink还是1.9版本,因此有了这篇集成的文章。好了,说了这么多的废话,我得去带薪喝杯水了。
下一篇,Flink与Iceberg集成
https://blog.csdn.net/qaz1qaz1qaz2/article/details/118188966
目录
集成步骤如下
1. 编译环境准备
CentOS 7.2
npm 6.4.1 和 node 10.14.1 -> 这两个是Flink Web界面编译依赖
jdk8,
maven 3.6.3,
scala 2.11.12 -> 结合CDH上scala的版本,目前scala 2.11.x已经不在维护了。
以上基础环境的构建,这里就忽略了。
2.Flink源代码编译
2.1 编译flink-shaded
1.下载源码包
wget https://mirrors.tuna.tsinghua.edu.cn/apache/flink/flink-shaded-12.0/flink-shaded-12.0-src.tgz
2.解压安装包
tar -zxvf flink-shaded-12.0-src.tgz
3.修改flink-shaded的pom.xml
cd flink-shaded-12.0
#修改pom.xml在<profiles>标签内,追加如下内容
<profile>
<id>vendor-repos</id>
<activation>
<property>
<name>vendor-repos</name>
</property>
</activation>
<!-- Add vendor maven repositories -->
<repositories>
<!-- Cloudera -->
<repository>
<id>cloudera-releases</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<!-- Hortonworks -->
<repository>
<id>HDPReleases</id>
<name>HDP Releases</name>
<url>https://repo.hortonworks.com/content/repositories/releases/</url>
<snapshots><enabled>false</enabled></snapshots>
<releases><enabled>true</enabled></releases>
</repository>
<repository>
<id>HortonworksJettyHadoop</id>
<name>HDP Jetty</name>
<url>https://repo.hortonworks.com/content/repositories/jetty-hadoop</url>
<snapshots><enabled>false</enabled></snapshots>
<releases><enabled>true</enabled></releases>
</repository>
<!-- MapR -->
<repository>
<id>mapr-releases</id>
<url>https://repository.mapr.com/maven/</url>
<snapshots><enabled>false</enabled></snapshots>
<releases><enabled>true</enabled></releases>
</repository>
</repositories>
</profile>
4.打包
#其中Pvendor-repos为pom中的proflie名称,后面指定hadoop和scala的版本,T10C代码10个线程
mvn clean install -DskipTests -Pvendor-repos -Dhadoop.version=3.0.0-cdh6.3.2 -Dscala-2.11 -Drat.skip=true -T10C
2.2 编译flink
1.下载flink 1.11.2,现在这个版本已经被放到archive下面了,感慨一下更新太快!
https://archive.apache.org/dist/flink/flink-1.11.2/
来看一下,这里面既有源码包,也有打好的bin包,这里就按照大家的需要选择,作者用的是源码包
下载源码包
wget https://archive.apache.org/dist/flink/flink-1.11.2/flink-1.11.2-src.tgz
2.解压包
tar -zxvf flink-1.11.2-src.tgz
3.修改flink-1.11.2的pom.xml
cd flink-1.11.2
#修改pom.xml在<profiles>标签内,追加如下内容
<profile>
<id>vendor-repos</id>
<activation>
<property>
<name>vendor-repos</name>
</property>
</activation>
<!-- Add vendor maven repositories -->
<repositories>
<!-- Cloudera -->
<repository>
<id>cloudera-releases</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<!-- Hortonworks -->
<repository>
<id>HDPReleases</id>
<name>HDP Releases</name>
<url>https://repo.hortonworks.com/content/repositories/releases/</url>
<snapshots><enabled>false</enabled></snapshots>
<releases><enabled>true</enabled></releases>
</repository>
<repository>
<id>HortonworksJettyHadoop</id>
<name>HDP Jetty</name>
<url>https://repo.hortonworks.com/content/repositories/jetty-hadoop</url>
<snapshots><enabled>false</enabled></snapshots>
<releases><enabled>true</enabled></releases>
</repository>
<!-- MapR -->
<repository>
<id>mapr-releases</id>
<url>https://repository.mapr.com/maven/</url>
<snapshots><enabled>false</enabled></snapshots>
<releases><enabled>true</enabled></releases>
</repository>
</repositories>
</profile>
4.编译源码
mvn clean install -DskipTests -Pvendor-repos -Dhadoop.version=3.0.0-cdh6.3.2 -Dscala-2.11 -Drat.skip=true -T10C
问题1:Failed to execute goal net.alchim31.maven:scala-maven-plugin
解决办法:
cd /flink-1.11.2/flink-table/flink-table-planner/
修改pom文件,添加如下内容
<dependency>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>force-shading</artifactId>
<version>1.12.0</version>
</dependency>
重新执行编译命令即可
5.将编译好的内容打包
cd /flink-1.11.2/flink-dist/target/flink-1.11.2-bin
tar -zcf flink-1.11.2-bin-scala_2.11.tgz flink-1.11.2/
结果如下图,生成了flink-1.11.2-bin-scala_2.11.tgz
3.制作Parcel包
Parcel包是CDH集成用到的标准包,这里首先要在gitlab上下载插件,插件已经封装好了生成Parcel包的功能,我们只要配置一下参数即可。借此向制作这个插件的作者致敬,感谢分享!
1.下载插件
插件1: https://github.com/pkeropen/flink-parcel
插件2: https://github.com/cloudera/cm_ext
在阅读插件1的build.sh中发现依赖插件2,所以我们提前下载好,并将cm_ext放到build.sh的同级目录
2.配置插件
cd flink-parcel-master
chmod +x build.sh
这里只需要修改插件一的flink-parcel.properties
vi flink-parcel.properties
#FLINK下载地址
#需要把编译生成的flink的tgz包,放到可以访问的web容器中
FLINK_URL=http://172.28.216.45/cloudera-repos/flink-1.11.2-bin-scala_2.11.tgz
#flink版本号
FLINK_VERSION=1.11.2
#扩展版本号
EXTENS_VERSION=BIN-SCALA_2.11
#操作系统版本,以centos为例
OS_VERSION=7
#CDH 小版本
CDH_MIN_FULL=5.16.1
#这里注意,一开始MAX_FULL写的是我CDH的6.3.2但是添加到CDH平台报错,后来把版本调大即可
CDH_MAX_FULL=6.3.4
#CDH大版本
CDH_MIN=5
CDH_MAX=6
3.运行插件
生成Parcel包
./build.sh parcel
在FLINK-1.11.2-BIN-SCALA_2.11_build会生成parcel包
将截图中生成的3个文件拷贝到,httpd服务中,通过url验证
生成on yarn 版本csd文件
./build.sh csd_on_yarn
生成FLINK_ON_YARN-1.11.2.jar文件,将该文件拷贝到/opt/cloudera/csd目录
cp FLINK_ON_YARN-1.11.2.jar /opt/cloudera/csd
#重启cloudera server服务
systemctl restart cloudera-scm-server
4.Flink服务添加到CDH
注意:
一. 在这个过程中遇到的问题比较多,大家一定要坚持到底。
二. 由于之前集成了fink 1.9.1版本,所以已经有flink用户和用户组,如果之前CDH上没有集成过Flink需要创建flink用户和用户组
1.登录Cloudera Manager
设置Parcel
点击Parcel
进入后,点击设置
添加一条flink1.11.2的访问地址,就是我们之前把parcel放到的http服务的地址
然后依次在页面点击,分配,激活
问题2:下载过程中,提示哈希值验证失败
解决:
首先比较一下哈希值
#查看parcel包哈希值
sha1sum FLINK-1.11.2-BIN-SCALA_2.11-el7.parcel
哈希值没有问题
在哈希值没有问题的情况下,很有可能是httpd的配置
vi /etc/httpd/conf/httpd.conf
#在IfModule mime_module标签内,原AddType application/x-gzip .gz .tgz后添加 .parcel
AddType application/x-gzip .gz .tgz .parcel
#重启httpd
systemctl restart httpd
解决
添加Flink-yarn服务
设置完角色后,会启动服务,启动不起来,问题又来了!
首先我们需要通过查看log发现问题,flink的log在/var/log/flink/
问题3:
java.lang.NoSuchMethodError: org.apache.commons.cli.Option.builder
解决:缺少commons-cli包,maven中央仓库下载1.4版本的包, commons-cli-1.4.jar,放到CDH上每个Flink节点的/opt/cloudera/parcels/FLINK/lib/flink/lib目录下,重新启动flink即可。
问题4:
ClassNotFoundException: org.apache.hadoop.yarn.exceptions.YarnException
解决:缺少flink-shaded-hadoop包,maven中央仓库下载对应版本的包,我这里的包是flink-shaded-hadoop-3-uber-3.1.1.7.2.9.0-173-9.0.jar,放到CDH上每个Flink节点的/opt/cloudera/parcels/FLINK/lib/flink/lib目录下,重新启动flink即可。
问题5:flink-web界面无法访问
解决: flink web默认的端口是8081,和CDH上spark worker的webUI的端口重复,需要在CDH上把flink web端口修改一下,我这里改为8981
页面找到flink-yarn,配置页面,修改rest port,修改后需要按照提示点击重启即可。
问题6:hdfs权限问题
Permission denied: user=flink, access=WRITE, inode="/user/flink":hdfs:supergroup:drwxr-xr-x
解决:
su hdfs
hdfs dfs -chown flink:hdfs /user/flink
5.验证Flink可用性
运行WordCount例子
1.准备wc的文本上传到hdfs
hdfs dfs -put /usr/local/wc.txt /user/flink/input
hdfs dfs -chown flink:hdfs /user/flink/input
2.运行wordcount
/opt/cloudera/parcels/FLINK/lib/flink/bin/flink run -m 172.28.216.13:8981 \
/opt/cloudera/parcels/FLINK/lib/flink/examples/batch/WordCount.jar \
-input hdfs://172.28.216.45/user/flink/input/ \
-output hdfs://172.28.216.45/user/flink/output
查看输出
查看flink-web