安装指南

安装简介

组网规划

OmniStream Flink Native化采用单机容器化部署方案,使用Docker容器运行Flink。

一共部署3个Docker容器,容器规格均为8c32g,其中1个容器运行Job Manager,另外2个容器运行Task Manager。组网规划如图 1 组网规划所示。

图 1 组网规划

环境要求

安装OmniStream Flink Native化特性前,请参见本节内容,提前准备软硬件安装环境,以确保后续安装操作顺利进行。

硬件要求

节点硬件要求如表 1 硬件要求所示。

表 1 硬件要求

硬件环境 节点
处理器 鲲鹏920新型号处理器
内存大小 384GB(12 * 32GB)
内存频率 2666MHz
网络 业务网络10GE
管理网络1GE
硬盘 系统盘:1 * RAID 0(1 * 1.2TB SAS HDD)
数据盘:12 * RAID 0(12 * 8TB SATA HDD)
RAID控制卡 LSI SAS3508

操作系统和软件要求

操作系统和软件要求如表 2 操作系统和软件要求所示。

表 2 操作系统和软件要求

项目 版本 说明
操作系统 openEuler 22.03 LTS SP4 无特殊要求。
JDK 毕昇JDK 17(建议使用毕昇JDK 17.0.18-b13) JDK需要部署到所有容器内。
Flink 1.16.3
1.17.1
1.20.0
部署指南请参见《Flink 部署指南(CentOS&openEuler)》。Flink需要部署到所有容器内。
Docker 19.03.15 无特殊说明。
Nexmark v0.2.0 请按照官网说明进行编译,Nexmark需要部署到所有容器内。
Python 3.9.9 Python需要部署到提交作业的容器或者物理机上。
yaml-cpp 0.6.3 需要安装到提交作业的容器或者物理机上。
GCC 10.3.1 无特殊说明。
Maven 3.8.7 用于生成UDF验证用例JAR包。
Jemalloc 5.3.0 用于提供UDF翻译使用的头文件。
OmniOperator master 用于提供UDF翻译使用的头文件。
Xxhash 0.8.2 用于提供UDF翻译使用的头文件。
nlohmann json 3.11.3 用于提供UDF翻译使用的头文件。

软件安装包获取

安装OmniStream Flink Native化特性所需软件安装包及其获取方式如表 3 软件获取列表所示。

表 3 软件获取列表

名称 包名 发布类型 说明 获取地址
OmniStream压缩包 BoostKit-omniruntime-omnistream-1.3.0.zip 开源 OmniStream Flink Native化特性软件安装包。 获取链接
UDF翻译工具 UNT-1.0-35.noarch.rpm 开源 UDF翻译工具RPM包,安装后在/opt路径下新增UDF翻译工具。 获取链接
AI4C AI4C-1.0.4-8.aarch64.rpm 开源 支持编译器集成机器学习驱动的优化技术的框架。RPM包直接安装。 获取链接
KACC_JSON BoostKit-kaccjson_1.1.0.zip 闭源 用于UDF翻译中替换GSON的C++版实现,该ZIP包含适配层和KACC_JSON核心实现,内含若干头文件和静态库。
该文件从Dependency_library_OmniStream.zip解压获得。
获取链接
KSL BoostKit-ksl_2.5.1.zip 闭源 正则加速库,该zip包含ReplaceAll用于优化String基础库,内含头文件和1个静态库。 获取链接
依赖库 Dependency_library_Default 开源 OmniStream Flink Native化运行时所依赖的库文件。
该文件夹从Dependency_library_OmniStream.zip解压获得。
获取链接

软件安装包完整性校验

从鲲鹏社区获取的软件安装包,下载软件安装包后需要校验软件安装包,确保与网站上的原始软件安装包一致。

校验方法:

  1. 获取软件数字证书和软件安装包。
  2. 获取校验工具和校验方法
  3. 参见上述链接下载的《OpenPGP签名验证指南》进行软件安装包完整性检查。

安装特性

安装基础环境

安装Docker

