OmniStream部署指导
1.简介
OmniStream Flink Native化采用单机容器化部署,使用Docker容器运行Flink。一共部署3个Docker容器,容器规格均为8c32g,其中1个容器运行Job Manager,另外2个容器运行Task Manager。

部署流程在物理机上部署所有依赖再复制到容器中,如果单容器或者物理机部署可以参考配置进行
Docker>JDK>Flink>Python>yaml-cpp>必要依赖
2. 环境准备(如果使用标准环境可跳过)
2.1. 安装docker,并启动容器
2.1.1.禁用SELinux,Linux系统默认开启的SELinux安全机制会阻止容器网络部分端口的启用,导致无法正常部署虚拟化场景业务
修改文件“/etc/selinux/config”,将SELINUX=enforcing改为SELINUX=permissive或者SELINUX=disabled。
vim /etc/selinux/config
2.1.2.禁用防火墙
systemctl stop firewalld
systemctl disable firewalld
2.1.3.获取docker源码
wget https://download.docker.com/linux/static/stable/aarch64/docker-19.03.10.tgz
2.1.4.安装docker
tar zxf docker-19.03.10.tgz
cp docker/* /usr/bin
2.1.5.编辑docker.service文件
vim /usr/lib/systemd/system/docker.service
2.1.6.按“i”进入编辑模式,添加以下内容。
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
2.1.7.启动Docker服务进程。
systemctl daemon-reload
systemctl start docker
2.1.8. 查看安装情况。
docker version

2.1.9.导入docker基础镜像,下载对应系统版本的基础镜像,使用的镜像和编译omnistream的环境镜像一致(可以先cat /etc/os-release查看系统版本)
cd /opt
wget --no-check-certificate https://mirrors.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/docker_img/aarch64/openEuler-docker.aarch64.tar.xz
docker load < openEuler-docker.aarch64.tar.xz
2.1.10.创建Bridge模式的Docker Network。用于容器网络通信
docker network create -d bridge flink-network
2.1.11.新建3个Docker容器,容器规格为8c32g,分别命名为flink_jm_24、flink_tm1_24、flink_tm2_24,启动后退出。openeuler-24.03-lts-sp2为docker镜像名,如果不是24.03 SP2的镜像,需要改成对应的,可使用docker images命令查看
docker run -it -d -v /usr/lib64:/usr/lib64 --name flink_jm_24 --privileged --cpus=8 --memory=32g --network flink-network -p 0.0.0.0:8081:8081 openeuler-24.03-lts-sp2 /bin/bash
docker run -it -d -v /usr/lib64:/usr/lib64 --name flink_tm1_24 --privileged --cpus=8 --memory=32g --network flink-network openeuler-24.03-lts-sp2 /bin/bash
docker run -it -d -v /usr/lib64:/usr/lib64 --name flink_tm2_24 --privileged --cpus=8 --memory=32g --network flink-network openeuler-24.03-lts-sp2 /bin/bash
查询容器ID,第一列为容器ID。
docker ps -a
2.1.12.登录所有容器,容器内启动SSH服务,并配置免密登录。
依次登录容器,执行
docker exec -it flink_jm_24 /bin/bash
docker exec -it flink_tm1_24 /bin/bash
docker exec -it flink_tm2_24 /bin/bash
安装SSH服务依赖、修改密码依赖、编辑命令依赖、查找命令依赖、网络管理依赖,如镜像有其他依赖缺失请自行安装。
yum -y install openssh-clients openssh-server passwd vim findutils net-tools libXext libXrender gcc cmake make gcc-c++ unzip
生成RSA密钥。
ssh-keygen -A
启动容器内SSH服务。
/usr/sbin/sshd -D &
为容器设置密码。
# 通过passwd命令设置当前用户密码,密码请自行记忆
passwd
再次生成RSA密钥,遇到提示时,按**“Enter”**。
ssh-keygen -t rsa
退出容器。
exit
2.1.13.在flink_jm_24容器上配置对其他容器的SSH免密登录。
docker exec -it flink_jm_24 /bin/bash
ssh-copy-id -i ~/.ssh/id_rsa.pub root@flink_tm1_24
ssh-copy-id -i ~/.ssh/id_rsa.pub root@flink_tm2_24
2.2.安装JDK
2.2.1.进入物理机“/usr/local”的目录下,下载bisheng-jdk-8u342-linux-aarch64.tar.gz。
cd /usr/local
wget --no-check-certificate https://mirror.iscas.ac.cn/kunpeng/archive/compiler/bisheng_jdk/bisheng-jdk-8u342-linux-aarch64.tar.gz
2.2.2.到“/usr/local”的目录解压bisheng-jdk-8u342-linux-aarch64.tar.gz,并将解压后的JDK目录的所属用户、所属用户组变更为“root”。
tar -zxvf bisheng-jdk-8u342-linux-aarch64.tar.gz
chown -R root /usr/local/bisheng-jdk1.8.0_342
chgrp -R root /usr/local/bisheng-jdk1.8.0_342
2.3.安装Flink
2.3.1.进入物理机“/usr/local”的目录下,下载Flink软件部署包。
cd /usr/local
wget --no-check-certificate https://archive.apache.org/dist/flink/flink-1.16.3/flink-1.16.3-bin-scala_2.12.tgz
2.3.2.到“/usr/local”的目录解压flink-1.16.3-bin-scala_2.12.tgz,建立软链接,便于后期版本更换。
tar -zxvf flink-1.16.3-bin-scala_2.12.tgz
chown -R root:root flink-1.16.3
ln -s flink-1.16.3 flink
2.3.3.配置Flink的masters和workers文件。
打开“/usr/local/flink/conf/masters”文件。
vi /usr/local/flink/conf/masters
按“i”进入编辑模式,将masters内容修改为容器flink_jm_24的容器ID:8081,例如:
4a376b30106b:8081
按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
打开“/usr/local/flink/conf/workers”文件。
vi /usr/local/flink/conf/workers
按“i”进入编辑模式,将workers内容修改为flink_tm1_24、flink_tm2_24容器的容器ID,例如(2个Docker容器,每个Docker 4个Task Manager配置):
c3ddf10d0353
c3ddf10d0353
c3ddf10d0353
c3ddf10d0353
c3bbdbcc1ae1
c3bbdbcc1ae1
c3bbdbcc1ae1
c3bbdbcc1ae1
按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
打开“/usr/local/flink/conf/flink-conf.yaml”文件。
vi /usr/local/flink/conf/flink-conf.yaml
按“i”进入编辑模式,替换为如下配置,并将jobmanager.rpc.address修改为容器flink_jm_24的容器ID,建议配置的slot总数大于并行度,例如:
taskmanager.memory.process.size: 8G
jobmanager.rpc.address: 4a376b30106b
jobmanager.rpc.port: 6123
jobmanager.memory.process.size: 8G
taskmanager.memory.process.size: 8G
taskmanager.numberOfTaskSlots: 2
parallelism.default: 16
rest.port: 8081
rest.bind-port: 8081
io.tmp.dirs: /tmp
#pipeline.operator-chaining: true
#execution:runtime-mode: STREAMING
#jobmanager.execution.failover-strategy: region
#table.optimizer.agg-phase-strategy: ONE_PHASE
#pipeline.object-reuse: true
#==============================================================================
# JVM
#==============================================================================
# JVM options for GC
#env.java.opts: -verbose:gc -XX:NewRatio=3 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:ParallelGCThreads=4
按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
2.4.安装Python
2.4.1.在flink_jm_24中通过RPM包安装。(下载对应版本的RPM包)
wget --no-check-certificate https://repo.openeuler.openatom.cn/openEuler-24.03-LTS-SP2/everything/aarch64/Packages/python3-setuptools-68.0.0-2.oe2403sp2.noarch.rpm
rpm -ivh python3-setuptools-68.0.0-2.oe2403sp2.noarch.rpm
2.5.安装yaml-cpp
2.5.1.在flink_jm_24中通过RPM包安装。
wget --no-check-certificate https://repo.openeuler.openatom.cn/openEuler-24.03-LTS-SP2/everything/aarch64/Packages/yaml-cpp-0.7.0-2.oe2403sp2.aarch64.rpm
rpm -ivh yaml-cpp-0.7.0-2.oe2403sp2.aarch64.rpm
rm -rf /usr/bin/python
ln -s /usr/bin/python3 /usr/bin/python
2.6.安装必要依赖
2.6.1.在物理机运行以下命令,将JSON依赖包下载到“flink/lib”目录中。
wget -P /usr/local/flink/lib/ https://repo.maven.apache.org/maven2/org/json/json/20240303/json-20240303.jar
2.6.2.在物理机运行以下命令,将Gson依赖包下载到“flink/lib”目录中。
wget -P /usr/local/flink/lib/ https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.11.0/gson-2.11.0.jar
2.7.安装OmniStream
在Flink独立部署模式下,将OmniStream Flink Native化所需的二进制包进行安装部署,支持配置形式的插件化部署
2.7.1.在物理机新建目录“/usr/local/OmniStream”,将编译获得的JAR包、一些so文件和基础库放进去,可以使用find命令查找,如find / -name flink-tnel-0.1-SNAPSHOT.jar
flink-tnel-0.1-SNAPSHOT.jar
libLLVM-15.so
libboostkit-omniop-codegen-1.9.0-aarch64.so
libboostkit-omniop-java-binding-1.9.0-aarch64.so
libboostkit-omniop-operator-1.9.0-aarch64.so
libboostkit-omniop-vector-1.9.0-aarch64.so
libboundscheck.so
libjemalloc.so.2
librdkafka++.so.1
librdkafka.so.1
librocksdb.so.8
libsnappy.so.1
libtnel.so
libxxhash.so.0
2.7.2.在“/usr/local/flink/bin/config.sh”文件中更新配置内容
vi /usr/local/flink/bin/config.sh
按“i”进入编辑模式,新增lib加载路径;修改constructFlinkClassPath(),注释掉原生echo行,新增新的PATCH加载路径。
# echo "$FLINK_CLASSPATH""$FLINK_DIST"
PATCH=/usr/local/OmniStream/flink-tnel-0.1-SNAPSHOT.jar
echo $PATCH:"$FLINK_CLASSPATH""$FLINK_DIST"

按“Esc”键,输入:wq!,按“Enter”保存并退出编辑
2.7.3.在“/usr/local/flink/conf/flink-conf.yaml”文件中更新配置内容。
打开“/usr/local/flink/conf/flink-conf.yaml”文件
vi /usr/local/flink/conf/flink-conf.yaml
按“i”进入编辑模式,添加libtnel.so文件配置,即so文件所在的目录
env.java.opts: -Djava.library.path=/usr/local/OmniStream/
按“Esc”键,输入:wq!,按“Enter”保存并退出编辑
2.8.容器化部署
2.8.1.将JDK、Flink、第三方依赖、OmniStream目录复制到所有容器内
docker cp /usr/local/flink-1.16.3 flink_jm_24:/usr/local/
docker cp /usr/local/bisheng-jdk1.8.0_342 flink_jm_24:/usr/local/
docker cp /usr/local/OmniStream flink_jm_24:/usr/local/
docker cp /usr/local/flink-1.16.3 flink_tm1_24:/usr/local/
docker cp /usr/local/bisheng-jdk1.8.0_342 flink_tm1_24:/usr/local/
docker cp /usr/local/OmniStream flink_tm1_24:/usr/local/
docker cp /usr/local/flink-1.16.3 flink_tm2_24:/usr/local/
docker cp /usr/local/bisheng-jdk1.8.0_342 flink_tm2_24:/usr/local/
docker cp /usr/local/OmniStream flink_tm2_24:/usr/local/
2.8.2.依次进入容器内,设置Flink、JDK和LLVM的环境变量。
docker exec -it flink_jm_24 /bin/bash
docker exec -it flink_tm1_24 /bin/bash
docker exec -it flink_tm2_24 /bin/bash
vi /etc/profile
按“i”进入编辑模式,添加如下内容。
export JAVA_HOME=/usr/local/bisheng-jdk1.8.0_342
export PATH=$JAVA_HOME/bin:$PATH
export FLINK_HOME=/usr/local/flink-1.16.3
export PATH=$FLINK_HOME/bin:$PATH
export LD_PRELOAD=/usr/local/OmniStream/libjemalloc.so.2:$LD_PRELOAD
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JAVA_HOME/jre/lib/aarch64:$JAVA_HOME/lib:$JAVA_HOME/jre/lib/aarch64/server
export LD_LIBRARY_PATH=/usr/local/OmniStream:$LD_LIBRARY_PATH
export WRITE_TO_FILE=TRUE
export FLINK_PERFORMANCE=FALSE
3.标准化环境说明
环境为单节点,部署3个容器,1个tm容器(flink_jm_24)和2个tm容器(flink_tm1_24、flink_tm2_24),编译在物理机上,测试flink在容器中,在jm容器提交任务
物理机文件路径:
编译源码都在/opt/buildtools/目录

OmniStream和Flink是为了拷贝到容器中,物理机上的没有用
容器中路径说明:
OmniStream: /usr/local/OmniStream/

Flink: /usr/local/flink-1.16.3
Nexmark:/usr/local/nexmark (开源benchmark测试工具)
使用标准环境启动容器
3.1.启动docker服务
systemctl daemon-reload
systemctl start docker
3.2.启动docker容器
docker ps -a
docker start flink_jm_24 flink_tm1_24 flink_tm2_24
3.3.进入每个docker容器启动ssh服务
docker exec -ti flink_jm_24 bash
/usr/sbin/sshd -D &
exit
docker exec -ti flink_tm1_24 bash
/usr/sbin/sshd -D &
exit
docker exec -ti flink_tm2_24 bash
/usr/sbin/sshd -D &
exit
4. 编译文件重新部署
4.1.环境规划了3个容器,分别是flink_tm2_24、flink_tm1_24、flink_jm_24
flink_jm_24:jm进程启动的容器,在这个容器提交任务
flink_tm2_24、flink_tm1_24:tm进程所在的容器,任务在tm容器运行
4.2.docker ps -a查看所有容器

4.3.修改代码后重新编译libtnel.so,找到重新编译的libtnel.so,拷贝到所有容器中,替换旧的
find / -name libtnel.so
docker cp /opt/buildtools/OmniStream/cpp/build/jni/libtnel.so flink_jm_24:/usr/local/OmniStream
docker cp /opt/buildtools/OmniStream/cpp/build/jni/libtnel.so flink_tm1_24:/usr/local/OmniStream
docker cp /opt/buildtools/OmniStream/cpp/build/jni/libtnel.so flink_tm2_24:/usr/local/OmniStream
5.SQL使能特性
5.1.进入flink_jm_24容器,集群模式启动Job Manager和Task Manager,每次重新进入容器后需要执行source /etc/profile命令。
docker exec -it flink_jm_24 /bin/bash
source /etc/profile
cd /usr/local/flink-1.16.3/bin
./start-cluster.sh
5.2.查看Job Manager和Task Manager是否启动成功
在flink_jm_24容器中查看是否存在StandaloneSessionClusterEntrypoint进程
source /etc/profile
jps

5.3.分别进入flink_tm1_24、flink_tm2_24容器查看是否存在TaskManagerRunner进程,下面以flink_tm1_24容器为例:
docker exec -it flink_tm1_24 /bin/bash
source /etc/profile
jps

5.4.在flink_jm_24容器中执行sql任务
将测试文件拷贝到所有容器中
scp -r /usr/local/OmniStream/test/ 916bcabc6a1a:/usr/local/OmniStream/
scp -r /usr/local/OmniStream/test/ 784e5a687451:/usr/local/OmniStream/
执行sql
./sql-client.sh -f /usr/local/OmniStream/test/test_q0.sql

5.5.在Task Manager所在容器上查看Flink最新.log日志,日志中有“Loading Task Native Execution Library”日志输出说明Native so库已经正常加载。执行任务后.out日志中有“welcome to native”日志输出,证明OmniStream Flink Native化特性已使能。
docker exec -it flink_tm1_24 /bin/bash
cd /usr/local/flink-1.16.3/log
环境变量中配置了
export WRITE_TO_FILE=TRUE
export FLINK_PERFORMANCE=FALSE
在Task Manager所在容器上查看是否有/tmp/flink_output.txt文件,对比flink_output.txt中结果和不使能OmniStream结果是否一致

5.6. 不使能OmniStream
将所有容器的将config.sh和flink-conf.yaml恢复为原始格式,然后重启flink进程。
vim /usr/local/flink-1.16.3/bin/config.sh

vim /usr/local/flink-1.16.3/conf/flink-conf.yaml

常见问题:
1.TaskManagerRunner没有起来?
进tm容器中,查看tm的out日志
docker exec -it flink_tm1_24 /bin/bash
cd /usr/local/flink-1.16.3/log
如果是so依赖库找不到
可以去/usr/local/OmniStream
ldd -d libtnel.so
查看缺少哪些so,把对应的so所在路径加载环境变量LD_LIBRARY_PATH中,或者复制到/usr/local/OmniStream,在/etc/profile中配置了环境变量需要source /etc/profile才能生效
2.日志有“welcome to native”日志输出,但是没有/tmp/flink_output.txt文件生成
可以先试下原生执行有没有问题,多容器需要把csv数据文件放到tm的对应路径中
OmniStream部署指导
1.简介
OmniStream Flink Native化采用单机容器化部署,使用Docker容器运行Flink。一共部署3个Docker容器,容器规格均为8c32g,其中1个容器运行Job Manager,另外2个容器运行Task Manager。
部署流程在物理机上部署所有依赖再复制到容器中,如果单容器或者物理机部署可以参考配置进行
Docker>JDK>Flink>Python>yaml-cpp>必要依赖
2. 环境准备(如果使用标准环境可跳过)
2.1. 安装docker,并启动容器
2.1.1.禁用SELinux,Linux系统默认开启的SELinux安全机制会阻止容器网络部分端口的启用,导致无法正常部署虚拟化场景业务
修改文件“/etc/selinux/config”,将SELINUX=enforcing改为SELINUX=permissive或者SELINUX=disabled。
vim /etc/selinux/config
2.1.2.禁用防火墙
systemctl stop firewalld
systemctl disable firewalld
2.1.3.获取docker源码
wget https://download.docker.com/linux/static/stable/aarch64/docker-19.03.10.tgz
2.1.4.安装docker
tar zxf docker-19.03.10.tgz
cp docker/* /usr/bin
2.1.5.编辑docker.service文件
vim /usr/lib/systemd/system/docker.service
2.1.6.按“i”进入编辑模式,添加以下内容。
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
2.1.7.启动Docker服务进程。
systemctl daemon-reload
systemctl start docker
2.1.8. 查看安装情况。
docker version
2.1.9.导入docker基础镜像,下载对应系统版本的基础镜像,使用的镜像和编译omnistream的环境镜像一致(可以先cat /etc/os-release查看系统版本)
cd /opt
wget --no-check-certificate https://mirrors.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/docker_img/aarch64/openEuler-docker.aarch64.tar.xz
docker load < openEuler-docker.aarch64.tar.xz
2.1.10.创建Bridge模式的Docker Network。用于容器网络通信
docker network create -d bridge flink-network
2.1.11.新建3个Docker容器,容器规格为8c32g,分别命名为flink_jm_24、flink_tm1_24、flink_tm2_24,启动后退出。openeuler-24.03-lts-sp2为docker镜像名,如果不是24.03 SP2的镜像,需要改成对应的,可使用docker images命令查看
docker run -it -d -v /usr/lib64:/usr/lib64 --name flink_jm_24 --privileged --cpus=8 --memory=32g --network flink-network -p 0.0.0.0:8081:8081 openeuler-24.03-lts-sp2 /bin/bash
docker run -it -d -v /usr/lib64:/usr/lib64 --name flink_tm1_24 --privileged --cpus=8 --memory=32g --network flink-network openeuler-24.03-lts-sp2 /bin/bash
docker run -it -d -v /usr/lib64:/usr/lib64 --name flink_tm2_24 --privileged --cpus=8 --memory=32g --network flink-network openeuler-24.03-lts-sp2 /bin/bash
查询容器ID,第一列为容器ID。
docker ps -a
2.1.12.登录所有容器,容器内启动SSH服务,并配置免密登录。
依次登录容器,执行
docker exec -it flink_jm_24 /bin/bash
docker exec -it flink_tm1_24 /bin/bash
docker exec -it flink_tm2_24 /bin/bash
安装SSH服务依赖、修改密码依赖、编辑命令依赖、查找命令依赖、网络管理依赖,如镜像有其他依赖缺失请自行安装。
yum -y install openssh-clients openssh-server passwd vim findutils net-tools libXext libXrender gcc cmake make gcc-c++ unzip
生成RSA密钥。
ssh-keygen -A
启动容器内SSH服务。
/usr/sbin/sshd -D &
为容器设置密码。
# 通过passwd命令设置当前用户密码,密码请自行记忆
passwd
再次生成RSA密钥,遇到提示时,按**“Enter”**。
ssh-keygen -t rsa
退出容器。
exit
2.1.13.在flink_jm_24容器上配置对其他容器的SSH免密登录。
docker exec -it flink_jm_24 /bin/bash
ssh-copy-id -i ~/.ssh/id_rsa.pub root@flink_tm1_24
ssh-copy-id -i ~/.ssh/id_rsa.pub root@flink_tm2_24
2.2.安装JDK
2.2.1.进入物理机“/usr/local”的目录下,下载bisheng-jdk-8u342-linux-aarch64.tar.gz。
cd /usr/local
wget --no-check-certificate https://mirror.iscas.ac.cn/kunpeng/archive/compiler/bisheng_jdk/bisheng-jdk-8u342-linux-aarch64.tar.gz
2.2.2.到“/usr/local”的目录解压bisheng-jdk-8u342-linux-aarch64.tar.gz,并将解压后的JDK目录的所属用户、所属用户组变更为“root”。
tar -zxvf bisheng-jdk-8u342-linux-aarch64.tar.gz
chown -R root /usr/local/bisheng-jdk1.8.0_342
chgrp -R root /usr/local/bisheng-jdk1.8.0_342
2.3.安装Flink
2.3.1.进入物理机“/usr/local”的目录下,下载Flink软件部署包。
cd /usr/local
wget --no-check-certificate https://archive.apache.org/dist/flink/flink-1.16.3/flink-1.16.3-bin-scala_2.12.tgz
2.3.2.到“/usr/local”的目录解压flink-1.16.3-bin-scala_2.12.tgz,建立软链接,便于后期版本更换。
tar -zxvf flink-1.16.3-bin-scala_2.12.tgz
chown -R root:root flink-1.16.3
ln -s flink-1.16.3 flink
2.3.3.配置Flink的masters和workers文件。
打开“/usr/local/flink/conf/masters”文件。
vi /usr/local/flink/conf/masters
按“i”进入编辑模式,将masters内容修改为容器flink_jm_24的容器ID:8081,例如:
4a376b30106b:8081
按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
打开“/usr/local/flink/conf/workers”文件。
vi /usr/local/flink/conf/workers
按“i”进入编辑模式,将workers内容修改为flink_tm1_24、flink_tm2_24容器的容器ID,例如(2个Docker容器,每个Docker 4个Task Manager配置):
c3ddf10d0353
c3ddf10d0353
c3ddf10d0353
c3ddf10d0353
c3bbdbcc1ae1
c3bbdbcc1ae1
c3bbdbcc1ae1
c3bbdbcc1ae1
按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
打开“/usr/local/flink/conf/flink-conf.yaml”文件。
vi /usr/local/flink/conf/flink-conf.yaml
按“i”进入编辑模式,替换为如下配置,并将jobmanager.rpc.address修改为容器flink_jm_24的容器ID,建议配置的slot总数大于并行度,例如:
taskmanager.memory.process.size: 8G
jobmanager.rpc.address: 4a376b30106b
jobmanager.rpc.port: 6123
jobmanager.memory.process.size: 8G
taskmanager.memory.process.size: 8G
taskmanager.numberOfTaskSlots: 2
parallelism.default: 16
rest.port: 8081
rest.bind-port: 8081
io.tmp.dirs: /tmp
#pipeline.operator-chaining: true
#execution:runtime-mode: STREAMING
#jobmanager.execution.failover-strategy: region
#table.optimizer.agg-phase-strategy: ONE_PHASE
#pipeline.object-reuse: true
#==============================================================================
# JVM
#==============================================================================
# JVM options for GC
#env.java.opts: -verbose:gc -XX:NewRatio=3 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:ParallelGCThreads=4
按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
2.4.安装Python
2.4.1.在flink_jm_24中通过RPM包安装。(下载对应版本的RPM包)
wget --no-check-certificate https://repo.openeuler.openatom.cn/openEuler-24.03-LTS-SP2/everything/aarch64/Packages/python3-setuptools-68.0.0-2.oe2403sp2.noarch.rpm
rpm -ivh python3-setuptools-68.0.0-2.oe2403sp2.noarch.rpm
2.5.安装yaml-cpp
2.5.1.在flink_jm_24中通过RPM包安装。
wget --no-check-certificate https://repo.openeuler.openatom.cn/openEuler-24.03-LTS-SP2/everything/aarch64/Packages/yaml-cpp-0.7.0-2.oe2403sp2.aarch64.rpm
rpm -ivh yaml-cpp-0.7.0-2.oe2403sp2.aarch64.rpm
rm -rf /usr/bin/python
ln -s /usr/bin/python3 /usr/bin/python
2.6.安装必要依赖
2.6.1.在物理机运行以下命令,将JSON依赖包下载到“flink/lib”目录中。
wget -P /usr/local/flink/lib/ https://repo.maven.apache.org/maven2/org/json/json/20240303/json-20240303.jar
2.6.2.在物理机运行以下命令,将Gson依赖包下载到“flink/lib”目录中。
wget -P /usr/local/flink/lib/ https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.11.0/gson-2.11.0.jar
2.7.安装OmniStream
在Flink独立部署模式下,将OmniStream Flink Native化所需的二进制包进行安装部署,支持配置形式的插件化部署
2.7.1.在物理机新建目录“/usr/local/OmniStream”,将编译获得的JAR包、一些so文件和基础库放进去,可以使用find命令查找,如find / -name flink-tnel-0.1-SNAPSHOT.jar
flink-tnel-0.1-SNAPSHOT.jar
libLLVM-15.so
libboostkit-omniop-codegen-1.9.0-aarch64.so
libboostkit-omniop-java-binding-1.9.0-aarch64.so
libboostkit-omniop-operator-1.9.0-aarch64.so
libboostkit-omniop-vector-1.9.0-aarch64.so
libboundscheck.so
libjemalloc.so.2
librdkafka++.so.1
librdkafka.so.1
librocksdb.so.8
libsnappy.so.1
libtnel.so
libxxhash.so.0
2.7.2.在“/usr/local/flink/bin/config.sh”文件中更新配置内容
vi /usr/local/flink/bin/config.sh
按“i”进入编辑模式,新增lib加载路径;修改constructFlinkClassPath(),注释掉原生echo行,新增新的PATCH加载路径。
# echo "$FLINK_CLASSPATH""$FLINK_DIST"
PATCH=/usr/local/OmniStream/flink-tnel-0.1-SNAPSHOT.jar
echo $PATCH:"$FLINK_CLASSPATH""$FLINK_DIST"
按“Esc”键,输入:wq!,按“Enter”保存并退出编辑
2.7.3.在“/usr/local/flink/conf/flink-conf.yaml”文件中更新配置内容。
打开“/usr/local/flink/conf/flink-conf.yaml”文件
vi /usr/local/flink/conf/flink-conf.yaml
按“i”进入编辑模式,添加libtnel.so文件配置,即so文件所在的目录
env.java.opts: -Djava.library.path=/usr/local/OmniStream/
按“Esc”键,输入:wq!,按“Enter”保存并退出编辑
2.8.容器化部署
2.8.1.将JDK、Flink、第三方依赖、OmniStream目录复制到所有容器内
docker cp /usr/local/flink-1.16.3 flink_jm_24:/usr/local/
docker cp /usr/local/bisheng-jdk1.8.0_342 flink_jm_24:/usr/local/
docker cp /usr/local/OmniStream flink_jm_24:/usr/local/
docker cp /usr/local/flink-1.16.3 flink_tm1_24:/usr/local/
docker cp /usr/local/bisheng-jdk1.8.0_342 flink_tm1_24:/usr/local/
docker cp /usr/local/OmniStream flink_tm1_24:/usr/local/
docker cp /usr/local/flink-1.16.3 flink_tm2_24:/usr/local/
docker cp /usr/local/bisheng-jdk1.8.0_342 flink_tm2_24:/usr/local/
docker cp /usr/local/OmniStream flink_tm2_24:/usr/local/
2.8.2.依次进入容器内,设置Flink、JDK和LLVM的环境变量。
docker exec -it flink_jm_24 /bin/bash
docker exec -it flink_tm1_24 /bin/bash
docker exec -it flink_tm2_24 /bin/bash
vi /etc/profile
按“i”进入编辑模式,添加如下内容。
export JAVA_HOME=/usr/local/bisheng-jdk1.8.0_342
export PATH=$JAVA_HOME/bin:$PATH
export FLINK_HOME=/usr/local/flink-1.16.3
export PATH=$FLINK_HOME/bin:$PATH
export LD_PRELOAD=/usr/local/OmniStream/libjemalloc.so.2:$LD_PRELOAD
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JAVA_HOME/jre/lib/aarch64:$JAVA_HOME/lib:$JAVA_HOME/jre/lib/aarch64/server
export LD_LIBRARY_PATH=/usr/local/OmniStream:$LD_LIBRARY_PATH
export WRITE_TO_FILE=TRUE
export FLINK_PERFORMANCE=FALSE
3.标准化环境说明
环境为单节点,部署3个容器,1个tm容器(flink_jm_24)和2个tm容器(flink_tm1_24、flink_tm2_24),编译在物理机上,测试flink在容器中,在jm容器提交任务
物理机文件路径:
编译源码都在/opt/buildtools/目录
OmniStream和Flink是为了拷贝到容器中,物理机上的没有用
容器中路径说明:
OmniStream: /usr/local/OmniStream/
Flink: /usr/local/flink-1.16.3
Nexmark:/usr/local/nexmark (开源benchmark测试工具)
使用标准环境启动容器
3.1.启动docker服务
systemctl daemon-reload
systemctl start docker
3.2.启动docker容器
docker ps -a
docker start flink_jm_24 flink_tm1_24 flink_tm2_24
3.3.进入每个docker容器启动ssh服务
docker exec -ti flink_jm_24 bash
/usr/sbin/sshd -D &
exit
docker exec -ti flink_tm1_24 bash
/usr/sbin/sshd -D &
exit
docker exec -ti flink_tm2_24 bash
/usr/sbin/sshd -D &
exit
4. 编译文件重新部署
4.1.环境规划了3个容器,分别是flink_tm2_24、flink_tm1_24、flink_jm_24
flink_jm_24:jm进程启动的容器,在这个容器提交任务
flink_tm2_24、flink_tm1_24:tm进程所在的容器,任务在tm容器运行
4.2.docker ps -a查看所有容器
4.3.修改代码后重新编译libtnel.so,找到重新编译的libtnel.so,拷贝到所有容器中,替换旧的
find / -name libtnel.so
docker cp /opt/buildtools/OmniStream/cpp/build/jni/libtnel.so flink_jm_24:/usr/local/OmniStream
docker cp /opt/buildtools/OmniStream/cpp/build/jni/libtnel.so flink_tm1_24:/usr/local/OmniStream
docker cp /opt/buildtools/OmniStream/cpp/build/jni/libtnel.so flink_tm2_24:/usr/local/OmniStream
5.SQL使能特性
5.1.进入flink_jm_24容器,集群模式启动Job Manager和Task Manager,每次重新进入容器后需要执行source /etc/profile命令。
docker exec -it flink_jm_24 /bin/bash
source /etc/profile
cd /usr/local/flink-1.16.3/bin
./start-cluster.sh
5.2.查看Job Manager和Task Manager是否启动成功
在flink_jm_24容器中查看是否存在StandaloneSessionClusterEntrypoint进程
source /etc/profile
jps
5.3.分别进入flink_tm1_24、flink_tm2_24容器查看是否存在TaskManagerRunner进程,下面以flink_tm1_24容器为例:
docker exec -it flink_tm1_24 /bin/bash
source /etc/profile
jps
5.4.在flink_jm_24容器中执行sql任务
将测试文件拷贝到所有容器中
scp -r /usr/local/OmniStream/test/ 916bcabc6a1a:/usr/local/OmniStream/
scp -r /usr/local/OmniStream/test/ 784e5a687451:/usr/local/OmniStream/
执行sql
./sql-client.sh -f /usr/local/OmniStream/test/test_q0.sql
5.5.在Task Manager所在容器上查看Flink最新.log日志,日志中有“Loading Task Native Execution Library”日志输出说明Native so库已经正常加载。执行任务后.out日志中有“welcome to native”日志输出,证明OmniStream Flink Native化特性已使能。
docker exec -it flink_tm1_24 /bin/bash
cd /usr/local/flink-1.16.3/log
环境变量中配置了
export WRITE_TO_FILE=TRUE
export FLINK_PERFORMANCE=FALSE
在Task Manager所在容器上查看是否有/tmp/flink_output.txt文件,对比flink_output.txt中结果和不使能OmniStream结果是否一致
5.6. 不使能OmniStream
将所有容器的将config.sh和flink-conf.yaml恢复为原始格式,然后重启flink进程。
vim /usr/local/flink-1.16.3/bin/config.sh
vim /usr/local/flink-1.16.3/conf/flink-conf.yaml
常见问题:
1.TaskManagerRunner没有起来?
进tm容器中,查看tm的out日志
docker exec -it flink_tm1_24 /bin/bash
cd /usr/local/flink-1.16.3/log
如果是so依赖库找不到
可以去/usr/local/OmniStream
ldd -d libtnel.so
查看缺少哪些so,把对应的so所在路径加载环境变量LD_LIBRARY_PATH中,或者复制到/usr/local/OmniStream,在/etc/profile中配置了环境变量需要source /etc/profile才能生效
2.日志有“welcome to native”日志输出,但是没有/tmp/flink_output.txt文件生成
可以先试下原生执行有没有问题,多容器需要把csv数据文件放到tm的对应路径中