Macbook M1 安装PDI(Kettle) 9.3

Macbook M1 安装PDI(Kettle) 9.3

当前 PDI(Kettle)最新版为9.3,依赖Java JDK 11。因为没有专门用于 M1的程序,需要下载并安装x86_64架构的JDK及依赖软件,并 “强制在Intel模式下运行shell” 的方式来实现 Kettle 的正常运行。

参考:https://indiespark.top/software/run-command-line-apple-silicon/

配置 Terminal

首先,配置一个新的 Terminal 描述文件,网上资料一般都命名为“Rosetta",当然也可以命名为“Terminal(Intel)”之类,只要自己能记住这个描述文件是专门为 x86模式准备的即可。
1、配置“窗口-标题”为“Terminal(Intel)”,以易于辨识;
2、配置“Shell-启动“,勾选“运行命令:“,填入env /usr/bin/arch -x86_64 /bin/zsh --login,取消勾选“在shell中运行”。
Macbook M1 安装PDI(Kettle) 9.3_第1张图片
然后,启动新的 Terminal(Intel)窗口,执行 arch 命令,如果输出的是i386,则表示已经运行在Intel模式下。

安装Java JDK

下载 JDK

首先,下载 Java 11,本文采用zulu openJDK 11 来代替 Oracle JDK 11。
链接:https://www.azul.com/downloads/?version=java-11-lts&os=macos&architecture=x86-64-bit&package=jdk
说明:必须选择 x86 64bit 架构的JDK,推荐直接下载dmg格式的文件。
JDK将自动安装在 /Library/Java/JavaVirtualMachines/zulu-11.jdk 目录下。

配置环境变量

打开用户默认目录下的.zprofile 或 .zshrc,设置 JAVA_HOME环境变量

export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH

然后source 配置文件,使改动生效。

安装 PDI(Kettle)

官网下载地址
本文下载版本:9.3,下载完成后,解压到指定目录下。

替换 libswt 依赖 jar

接下来,要用eclipse提供的SWT图形工具套件(适配macos的x86_64版本的)来替代 kettle自带的 swt.jar。

首先,从maven 下载eclipse最新jar ,如下图示:

Macbook M1 安装PDI(Kettle) 9.3_第2张图片

然后,替换 kettle 安装 data-integration/libswt/osx64/目录下的swt.jar即可。

启动 kettle

到目前为止,所有软件都已就绪。
我们可以打开 Terminal(Intel) 终端窗口,切换到data-integration目录下,执行sh spoon.sh命令,来启动 spoon(kettle的图形化界面)。

创建简单的spoon启动脚本

可以创建一个 start_spoon.sh 命令文件,进行快速启动。
文件内容示例:

# check if current arch is i386, quit if not.
a=`arch`
if [ $a != "i386" ];then
    echo "Current Arch is not x86, please use Terminal(Intel) to run the program!"
    exit
fi

echo "Starting Kettle Spoon..."
nohup sh /***/data-integration/spoon.sh >/dev/null 2>&1 &

首先,检查 arch命令输出的是不是 i386。如果是,则继续启动过程,否则,给出提示信息并返回。通过判断 arch输出是否为i386,即可判断当前是否“强制在Intel模式下运行Shell”。

然后,通过 nohup方式启动 spoon.sh即可。程序启动后自动转入后台执行。

附:功能更多的启停脚本

网上找到的Kettle启停脚本,适合在服务器端使用,相对功能比较完善,供参考。

#!/bin/sh
# @date 2023-01-03
# kettle启动停止工具脚本
 
KJB_NAME=$2
## kettle的父路径
KETTLE_PATH='/opt/module/kettle/pdi-ce-8.2.0.0-342'
 
## 使用说明,用来提示输入参数
usage(){
    echo "Usage: sh 脚本名.sh [start|stop|restart|status|tail] [KJB_NAME]"
    exit 1
}
 