安装Docker并部署多个容器以搭建Flink环境。如果服务器无法连接外网,请根据实际情况配置本地Yum源,确保安装过程顺利。

  1. 请参见《Docker 安装指南(CentOS&openEuler)》安装Docker,并导入基础镜像。

    cd /opt
    wget --no-check-certificate https://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS-SP4/docker_img/aarch64/openEuler-docker.aarch64.tar.xz
    docker load < openEuler-docker.aarch64.tar.xz
    
  2. 创建bridge模式网络。

    docker network create -d bridge flink-network
    

    确认网络是否创建成功。

    docker network ls
    

  3. 创建并启动3个Docker容器。

    创建的容器规格为8c32g,分别命名为flink_jm_8c32g、flink_tm1_8c32g、flink_tm2_8c32g。所有容器启动完成后自动退出命令执行流程。

    docker run -it -d --name flink_jm_8c32g --cpus=8 --memory=32g --network flink-network openeuler-22.03-lts-sp4 /bin/bash 
    docker run -it -d --name flink_tm1_8c32g --cpus=8 --memory=32g --network flink-network openeuler-22.03-lts-sp4 /bin/bash 
    docker run -it -d --name flink_tm2_8c32g --cpus=8 --memory=32g --network flink-network openeuler-22.03-lts-sp4 /bin/bash 
    
  4. 查询容器ID。

    docker ps
    

    下图中第一列为容器ID。

  5. 登录所有容器,容器内启动SSH服务,并配置免密登录。

    1. 依次登录容器,执行步骤5.b5.g

      docker exec -it flink_jm_8c32g /bin/bash
      docker exec -it flink_tm1_8c32g /bin/bash
      docker exec -it flink_tm2_8c32g /bin/bash
      
    2. 安装SSH服务依赖、修改密码依赖、编辑命令依赖、查找命令依赖、网络管理依赖,如镜像有其他依赖缺失请自行安装。

      yum -y install openssh-clients openssh-server passwd vim findutils net-tools libXext libXrender gcc cmake make gcc-c++ unzip wget libXtst
      
    3. 生成RSA密钥。

      ssh-keygen -A
      
    4. 启动容器内SSH服务。

      /usr/sbin/sshd -D &
      
    5. 为容器设置密码。

      # 通过passwd命令设置当前用户密码,密码请自行记忆
      passwd
      
    6. 再次生成RSA密钥,遇到提示时,按Enter

      ssh-keygen -t rsa
      
    7. 退出容器。

      exit
      
    8. 在flink_jm_8c32g容器上配置对其他容器的SSH免密登录。

      docker exec -it flink_jm_8c32g /bin/bash
      ssh-copy-id -i ~/.ssh/id_rsa.pub root@flink_tm1_8c32g
      ssh-copy-id -i ~/.ssh/id_rsa.pub root@flink_tm2_8c32g
      

安装JDK

安装并配置毕昇JDK,为运行Flink集群提供运行时环境。

  1. 进入物理机的/usr/local目录并下载bisheng-jdk-17.0.18-b13-linux-aarch64.tar.gz。

    cd /usr/local
    wget --no-check-certificate https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_jdk/bisheng-jdk-17.0.18-b13-linux-aarch64.tar.gz
    
  2. 进入/usr/local目录并解压bisheng-jdk-17.0.18-b13-linux-aarch64.tar.gz,且将解压后的JDK目录的所属用户、所属用户组变更为root

    tar -zxvf bisheng-jdk-17.0.18-b13-linux-aarch64.tar.gz
    chown -R root /usr/local/bisheng-jdk-17.0.18-b13-linux
    chgrp -R root /usr/local/bisheng-jdk-17.0.18-b13-linux
    

