Apache Seatunnel Zeta引擎-启动脚本分析

Apache SeaTunnel Zeta引擎的集群模式启动的第一步是执行bin/seatunnel-cluster.sh脚本,所以先来学习下这个脚本。

脚本执行流程分析

脚本简要注释

#!/bin/bash
#
# 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.
#
##########
# set -e 当脚本出现异常时马上退出,后续命令不再执行
# set -u 把未定义的变量视作错误,默认情况下Bash会把未定义的变量视为空,不会报错
##########
set -eu
# resolve links - $0 may be a softlink
#$0返回当前值行的shell脚本的名称
PRG="$0"

# -h 表示 如果 FILE 存在且是一个符号连接则为真
while [ -h "$PRG" ] ; do
  # shellcheck disable=SC2006
  ls=`ls -ld "$PRG"` # -d 仅列出当前目录本身
  # shellcheck disable=SC2006
  link=`expr "$ls" : '.*-> \(.*\)$'`  # 提取软连接的目标路径
  # 如果 link 以 / 开头,则 为true 否则为 false
  if expr "$link" : '/.*' > /dev/null; then
    PRG="$link"  # 以 / 开头表明 路径为全路径
  else
    # shellcheck disable=SC2006
    PRG=`dirname "$PRG"`/"$link"  # 不以 / 开头说明 link只是 文件名称,需要拼接全路径
  fi
done

PRG_DIR=`dirname "$PRG"`  # 返回启动脚本的父目录bin
APP_DIR=`cd "$PRG_DIR/.." >/dev/null; pwd` # 进入启动脚本的父目录bin 的上级目录,即软件HOME目录
CONF_DIR=${APP_DIR}/config # 配置文件路径
APP_JAR=${APP_DIR}/starter/seatunnel-starter.jar  # starter jar 路径
APP_MAIN="org.apache.seatunnel.core.starter.seatunnel.SeaTunnelServer"  # starter jar main class
OUT="${APP_DIR}/logs/seatunnel-server.out" # 定义控制台日志输出文件
HELP=false

if [ -f "${CONF_DIR}/seatunnel-env.sh" ]; then  # 判断是否存在 seatunnel-env.sh
    # . seatunnel-env.sh 在当前进程中执行 shell脚本,从而使脚本中定义的变量函数在当前shell中生效而不是在子shell 中
    # 使得脚本中的环境设置对当前进程持续生效
    . "${CONF_DIR}/seatunnel-env.sh"  # 如果存在则加载其中的环境变量
fi

