当前位置: 首页 > news >正文

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中运行”。
在这里插入图片描述
然后,启动新的 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 ,如下图示:

然后,替换 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" ];thenecho "Current Arch is not x86, please use Terminal(Intel) to run the program!"exit
fiecho "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 ]]; thenecho "该${KJB_NAME}.kjb在${KETTLE_PATH}/jobs/下不存在!"exit 1fi
}## 检查程序是否在运行
is_running(){pid=`ps -ef|grep ${KJB_NAME}.kjb|grep -v grep|awk '{print $2}'`
}## 启动方法
start(){is_existis_runningecho "pid=${pid}"if [[ -z "${pid}" ]]; thennohup ${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!"elseecho "${KJB_NAME} is already running."fi
}## 关闭方法
stop(){is_runningif [[ -z "${pid}" ]]; thenecho "${KJB_NAME} is not running!"elseecho "${KJB_NAME}, Trying to kill the pid=${pid}."kill -9 ${pid}echo "${KJB_NAME} stop success!"fi
}## 重启方法
restart(){stopstart
}## 启动方法
status(){is_existis_runningecho "pid=${pid}"if [[ -z "${pid}" ]]; thennohup ${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!"elseecho "${KJB_NAME} is already running."fi
}if [[ $# -lt 2 ]]; thenusage
ficase $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.jnilibCan't load library: /Users/xxx/.swt/lib/macosx/aarch64/libswt-cocoa.jnilibCan't load library: /Users/xxx/.swt/lib/macosx/aarch64/libswt.jnilibCan'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

相关文章:

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 的正…...

机器学习——模型评估

在学习得到的模型投放使用之前,通常需要对其进行性能评估。为此,需使用一个“测试集”(testing set)来测试模型对新样本的泛化能力,然后以测试集上的“测试误差( tootino error)作为泛化误差的近似。我们假设测试集是从样本真实分…...

react react-redux学习记录

react react-redux学习记录1.原理2.怎么用呢2.1 容器组件2.2UI组件2.3 App.jsx3.简化3.1简写mapDispatch3.2 Provider组件的使用3.3整合UI组件和容器组件1.原理 UI组件:不能使用任何redux的api,只负责页面的呈现、交互等。 容器组件:负责和redux通信&…...

nodejs环境配置

啥是node.js 简单理解就是js运行环境 啥是npm 简单理解就是nodejs包管理工具,全称Node Package Manager 啥是cnpm npm的开源镜像,在国内使用cnpm替代npm可以起到加速的效果 https://npmmirror.com/ ①安装node.js https://nodejs.org/en/download/ 下载…...

数据治理之元数据管理Atlas

数据治理之元数据管理的利器——Atlas 一、数据治理与元数据管理 1.1 背景 为什么要做数据治理? 业务繁多,数据繁多,业务数据不断迭代。人员流动,文档不全,逻辑不清楚,对于数据很难直观理解,…...

15 Nacos客户端实例注册源码分析

Nacos客户端实例注册源码分析 实例客户端注册入口 流程图&#xff1a; 实际上我们在真实的生产环境中&#xff0c;我们要让某一个服务注册到Nacos中&#xff0c;我们首先要引入一个依赖&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId>&l…...

C++将派生类赋值给基类(向上转型)

1.将派生类对象赋值给基类对象 #include <iostream> using namespace std;//基类 class A{ public:A(int a); public:void display(); public:int m_a; }; A::A(int a): m_a(a){ } void A::display(){cout<<"Class A: m_a"<<m_a<<endl; }//…...

使用Platform Designer创建Nios II 最小系统

Nios II简介 ​ Nios II 软核处理器十多年前就有了&#xff0c;它和xilinx的MicroBlaze类似&#xff0c;性能相比硬核处理器要差得多&#xff0c;工程应用也不是很多&#xff0c;那还有必须学习一下吗&#xff1f;我个人认为了解一下Nios II开发流程&#xff0c;对intel FPGA开…...

CD销售管理系统

技术&#xff1a;Java、JSP等摘要&#xff1a;二十一世纪是一个集数字化&#xff0c;网络化&#xff0c;信息化的&#xff0c;以网络为核心的社会。中国的网民充分领略到“畅游天地间&#xff0c;网络无极限” 所带来的畅快。随着Internet的飞速发展&#xff0c;使得网络的应用…...

华为OD机试模拟题 用 C++ 实现 - 玩牌高手(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明玩牌高手题目输入输出描述示例一输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为…...

Hive 的Stage如何划分?

Hive 的Stage如何划分&#xff0c;也是Hive SQL需要优化的一个点&#xff0c;这个问题&#xff0c;我也是在实际的工作中遇到的。所以我查询了网络的解答并记录下来&#xff0c;以便日后复习。以下是主要内容&#xff0c;enjoy~~~ 一个 Hive 任务会包含一个或多个 stage&#…...

《嵌入式应用开发》实验一、开发环境搭建与布局(上)

1. 搭建开发环境 去官网&#xff08;https://developer.android.google.cn/studio&#xff09;下载 Android Studio。 安装SDK&#xff08;默认Android 7.0即可&#xff09; 全局 gradle 镜像配置 在用户主目录下的 .gradle 文件夹下面新建文件 init.gradle&#xff0c;内容为…...

电子科技大学软件工程期末复习笔记(五):生产率和工作度量

目录 前言 重点一览 软件产品度量 测量软件生产率的两种方法 基于LOC测量 例题&#xff1a; 优点 缺点 基于功能点测量 例题&#xff1a; 本章小结 前言 本复习笔记基于王玉林老师的课堂PPT与复习大纲&#xff0c;供自己期末复习与学弟学妹参考用。 重点一览 这一部分内…...

400G光模块知识大全

400G光模块是目前高速传输领域中的一种先进产品&#xff0c;被广泛应用于高性能数据中心、通信网络、大规模计算、云计算等领域。本文将从400G光模块的定义、技术、产品型号、应用场景以及未来发展方向进行详细介绍。一、什么是400G光模块&#xff1f;400G光模块是指传输速率达…...

【Linux】零成本在家搭建自己的私人服务器解决方案

我这个人自小时候以来就特喜欢永久且免费的东西&#xff0c;也因此被骗过&#xff08;花巨款买了永久超级会员最后就十几天&#xff09;。 长大后骨子里也是喜欢永久且免费的东西&#xff0c;所以我不买服务器&#xff0c;用GitHubPage或者GiteePage搭建自己的静态私人博客&…...

Python 多线程、多进程和协程

一、多线程 threading 模块 threading 模块对象 对象描述Thread表示一个执行线程的对象Lock锁原语对象&#xff08;与 thread 模块中的锁一样&#xff09;RLock可重入锁对象&#xff0c;使单一线程可以&#xff08;再次&#xff09;获得已持有的锁&#xff08;递归锁&#x…...

Xml 注解

文章目录XmlRootElement(name"MyRootElement")XmlAccessorType(XmlAccessType.FIELD)XmlElementXmlAttributeXmlValueXmlElementRefXmlRootElement(name“MyRootElement”) XmlRootElement(name"MyRootElement") public class AccessorType {public Strin…...

【CSS文字滚动】CSS实现文字横向循环无缝滚动,鼠标移入暂停移出继续(附实测源码)

CSS如何实现文字横向滚动滚动效果1、垃圾liMarquee&#xff08;最好别用&#xff09;2、css实现文字滚动&#xff0c;且鼠标移入移出暂停和继续HTML源码如下&#xff1a;CSS源码如下&#xff1a;JS源码如下&#xff1a;3、片尾彩蛋CSS实现文字横向循环无缝滚动&#xff0c;鼠标…...

不使用implements关键字实现实现类(类似于mapper)

首先&#xff0c;说明一下功能需求&#xff0c;平时定义一个接口&#xff0c;就要使用implements关键字来实现接口。那么&#xff0c;当不使用此关键字的时候&#xff0c;是否也能使相关接口也能够绑定实现类呢&#xff1f; 答案是肯定的。 此篇文章的主要功能有两个&#xf…...

antd4里table的滚动是如何实现的?

rc-table里Header、Footer、TableBody实现保持同频滚动的方法 场景&#xff1a;Header、Footer都有&#xff0c;Table设置了scrollX&#xff0c;才关注同频滚动 那么是如何实现的&#xff1f; 监听onScroll方法获取到滚动条向左的滚动的距离scrollLeft&#xff1b;同时给三个…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...