在物理机上部署并配置Flink,使其能够运行在多个Docker容器中,以便后续可以提交并运行Flink作业。

  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
    

    说明: flink-1.16.3-bin-scala_2.12.tgz为Flink软件包名称,如果使用的是其他版本的Flink,请根据实际情况修改。

  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
    

    说明: flink-1.16.3为Flink软件目录名称,如果使用的是其他版本的Flink,请根据实际情况修改。

  3. 配置Flink的masters和workers文件。

    1. 打开/usr/local/flink/conf/masters文件。

      vi /usr/local/flink/conf/masters
      
    2. i进入编辑模式,将masters内容修改为容器flink_jm_8c32g的容器ID:8081,例如:

      4a376b30106b:8081
      
    3. Esc键,输入 :wq!,按Enter保存并退出编辑。

    4. 打开/usr/local/flink/conf/workers文件。

      vi /usr/local/flink/conf/workers
      
    5. i进入编辑模式,将workers内容修改为flink_tm1_8c32g、flink_tm2_8c32g容器的容器ID,例如(2个Docker容器,每个Docker 4个Task Manager配置):

      c3ddf10d0353
      c3ddf10d0353
      c3ddf10d0353
      c3ddf10d0353
      c3bbdbcc1ae1
      c3bbdbcc1ae1
      c3bbdbcc1ae1
      c3bbdbcc1ae1
      
    6. Esc键,输入 :wq!,按Enter保存并退出编辑。

    7. 打开/usr/local/flink/conf/flink-conf.yaml文件。

      vi /usr/local/flink/conf/flink-conf.yaml
      
    8. i进入编辑模式,替换为如下配置,并将jobmanager.rpc.address修改为容器flink_jm_8c32g的容器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
      
    9. Esc键,输入 :wq!,按Enter保存并退出编辑。

安装Nexmark

安装和配置Nexmark,用于验证和测试Flink。

  1. 下载nexmark-flink.tgz到物理机/opt目录中并解压。

    cd /opt
    wget --no-check-certificate https://github.com/nexmark/nexmark/releases/download/v0.2.0/nexmark-flink.tgz
    tar xzf nexmark-flink.tgz
    mv nexmark-flink nexmark
    chown -R root:root nexmark
    
  2. 修改Nexmark配置文件/opt/nexmark/conf/nexmark.yaml

    1. 打开文件。

      vi /opt/nexmark/conf/nexmark.yaml
      
    2. i进入编辑模式,将文件内容替换为如下。并修改nexmark.metric.reporter.host为flink_jm_8c32g容器的ID。

      ################################################################################
      #  Licensed to the Apache Software Foundation (ASF) under one
      #  or more contributor license agreements.  See the NOTICE file
      #  distributed with this work for additional information
      #  regarding copyright ownership.  The ASF licenses this file
      #  to you under the Apache License, Version 2.0 (the
      #  "License"); you may not use this file except in compliance
      #  with the License.  You may obtain a copy of the License at
      #
      #      http://www.apache.org/licenses/LICENSE-2.0
      #
      #  Unless required by applicable law or agreed to in writing, software
      #  distributed under the License is distributed on an "AS IS" BASIS,
      #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      #  See the License for the specific language governing permissions and
      # limitations under the License.
      ################################################################################
      
      #==============================================================================
      # Rest & web frontend
      #==============================================================================
      
      # The metric reporter server host.
      nexmark.metric.reporter.host: 4a376b30106b
      # The metric reporter server port.
      nexmark.metric.reporter.port: 9098
      
      #==============================================================================
      # Benchmark workload configuration (events.num)
      #==============================================================================
      
      nexmark.workload.suite.100m.events.num: 50000000
      nexmark.workload.suite.100m.tps: 10000000
      nexmark.workload.suite.100m.queries: "q0,q1,q2,q3,q4,q5,q7,q8,q9,q10,q11,q12,q13,q14,q15,q16,q17,q18,q19,q20,q21,q22"
      nexmark.workload.suite.100m.queries.cep: "q0,q1,q2,q3"
      nexmark.workload.suite.100m.warmup.duration: 120s
      nexmark.workload.suite.100m.warmup.events.num: 50000000
      nexmark.workload.suite.100m.warmup.tps: 10000000
      
      #==============================================================================
      # Benchmark workload configuration (tps, legacy mode)
      # Without events.num and with monitor.duration
      # NOTE: The numerical value of TPS is unstable
      #==============================================================================
      
      # When to monitor the metrics, default 3min after job is started
      # nexmark.metric.monitor.delay: 3min
      # How long to monitor the metrics, default 3min, i.e. monitor from 3min to 6min after job is started
      # nexmark.metric.monitor.duration: 3min
      
      # nexmark.workload.suite.10m.tps: 10000000
      # nexmark.workload.suite.10m.queries: "q0,q1,q2,q3,q4,q5,q7,q8,q9,q10,q11,q12,q13,q14,q15,q16,q17,q18,q19,q20,q21,q22"
      
      #==============================================================================
      # Workload for data generation
      #==============================================================================
      
      nexmark.workload.suite.datagen.tps: 1000000
      nexmark.workload.suite.datagen.queries: "insert_kafka"
      nexmark.workload.suite.datagen.queries.cep: "insert_kafka"
      
      #==============================================================================
      # Flink REST
      #==============================================================================
      
      flink.rest.address: 4a376b30106b
      flink.rest.port: 8081
      
      #==============================================================================
      # Kafka config
      #==============================================================================
      
      # kafka.bootstrap.servers: ***:9092
      
    3. Esc键,输入 :wq!,按Enter保存并退出编辑。

