开发者
OmniStream部署验证指导
OmniStream部署验证指导
发表于2025/12/17
580

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的对应路径中

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