## 检查执行的文件是否存在
is_exist(){
    if [[ ! -e ${KETTLE_PATH}/jobs/${KJB_NAME}.kjb ]]; then
        echo "该${KJB_NAME}.kjb在${KETTLE_PATH}/jobs/下不存在!"
        exit 1
    fi
}
 
## 检查程序是否在运行
is_running(){
    pid=`ps -ef|grep ${KJB_NAME}.kjb|grep -v grep|awk '{print $2}'`
}
 
## 启动方法
start(){
    is_exist
    is_running
    echo "pid=${pid}"
    if [[ -z "${pid}" ]]; then
        nohup ${KETTLE_PATH}/data-integration/kitchen.sh -file=${KETTLE_PATH}/jobs/${KJB_NAME}.kjb >> ${KETTLE_PATH}/logs/${KJB_NAME}.log 2>&1 &
        echo "${KJB_NAME} start success!"
    else
        echo "${KJB_NAME} is already running."
    fi
}
 
## 关闭方法
stop(){
    is_running
    if [[ -z "${pid}" ]]; then
        echo "${KJB_NAME} is not running!"
    else
        echo "${KJB_NAME}, Trying to kill the pid=${pid}."
        kill -9 ${pid}
        echo "${KJB_NAME} stop success!"
    fi
}
 
## 重启方法
restart(){
     stop
     start
}
 
## 启动方法
status(){
    is_exist
    is_running
    echo "pid=${pid}"
    if [[ -z "${pid}" ]]; then
        nohup ${KETTLE_PATH}/data-integration/kitchen.sh -file=${KETTLE_PATH}/jobs/${KJB_NAME}.kjb >> ${KETTLE_PATH}/logs/${KJB_NAME}.log 2>&1 &
        echo "${KJB_NAME} start success!"
    else
        echo "${KJB_NAME} is already running."
    fi
}
 
if [[ $# -lt 2 ]]; then
	usage
fi
 
case $1 in
	"start")
		echo "=================== start kettle_kjb ==================="
		start
	;;
	"stop")
		echo "=================== stop kettle_kjb ==================="
		stop
	;;
	"restart")
		echo "=================== restart kettle_kjb ==================="
		restart
	;;
	"status")
		echo "=================== status kettle_kjb ==================="
		ps -ef|grep ${KJB_NAME}.kjb|grep -v grep
	;;
	"tail")
		echo "=================== tail kettle_kjb ==================="
		tail -60f ${KETTLE_PATH}/logs/${KJB_NAME}.log
	;;
	*)
		echo "Input Args Error..."
	;;
esac

遇到的问题

JDK版本问题

在使用非x86版本的 JDK时,如果直接执行spoon.sh,将会报错:

data-integration % sh spoon.sh
java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons:
	no swt-cocoa-4956r13 in java.library.path: [./../libswt/osx64/]
	no swt-cocoa in java.library.path: [./../libswt/osx64/]
	no swt in java.library.path: [./../libswt/osx64/]
	Can't load library: /Users/xxx/.swt/lib/macosx/aarch64/libswt-cocoa-4956r13.jnilib
	Can't load library: /Users/xxx/.swt/lib/macosx/aarch64/libswt-cocoa.jnilib
	Can't load library: /Users/xxx/.swt/lib/macosx/aarch64/libswt.jnilib
	Can't load library: /Users/xxx/.swt/lib/macosx/aarch64/libswt-cocoa-4956r13.jnilib

这是因为 kettle的图形化依赖 eclipse的 swt图形库,并且进而依赖系统的 JDK。一般情况下,当前系统是安装的M1版本的JDK,这与 x86版本的 Kettle 并不兼容。

需要按照本文提供的地址下载并安装 x64版本的JDK。

参考文档

kettle的下载安装以及问题点
关于M1 Mac 安装部署PDI(kettle)的方法步骤及问题解决
(完美安装,无报错)M1 mac 安装kettle

你可能感兴趣的:(#,Pipeline,Java,kettle,macos,java)