# $# 参数的个数
if [ $# == 0 ]  # 判断参数的个数是否为0
then
    args=""
else
    args=$@  # $@ 脚本传入的所有参数
fi

set +u  # 取消对未设置变量的使用报错
# SeaTunnel Engine Config
if [ -z $HAZELCAST_CONFIG ]; then  # -z 字符串长度为 0 则为真
  HAZELCAST_CONFIG=${CONF_DIR}/hazelcast.yaml  # 当不存在变量 $HAZELCAST_CONFIG 时 ,设置该变量的值
fi

if [ -z $SEATUNNEL_CONFIG ]; then
    SEATUNNEL_CONFIG=${CONF_DIR}/seatunnel.yaml  # 当不存在变量 $SEATUNNEL_CONFIG 时 ,设置该变量的值
fi

if test ${JvmOption} ;then  # 如果变量不为空 则 test 返回true
    JAVA_OPTS="${JAVA_OPTS} ${JvmOption}"
fi

for i in "$@"  # 循环脚本传输的参数
do
  if [[ "${i}" == *"JvmOption"* ]]; then  # 如果参数包含 JvmOption 则将该变量的值赋给 JVM_OPTION
    JVM_OPTION="${i}"
    JAVA_OPTS="${JAVA_OPTS} ${JVM_OPTION#*=}"
  elif [[ "${i}" == "-d" || "${i}" == "--daemon" ]]; then
    DAEMON=true
  elif [[ "${i}" == "-h" || "${i}" == "--help" ]]; then
    HELP=true
  fi
done

JAVA_OPTS="${JAVA_OPTS} -Dseatunnel.config=${SEATUNNEL_CONFIG}"
JAVA_OPTS="${JAVA_OPTS} -Dhazelcast.config=${HAZELCAST_CONFIG}"

# Log4j2 Config
JAVA_OPTS="${JAVA_OPTS} -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"
if [ -e "${CONF_DIR}/log4j2.properties" ]; then
  JAVA_OPTS="${JAVA_OPTS} -Dlog4j2.configurationFile=${CONF_DIR}/log4j2.properties"
  JAVA_OPTS="${JAVA_OPTS} -Dseatunnel.logs.path=${APP_DIR}/logs"
  JAVA_OPTS="${JAVA_OPTS} -Dseatunnel.logs.file_name=seatunnel-engine-server"
fi

# Server Debug Config
# Usage instructions:
# If you need to debug your code in cluster mode, please enable this configuration option and listen to the specified
# port in your IDE. After that, you can happily debug your code.
# JAVA_OPTS="${JAVA_OPTS} -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=5001,suspend=y"

CLASS_PATH=${APP_DIR}/lib/*:${APP_JAR}  #设置CLASS_PATH

while read line  # 用while 循环读取输入文件中的每一行
do
    if [[ ! $line == \#* ]] && [ -n "$line" ]; then # 如果字符串不以 # 开头,同时非空 则为真
        JAVA_OPTS="$JAVA_OPTS $line"
    fi
done < ${APP_DIR}/config/jvm_options # 将jvm_options中设置的jvm配置加入 到   JAVA_OPTS

if [[ $DAEMON == true && $HELP == false ]]; then  ## 如果参数 不是help 并且 为 daemon 时 自动创建日志目录
  if [[ ! -d ${APP_DIR}/logs ]]; then
    mkdir -p ${APP_DIR}/logs
  fi
  touch $OUT  # 创建控制台输出日志文件
  # 启动Java应用程序
  # ${JAVA_OPTS} java虚拟机的启动参数
  # ${CLASS_PATH} 类路径
  # ${APP_MAIN} Java应用程序主类
  # ${args}传给java应用程序的主要参数
  nohup java ${JAVA_OPTS} -cp ${CLASS_PATH} ${APP_MAIN} ${args} > "$OUT" 200<&- 2>&1 < /dev/null &
else
  java ${JAVA_OPTS} -cp ${CLASS_PATH} ${APP_MAIN} ${args}
fi


脚本一些特别说明

JVM相关参数

根据对脚本的分析可知,共有三处可以配置和制定JVM相关参数

执行脚本时通过命令行参数传入

可以在执行seatunnel-cluster.sh脚本时传入jvm参数,但是格式比如符合如下要求:需要格式为key=value的格式,key中必须包含字符串JvmOption,value则是具体的JVM配置项。如:

bash seatunnel-cluster.sh JvmOption="-Xms2G -Xmx2G"
bash seatunnel-cluster.sh xJvmOptionx="-Xms2G -Xmx2G"
bash seatunnel-cluster.sh -DJvmOption="-Xms2G -Xmx2G"
添加脚本

seatunnel-cluster.sh脚本第一行添加JAVA_OPTS="-Xms2G -Xmx2G"

以上两种方式官网部署文档皆有说明,如下

在配置文件jvm_options中指定

在启动脚本中有一部分代码是对 位于CONF_DIR下的jvm_options中的配置逐行加载。

虽然以上三种均会把相关配置加载到JAVA_OPTS,但是我个人更推荐通过配置文件jvm_options的方式来指定,这样既避免了对seatunnel-cluster.sh脚本进行修改,又可以以文件的形式将详细配置保存下来。

为启动脚本seatunnel-cluster.sh创建软链

根据对启动脚本的分析,允许使用 软链的方式启动seatunnel zeta服务, 可以用于在服务器中集中管理 各种服务启动脚本的场景。

用户可以通过软链固定服务启动路径,如在/usr/bin目录下指定seatunnel-cluster.sh的软链:

cd /usr/bin
ln -snf /opt/soft/seatunnel/apache-seatunnel-2.3.5/bin/seatunnel-cluster.sh seatunnel-cluster

则可通过如下命令启动服务:

/usr/bin/seatunnel-cluster

日志目录配置

根据对脚本的分析,seatunnel zeta的目录被设置为${APP_DIR}/logs, 在脚本中进行硬编码以变量seatunnel.logs.path传入JAVA_OPTS, 然后log4j2.properties通过该变量读取的日志目录的配置。

如果需要自定义目录的配置:

  1. 要么修改seatunnel-cluster.sh指定自定义的日志目录

  2. 要么修改log4j2.properties文件放弃从环境变量读取seatunnel.logs.path, 直接指定自定义的日志目录。

目前来看以上两种方式都不够友好,另外结合seatunnel-cluster.sh在执行过程中会加载seatunnel-env.sh

在对当前日志目录配置的逻辑不进行大的调整的前提下,如果把日志相关目录的配置开放到seatunnel-env.sh对于需要自定义日志目录的用户来说会更为友好,当然这需要对脚本做一定的修改。

附录

附录为脚本执行流程的文字描述,作为对执行流程图无法表达的内容的补充:

脚本大意如下

首先获取当前执行脚本的名称,然后判断执行为脚本文件是否属于软链接,如果是软连接则获取软连接指向的原始脚本文件,并获取seatunnel-cluster.sh所在目录bin,根据获取到的bin目录获取SeatunnelHOME目录并赋值为APP_DIR,同时设置 配置文件目录 为CONFIG_DIR,并且定义seatunnel-starter.jar的路径为APP_JAR

设置org.apache.seatunnel.core.starter.seatunnel.SeaTunnelServer为 main classAPP_MAIN,定义控制台日志输出文件 为OUT

判断是否存在seatunnel-env.sh, 如果存在则执行该脚本将环境变量加载到当前进程。

判断传入的参数个数,如果为0,则将参数置为"", 否则将所有参数赋给arg

判断HAZELCAST_CONFIG变量是否存在,不存在则将hazelcast.yaml文件路径赋值给它。

判断SEATUNNEL_CONFIG变量是否存在,不存在则将seatunnel.yaml文件路径赋值给它。

判断JvmOption变量是否存在,若存在就添加到JAVA_OPTS参数当中。

循环判断脚本传入的所有参数

若参数包含字符串JvmOption, 则认定该参数为 JVM配置,并且从该参数开头删除第一个==之前的字符,将剩下的内容添加到参数JAVA_OPTS当中。

这一点说明,可以在启动脚本时传递 JVM参数,但是对格式有一定要求,即 需要格式为 key=value的格式,key中必须包含字符串JvmOption,value 则是具体的JVM配置项。

若参数为-d--daemon, 则将变量DAEMON设置为 true。

若参数为-h--help, 则将变量HELP设置为true。

HAZELCAST_CONFIGSEATUNNEL_CONFIG变量添加到 参数JAVA_OPTS

将日志配置-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector添加到参数JAVA_OPTS

判断log4j2.properties日志配置文件是否存在,若存在则将-Dlog4j2.configurationFile=${CONF_DIR}/log4j2.properties-Dseatunnel.logs.path=${APP_DIR}/logs-Dseatunnel.logs.file_name=seatunnel-engine-server添加到参数JAVA_OPTS

设置CLASS_PATH,然后将jvm_options配置文件中的配置逐行加入到 参数JAVA_OPTS

  • 如果变量DEAMONtrue并且 变量HELPfalse
 1. 判断日志目录 ` ${APP_DIR}/logs`是否存在,不存在则创建

 2. 创建控制台日志输出文件

 3. 运行命令 `nohup java ${JAVA_OPTS} -cp ${CLASS_PATH} ${APP_MAIN} ${args} > "$OUT" 200<&- 2>&1 < /dev/null &`后台启动 `Seatunnel ` Zeta 引擎
  • 如果变量DEAMONtrue并且 变量HELPtrue:
  1. 运行命令`java ${JAVA_OPTS} -cp ${CLASS_PATH} ${APP_MAIN} ${args}`前台运行 `Seatunnel Zeta引擎`
  • 如果变量DEAMONfalse:
  1. 运行命令`java ${JAVA_OPTS} -cp ${CLASS_PATH} ${APP_MAIN} ${args}`前台运行 `Seatunnel Zeta引擎`

到此为止,已经完成整个脚本的执行,成功启动SeaTunnel Zeta引擎。以上为作者个人学习解读,如果错误之处,欢迎批评指正!!!

本文由 白鲸开源科技 提供发布支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/891837.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java项目:154 基于ssm旅游信息网站(含论文+ppt)

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 使用旅游信息网站的分为管理员和用户两个角色的权限子模块。 管理员所能使用的功能主要有&#xff1a;个人中心、用户管理、旅游景点管理、交…

双指齐下:那晚我与算法的不解之缘

公主请阅 1.快乐数1.1题目说明示例 1示例 2 1.3题目分析1.4代码部分1.5代码解析 2.复写02.1题目说明示例 1示例 2 2.2题目分析2.3代码部分2.4代码解析 1.快乐数 题目传送门 1.1题目说明 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」定义为&#xff1a; 对于一个正…

探索 Blob 对象的应用场景和实例分析

一. 引言 当我们在开发 Web 应用程序时&#xff0c;常常会遇到需要处理二进制数据的情况。这时&#xff0c;Blob&#xff08;Binary Large Object&#xff09;对象就成为了一个非常有用的工具。Blob 对象可以用来表示一段二进制数据&#xff0c;它可以存储和操作各种类型的数据…

FPAG学习(5)-三种方法实现LED流水灯

目录 1.移位实现LED流水灯 1.1创建工程及源文件代码 1.1.1源代码 1.1.2仿真代码 1.1.3仿真 1.2实验结果 1.2.1总结 2.循环移位实现LED流水灯 3.38译码器实现LED流水灯 3.1原理 3.2源程序 1.移位实现LED流水灯 1.1创建工程及源文件代码 1.1.1源代码 利用计数器计数到…

Python网络爬虫从入门到实战

目录 引言 一、网络爬虫的概念 二、 网络爬虫的基本工作流程 &#xff08;一&#xff09;过程&#xff1a; &#xff08;二&#xff09;安装requests模块和beautifulsoup4模块 &#xff08;三&#xff09;requests库的使用 1、requests库的基本介绍 2、导入requests库的…

IO作业代码

问题 通过 fwrite和 fread去拷贝 文件到另外一个文件上 #include<myhead.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include<errno.h> #include<time.h> int main(int argc, const char *argv[]) { FILE *fp fo…

新款任天堂switch游戏机方案,支持4K60HZ投屏方案,显示器,手柄方案

据传任天堂将推出新的一代的switch掌机&#xff0c;而新款掌机将支持4K60HZ投屏 都2402年了再做1080P确实有点不太象话了 4K60HZ相较于1080P能够提升很多游戏体验&#xff0c;这时不管是HDMI显示器或者是VR眼睛清晰度都会让人舒服很多。 不过新一代的任天堂似乎也在PD协议上…

答题pk小程序的技术特点和性能优势分析

答题小程序是一种在移动设备上运行的应用程序&#xff0c;旨在提供各种类型的答题体验。以下是答题小程序的一些特点和优势&#xff1a; 一、特点 多样化的题目类型&#xff1a; 包括选择题、填空题、判断题等常见题型&#xff0c;还可能有简答题、论述题等更具挑战性的题型。…

qt+opengl 实现纹理贴图,平移旋转,绘制三角形,方形

1 首先qt 已经封装了opengl&#xff0c;那么我们就可以直接用了&#xff0c;这里面有三个函数需要继承 virtual void initializeGL() override; virtual void resizeGL(int w,int h) override; virtual void paintGL() override; 这三个函数是实现opengl的重要函数。 2 我们…

arp欺骗及其实验

ARP欺骗&#xff08;ARP Spoofing&#xff09;是一种网络攻击技术&#xff0c;攻击者通过伪造ARP&#xff08;地址解析协议&#xff09;消息&#xff0c;将其MAC地址与目标IP地址关联&#xff0c;从而实现对网络流量的截获、篡改或重定向。以下是ARP欺骗的详细信息&#xff1a;…

【JVM】—Java内存区域详解

Java内存区域详解 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 文章目录 Java内存区域详解1 线程私有1…

Linux系统:Ubuntu上安装Chrome浏览器

Ubuntu系统版本&#xff1a;23.04 在Ubuntu系统上安装Google Chrome浏览器&#xff0c;可以通过以下步骤进行&#xff1a; 终端输入以下命令&#xff0c;先更新软件源&#xff1a; sudo apt update 或 sudo apt upgrade终端输入以下命令&#xff0c;下载最新的Google Chrome .…

瑞芯微RK3566/RK3568 Android11使用OTA升级固件方法,深圳触觉智能鸿蒙开发板演示,备战第九届华为ICT大赛

本文介绍瑞芯微RK3566/RK3568在Android11系统OTA升级固件方法&#xff0c;使用触觉智能的Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566&#xff0c;Laval官方社区主荐&#xff01; 1、OTA包生成 在源码根目录上执行以下命令编译OTA包 # make installclean # …

Docker实践与应用举例

目录 1. 引言 2. Docker的基本概念 2.1 什么是Docker容器 2.2 Docker镜像 2.3 Docker架构 3. Docker的应用场景 3.1 开发与测试环境的隔离 3.2 持续集成与持续交付&#xff08;CI/CD&#xff09; 3.3 微服务架构 4. Docker的实践案例 4.1 部署Nginx反向代理 4.2 使用…

端到端的开源OCR模型:GOT-OCR-2.0,支持场景文本、文档、乐谱、图表、数学公式等内容识别!

今天给大家分享一个端到端的开源 OCR 模型&#xff0c;号称 OCR 2.0&#xff01; 支持场景文本、文档、乐谱、图表、数学公式等内容识别&#xff0c;拿到了 BLEU 0.972 高分。 从给出的演示图来看&#xff0c;一些非常复杂的数学公式都能正确的识别&#xff0c;颇为强大。模型…

文件IO(Linux文件IO)

前言 本文介绍Linux系统下自带的文件IO的函数。 Linux文件IO相关函数 open函数 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode)…

JAVA就业笔记8——第二阶段(5)

课程须知 A类知识&#xff1a;工作和面试常用&#xff0c;代码必须要手敲&#xff0c;需要掌握。 B类知识&#xff1a;面试会问道&#xff0c;工作不常用&#xff0c;代码不需要手敲&#xff0c;理解能正确表达即可。 C类知识&#xff1a;工作和面试不常用&#xff0c;代码不…

Spire.PDF for .NET【页面设置】演示:在 C#/VB.NET 中创建 PDF 小册子

当人们打印大型 PDF 文档时&#xff0c;PDF 小册子非常有用。它在书籍、报纸和杂志编辑中特别受欢迎。本节将介绍一种通过C#、VB.NET 中的.NET PDF组件创建 PDF 小册子的非常简单的方法。 Spire.PDF for .NET 是一款独立 PDF 控件&#xff0c;用于 .NET 程序中创建、编辑和操作…

进程和作业管理

1.概念 &#xff08;1&#xff09;进程 进程是指一个具有独立功能的程序的一次运行过程&#xff0c;也是系统进行资源分配和调度的基本单位&#xff0c;即每个程序模块和它执行时所处理的数据组成了进程。进程虽不是程序&#xff0c;但由程序产生。进程与程序的区别在于&#…

中国联通目前规模最大的境外综合性通信枢纽大楼

中国联通&#xff08;香港&#xff09;将军澳智 云数据中心&#xff1a;打造境外通信服务新标杆 在数字化浪潮席卷全球的今天&#xff0c;数据中心作为信息社会的基石&#xff0c;其重要性日益凸显。中国联通&#xff08;香港&#xff09;将军澳智 云数据中心&#xff0c;作…