安装Python

在flink_jm_8c32g中,通过RPM包安装Python。

wget --no-check-certificate https://repo.openeuler.org/openEuler-preview/openEuler-22.03-LTS-SP4-HP-preview/OS/aarch64/Packages/python3-setuptools-59.4.0-5.oe2203sp4.noarch.rpm
rpm -ivh python3-setuptools-59.4.0-5.oe2203sp4.noarch.rpm --nodeps
rm -rf /usr/bin/python
ln -s /usr/bin/python3 /usr/bin/python

安装yaml-cpp

在flink_jm_8c32g中,通过RPM包安装yaml-cpp。

wget --no-check-certificate https://repo.openeuler.org/openEuler-preview/openEuler-22.03-LTS-SP4-HP-preview/OS/aarch64/Packages/yaml-cpp-0.6.3-2.oe2203sp4.aarch64.rpm
rpm -ivh yaml-cpp-0.6.3-2.oe2203sp4.aarch64.rpm

安装必要依赖

安装运行时依赖的其他软件包。

  1. 在物理机运行以下命令,安装JSON依赖包。

    wget -P /usr/local/flink/lib/ https://repo.maven.apache.org/maven2/org/json/json/20240303/json-20240303.jar
    
  2. 在物理机运行以下命令,安装Gson依赖包。

    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
    
  3. 安装其他依赖包。

    1. 请参见表 3 软件获取列表获取依赖包Dependency_library_OmniStream.zip,解压到/opt路径。

      unzip Dependency_library_OmniStream.zip -d /opt
      mkdir -p /opt/Dependency_library
      cp -r /opt/Dependency_library_Default /opt/Dependency_library        
      chmod -R 550 /opt/Dependency_library/*
      

安装OmniStream

在Flink独立部署模式中,可以通过安装预先编译好的OmniStream Flink Native化二进制包,将其以插件的形式集成到Flink中。

  1. 在物理机上创建目录/usr/local/OmniStream,用于存放OmniStream Flink Native化的二进制文件。

    将从表 3 软件获取列表中获取的BoostKit-omniruntime-omnistream-1.3.0.zip安装包解压到/usr/local/OmniStream目录下。

    unzip BoostKit-omniruntime-omnistream-1.3.0.zip
    mkdir -p /usr/local/OmniStream
    cp -r openEuler22.03_JDK17/OmniStream_Default/* /usr/local/OmniStream/
    chmod -R 550 /usr/local/OmniStream/*
    
  2. 查看解压文件。

    cd /usr/local/OmniStream/
    ls
    

    解压二进制包后主要得到如下JAR包、so文件和基础库、头文件目录include。

    flink-tnel-0.1-SNAPSHOT.jar
    libtnel.so
    libboundscheck.so
    libboostkit-omniop-codegen-2.2.0-aarch64.so
    libboostkit-omniop-operator-2.2.0-aarch64.so
    libboostkit-omniop-vector-2.2.0-aarch64.so
    libre2.so.11
    libbasictypes
    include
    
  3. 编辑Flink的配置文件 /usr/local/flink/bin/config.sh

    1. 打开文件。

      vi /usr/local/flink/bin/config.sh
      
    2. i进入编辑模式,找到constructFlinkClassPath()函数,注释掉原有的echo行,并添加新的PATCH路径。

      # echo "$FLINK_CLASSPATH""$FLINK_DIST"
      PATCH=/usr/local/OmniStream/flink-tnel-0.1-SNAPSHOT.jar
      echo $PATCH:"$FLINK_CLASSPATH""$FLINK_DIST"
      

      修改后的配置文件如下图。

    3. Esc键,输入 :wq!,按Enter保存并退出编辑。

  4. 编辑Flink的配置文件 /usr/local/flink/conf/flink-conf.yaml

    1. 打开文件。

      vi /usr/local/flink/conf/flink-conf.yaml
      
    2. i进入编辑模式,添加libtnel.so文件所在的路径到env.java.opts中,即2中解压后so文件所在的目录。

      env.java.opts: -Djava.library.path=/usr/local/OmniStream/
                    --add-opens java.base/java.lang=ALL-UNNAMED
                    --add-opens java.base/java.io=ALL-UNNAMED 
                    --add-opens java.base/java.util=ALL-UNNAMED 
                    --add-opens java.base/java.util.concurrent=ALL-UNNAMED 
                    --add-opens java.base/sun.nio.ch=ALL-UNNAMED 
                    --add-opens java.base/java.net=ALL-UNNAMED 
                    --add-opens java.base/sun.security.ssl=ALL-UNNAMED 
                    --add-exports java.base/sun.net.dns=ALL-UNNAMED 
                    --add-exports java.base/sun.net.util=ALL-UNNAMED 
                    --add-opens=java.base/java.lang=ALL-UNNAMED 
                    --add-opens java.base/java.lang.invoke=ALL-UNNAMED 
                    --add-opens java.base/java.util.concurrent.atomic=ALL-UNNAMED 
                    --add-opens java.base/java.nio=ALL-UNNAMED 
                    --add-opens java.base/java.math=ALL-UNNAMED 
                    --add-opens java.base/java.text=ALL-UNNAMED 
                    --add-opens java.base/java.time=ALL-UNNAMED
      
    3. Esc键,输入 :wq!,按Enter保存并退出编辑。

安装UDF翻译工具

安装UDF翻译工具RPM包

  1. 表 3 软件获取列表中获取UDF翻译工具的RPM包,将RPM包上传至物理机的/opt目录。

  2. 在容器flink_jm_8c32g中安装该RPM包,安装路径默认为/opt

    rpm -ivh UNT-1.0-35.noarch.rpm
    

    命令执行完成后会自动创建/opt/udf-trans-opt目录。

    说明: 如果没有创建/opt/udf-trans-opt目录,请执行以下命令手动创建。

    mkdir /opt/udf-trans-opt
    
  3. 安装OmniStream中安装后的基础库目录复制到/opt/udf-trans-opt

    docker cp /usr/local/OmniStream/libbasictypes flink_jm_8c32g:/opt/udf-trans-opt
    

安装UDF依赖

  1. 在物理机上传并解压KACC_JSON。

    表 3 软件获取列表中获取BoostKit-kaccjson_1.1.0.zip,上传该压缩包至物理机的/opt目录,并解压。

    cd /opt/
    unzip BoostKit-kaccjson_1.1.0.zip
    
  2. 将KACC_JSON头文件和静态库复制到flink_jm_8c32g容器中的UDF翻译工具路径/opt/udf-trans-opt/libbasictypes

    docker exec flink_jm_8c32g mkdir -p /opt/udf-trans-opt/libbasictypes/include 
    docker exec flink_jm_8c32g mkdir -p /opt/udf-trans-opt/libbasictypes/lib
    docker cp include/kacc_json flink_jm_8c32g:/opt/udf-trans-opt/libbasictypes/include/
    docker cp include/kacc_gson_shell flink_jm_8c32g:/opt/udf-trans-opt/libbasictypes/include/
    docker cp libkaccgson.a flink_jm_8c32g:/opt/udf-trans-opt/libbasictypes/lib/
    
  3. 下载KSL并解压安装。

    1. 表 3 软件获取列表获取BoostKit-ksl_2.5.1.zip,上传该压缩包至物理机的/opt目录,解压并复制RPM包到flink_jm_8c32g容器中。

      cd /opt
      unzip BoostKit-ksl_2.5.1.zip
      docker cp boostkit-ksl-2.5.1-1.aarch64.rpm flink_jm_8c32g:/opt/udf-trans-opt/
      
    2. 进入flink_jm_8c32g容器并安装KSL的RPM包。

      docker exec -it flink_jm_8c32g bash
      cd /opt/udf-trans-opt/
      rpm -ivh boostkit-ksl-2.5.1-1.aarch64.rpm
      
  4. 在物理机安装OmniStream依赖头文件。

    1. 将依赖头文件拷贝到flink_jm_8c32g:/opt/udf-trans-opt/libbasictypes/include/目录下。

      docker cp /usr/local/OmniStream/libbasictypes/OmniStream flink_jm_8c32g:/opt/udf-trans-opt/libbasictypes/include/
      docker cp /usr/local/OmniStream/libbasictypes/include/core flink_jm_8c32g:/opt/udf-trans-opt/libbasictypes/include/
      docker cp /usr/local/OmniStream/libbasictypes/include/runtime flink_jm_8c32g:/opt/udf-trans-opt/libbasictypes/include/
      docker cp /usr/local/OmniStream/libbasictypes/include/streaming flink_jm_8c32g:/opt/udf-trans-opt/libbasictypes/include/
      docker cp /usr/local/OmniStream/libbasictypes/include/table flink_jm_8c32g:/opt/udf-trans-opt/libbasictypes/include/
      docker cp /usr/local/OmniStream/libbasictypes/include/third_party flink_jm_8c32g:/opt/udf-trans-opt/libbasictypes/include/
      
    2. 安装jemalloc。

      1. 下载jemalloc-5.3.0.tar.gz,并上传到管理节点。

        mkdir -p /opt/omni-operator/
        cd /opt/omni-operator/
        tar zxvf jemalloc-5.3.0.tar.gz
        mv jemalloc-5.3.0 jemalloc
        

        说明: /opt/omni-operator/jemalloc目录用户可自行定义。

      2. 进入jemalloc目录,运行脚本并安装。

        cd jemalloc
        ./autogen.sh --disable-initial-exec-tls
        make -j2
        
      3. 拷贝/opt/omni-operator/jemalloc/lib/libjemalloc.so.2/opt/omni-operator/lib目录下。

      mkdir -p /opt/omni-operator/lib/
      cp /opt/omni-operator/jemalloc/lib/libjemalloc.so.2 /opt/omni-operator/lib/
      
    3. 复制jemalloc.h到容器UDF工具的头文件引用目录中。

      docker cp /opt/omni-operator/jemalloc/include/jemalloc/jemalloc.h flink_jm_8c32g:/opt/udf-trans-opt/libbasictypes/include/
      
    4. 下载OmniOperator,将OmniOperator源码全部拷贝到容器UDF工具的头文件引用目录中。

      mkdir -p /usr/local/OmniStream/depend/
      cd /usr/local/OmniStream/depend/
      git clone https://atomgit.com/openeuler/OmniOperator.git -b master
      mv OmniOperator OmniOperatorJIT 
      docker cp /usr/local/OmniStream/depend/OmniOperatorJIT flink_jm_8c32g:/opt/udf-trans-opt/libbasictypes/include/
      
    5. 下载xxhash,将xxhash.h拷贝到UDF工具的头文件引用目录中。

      cd /usr/local/OmniStream/depend/
      git clone https://github.com/Cyan4973/xxHash.git
      cd xxHash && git checkout tags/v0.8.2
      docker cp /usr/local/OmniStream/depend/xxHash/xxhash.h flink_jm_8c32g:/opt/udf-trans-opt/libbasictypes/include/
      
    6. 下载nlohmann json,将本地代码中的include/nlohmann目录拷贝到容器UDF工具的头文件引用目录中。

      cd /usr/local/OmniStream/depend/
      git clone https://github.com/nlohmann/json.git -b v3.11.3
      docker cp /usr/local/OmniStream/depend/json/include/nlohmann flink_jm_8c32g:/opt/udf-trans-opt/libbasictypes/include/
      
  5. 安装libboundscheck头文件/opt/udf-trans-opt/libbasictypes

    1. 进入flink_jm_8c32g容器创建目录/opt/udf-trans-opt/libbasictypes/include/libboundscheck并退出容器。

      docker exec -it flink_jm_8c32g bash
      mkdir -p /opt/udf-trans-opt/libbasictypes/include/libboundscheck/
      exit
      
    2. 安装OmniStream步骤中安装后的include复制到flink_jm_8c32g容器的/opt/udf-trans-opt/libbasictypes/include/libboundscheck目录。

      docker cp /usr/local/OmniStream/include flink_jm_8c32g:/opt/udf-trans-opt/libbasictypes/include/libboundscheck
      

安装AI4C

表 3 软件获取列表中获取依赖包AI4C-1.0.4-8.aarch64.rpm,上传到flink_jm_8c32g/opt路径,并安装。

docker cp AI4C-1.0.4-8.aarch64.rpm flink_jm_8c32g:/opt
docker exec -it flink_jm_8c32g bash
cd /opt
rpm -ivh --nodeps AI4C-1.0.4-8.aarch64.rpm

容器化部署

在物理机完成基本软件安装和配置后,需要将安装基础环境安装OmniStream部署到容器中实现特性容器化使用。

  1. 将Nexmark、JDK、Flink、第三方依赖、OmniStream目录复制到所有容器内。

    docker cp /opt/nexmark flink_jm_8c32g:/usr/local/
    docker cp /usr/local/flink-1.16.3 flink_jm_8c32g:/usr/local/
    docker cp /usr/local/bisheng-bisheng-jdk-17.0.18-b13 flink_jm_8c32g:/usr/local/
    docker cp /opt/Dependency_library/Dependency_library_Default flink_jm_8c32g:/opt/Dependency_library
    docker cp /usr/local/OmniStream flink_jm_8c32g:/usr/local/
    
    docker cp /opt/nexmark flink_tm1_8c32g:/usr/local/
    docker cp /usr/local/flink-1.16.3 flink_tm1_8c32g:/usr/local/
    docker cp /usr/local/bisheng-bisheng-jdk-17.0.18-b13 flink_tm1_8c32g:/usr/local/
    docker cp /opt/Dependency_library/Dependency_library_Default flink_tm1_8c32g:/opt/Dependency_library
    docker cp /usr/local/OmniStream flink_tm1_8c32g:/usr/local/
    
    docker cp /opt/nexmark flink_tm2_8c32g:/usr/local/
    docker cp /usr/local/flink-1.16.3 flink_tm2_8c32g:/usr/local/
    docker cp /usr/local/bisheng-bisheng-jdk-17.0.18-b13 flink_tm2_8c32g:/usr/local/
    docker cp /opt/Dependency_library/Dependency_library_Default flink_tm2_8c32g:/opt/Dependency_library
    docker cp /usr/local/OmniStream flink_tm2_8c32g:/usr/local/
    
  2. 依次进入容器内,执行3

    docker exec -it flink_jm_8c32g /bin/bash
    docker exec -it flink_tm1_8c32g /bin/bash
    docker exec -it flink_tm2_8c32g /bin/bash
    
  3. 在每个容器内设置Flink、JDK、Nexmark和LLVM的环境变量。

    1. 打开/etc/profile文件。

      vi /etc/profile
      
    2. i进入编辑模式,添加如下内容。

      export JAVA_HOME=/usr/local/bisheng-jdk-17.0.18-b13
      export PATH=$JAVA_HOME/bin:$PATH
      export FLINK_HOME=/usr/local/flink-1.16.3
      export PATH=$FLINK_HOME/bin:$PATH
      export NEXMARK=/usr/local/nexmark
      export PATH=$NEXMARK/bin:$PATH
      export LD_PRELOAD=/opt/Dependency_library/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:/opt/Dependency_library/:$LD_LIBRARY_PATH
      
    3. Esc键,输入 :wq!,按Enter保存并退出编辑。

    4. 使环境变量生效。

      source /etc/profile
      
    5. 退出容器。

      exit