etl 8.2.0.0-342 报错NamedClusterProvider.closeFileSystem(NamedClusterProvider.java:195)(待验证)

本文详细描述了一种在Pentaho ETL过程中遇到的Metastore冲突问题,涉及到多个任务并发运行时的NamedClusterProvider.closeFileSystem异常。作者通过查阅源码和社区讨论,探讨了可能的原因(如默认Metastore路径冲突),并尝试了配置更改、内存优化、清理缓存和禁用Hive并发等措施来解决这个问题。更新部分包括检查随机数生成和调整启动参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

etl工程跑的时候有概率会报以下错误:

	at org.pentaho.big.data.impl.vfs.hdfs.nc.NamedClusterProvider.closeFileSystem(NamedClusterProvider.java:195)
	at org.pentaho.di.core.vfs.ConcurrentFileSystemManager.closeEmbeddedFileSystem(ConcurrentFileSystemManager.java:192)
	at org.pentaho.di.core.vfs.KettleVFS.closeEmbeddedFileSystem(KettleVFS.java:502)
	at org.pentaho.di.base.AbstractMeta.disposeEmbeddedMetastoreProvider(AbstractMeta.java:2054)
	at org.pentaho.di.job.Job.execute(Job.java:626)
	at org.pentaho.di.job.Job.execute(Job.java:821)
	at org.pentaho.di.job.Job.execute(Job.java:559)
	at org.pentaho.di.job.entries.job.JobEntryJobRunner.run(JobEntryJobRunner.java:69)
	at java.lang.Thread.run(Thread.java:748)

查阅了一些资料以及翻阅源码:

首先外网资料:

https://jira.pentaho.com/browse/PDI-18940

Could this be related to PDI-18465?

If there are multiple jobs running on the same machine and PENTAHO_METASTORE_FOLDER defaults to users's home, if the first disposes of it, the rest fail with above error.

原因好像是同一台机器前一个任务占用了PENTAHO_METASTORE_FOLDER,导致后面的任务使用不了,抛错处理失败了。

然后我翻了下jar包的源码:

…\data-integration\system\karaf\system\pentaho\pentaho-big-data-impl-vfs-hdfs\8.2.0.0-342\pentaho-big-data-impl-vfs-hdfs-8.2.0.0-342.jar

IMetaStore defaultMetastore = this.metaStoreService.getMetastore();
为第195行

  public void closeFileSystem(String embeddedMetastoreKey) {
    IMetaStore defaultMetastore = this.metaStoreService.getMetastore();//L195
    IMetaStore embeddedMetastore = this.metaStoreService.getExplicitMetastore(embeddedMetastoreKey);
    if (this.cacheEntries.get(embeddedMetastoreKey) != null) {
      for (FileSystem fs : this.cacheEntries.get(embeddedMetastoreKey)) {
        closeFileSystem(fs);
      }

所以先准备尝试配置下

参阅
https://jira.pentaho.com/browse/PDI-18465

对OPT追加配置 “-DPENTAHO_METASTORE_FOLDER=%PENTAHO_METASTORE_FOLDER%”
因为偶然出现的,无法复现,所以观望下后续是否会解决。

The spoon.bat and .sh scripts are missing the -DPENTAHO_METASTORE_FOLDER

Workaround is to edit this line in spoon.bat:

set OPT=%OPT% %PENTAHO_DI_JAVA_OPTIONS% "-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2" "-Djava.library.path=%LIBSPATH%" "-DKETTLE_HOME=%KETTLE_HOME%" "-DKETTLE_REPOSITORY=%KETTLE_REPOSITORY%" "-DKETTLE_USER=%KETTLE_USER%" "-DKETTLE_PASSWORD=%KETTLE_PASSWORD%" "-DKETTLE_PLUGIN_PACKAGES=%KETTLE_PLUGIN_PACKAGES%" "-DKETTLE_LOG_SIZE_LIMIT=%KETTLE_LOG_SIZE_LIMIT%" "-DKETTLE_JNDI_ROOT=%KETTLE_JNDI_ROOT%"

and add:

"-DPENTAHO_METASTORE_FOLDER=%PENTAHO_METASTORE_FOLDER%"

similar change to spoon.sh needed.

20210827更新:

补充下修正之后的日志记录:
我以为没人看的,就没更新。
过了4个月后,问题还是存在,METASTORE应该有个默认值,所以我这边觉得配不配无所谓。
主要问题一个任务内存在大量并行任务的老不定期报错,其他任务都不报错。估计主要还是因为并行任务抢占METASTORE导致的。网上查了下,没找到怎么设置线程层次的METASTORE。那就只能把并行改成串行的。
我先不改串行,优化了几点试试看:

1、修改内存配置

spoon.sh文件内修改,增加一倍尝试下。
注意:Xmx不能高于机器内存的1/4,Xms、MaxPermSize不能高于Xmx

if [ -z "$PENTAHO_DI_JAVA_OPTIONS" ]; then
    PENTAHO_DI_JAVA_OPTIONS="-Xms1024m -Xmx2048m -XX:MaxPermSize=256m"
fi

2、删除缓存文件

接手之前不知道为啥data-integration下会存在一个 D:\kettle8.2\data-integration\system\karaf\caches\pan\data-1 的文件夹(linux系统),估计是之前在windows上面执行过后放到linux上面的,删除了看看效果。
其他运行缓存:
data内没有啥文件,删不删无所谓

rm -rf  XXX/data-integration/system/karaf/caches
#rm -rf  XXX/data-integration/system/karaf/data

3、其他配置文件

XXX/data-integration/system/karaf/instances/instance.properties
原先居然在D:/XXX/karaf

item.0.loc = XXX/data-integration/system/karaf

20220225更新:

查询到猜测是否是metastore使用hive导致的,所以可能是hive锁导致的。关闭并发
hive.support.concurrency默认是true
找到data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations\cdh514\hive-site.xml
hive.support.concurrency改成false
20220315还是报错,还是没什么用。

20220819更新:

这几天有空又查看了些资料
https://www.jianshu.com/p/eca6eff9360a
HDFS的FileSystem非线程安全,所以并行会报错,但是找不到kettle设置"fs.hdfs.impl.disable.cache"参数的地方。
搜了配置只找到2个和cache有关的参数,hdfs的一个配置文件\data-integration\plugins\pentaho-big-data-plugin\plugin.properties,另一个是karaf的,暂时先没处理。

# Enables the use of Hadoop's Distributed Cache to store the Kettle environment required to execute Pentaho MapReduce
# If this is disabled you must configure all TaskTracker nodes with the Pentaho for Hadoop Distribution
# @deprecated This is deprecated and is provided as a migration path for existing installations.
pmr.use.distributed.cache=true

我没用hdfs但为啥会报这个错就很奇怪。
改成pmr.use.distributed.cache=false试一下。但是写着是弃用,只能先试试看。
上面的20220225改的部分,应该没有指定使用cdh514,所以应该没有改的必要。

20240611更新:

部署到新环境时候发现可能是在生成随机数的时候卡住,改spoon、kitchen、pan脚本(Windows:bat;linux:sh)就行。刚改,持续跟进下。(只改spoon好像无效)
增加启动参数-Djava.security.egd=file:/dev/urandom

spoon.sh

OPT="$OPT $PENTAHO_DI_JAVA_OPTIONS -Djava.security.egd=file:/dev/urandom -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 -Djava.library.path=$LIBPATH -DKETTLE_HOME=$KETTLE_HOME -DKETTLE_REPOSITORY=$KETTLE_REPOSITORY -DKETTLE_USER=$KETTLE_USER -DKETTLE_PASSWORD=$KETTLE_PASSWORD -DKETTLE_PLUGIN_PACKAGES=$KETTLE_PLUGIN_PACKAGES -DKETTLE_LOG_SIZE_LIMIT=$KETTLE_LOG_SIZE_LIMIT -DKETTLE_JNDI_ROOT=$KETTLE_JNDI_ROOT -DPENTAHO_METASTORE_FOLDER=/home/axxt/data-integration/pentaho/"

kitchen.sh

"$DIR/spoon.sh" -main org.pentaho.di.kitchen.Kitchen -Djava.security.egd=file:/dev/urandom -initialDir "$INITIALDIR/" "$@"

pan.sh

"$DIR/spoon.sh" -main org.pentaho.di.pan.Pan -Djava.security.egd=file:/dev/urandom -initialDir "$INITIALDIR/" "$@"

20240719还是报错,还是没什么用。

<think>我们正在解决Kettle(PentahoDataIntegration)中无法加载指定图片资源的问题,具体错误信息是:`ERROR:Unabletoloadimageredis-input.pngversion8.2.0.0-342`。###问题分析这个错误通常发生在Kettle尝试加载插件(如Redis输入插件)的图标时。可能的原因包括:1.**插件安装不完整**:Redis插件未正确安装或文件缺失。2.**路径配置问题**:Kettle无法在指定的路径下找到图片资源。3.**缓存问题**:Kettle的缓存中可能没有正确加载该图片。###解决步骤####1.确认Redis插件安装首先,确保Redis插件已经正确安装。Redis插件通常以jar包形式提供,位于Kettle的`plugins`目录下。检查以下路径:-`{kettle_home}/plugins/redis`在该目录下,应该包含以下文件:-`redis-input.png`(图标文件)-`redis-input.jar`(插件主文件)-其他相关文件如果缺少`redis-input.png`文件,则需要重新安装插件或手动添加该图片。####2.手动添加图片资源如果确认插件目录下缺少`redis-input.png`,可以尝试以下方法:-**从源码或网络获取图片**:尝试从官方源码库(如Gitee上提供的pentaho-kettle源码[^1])或其他可靠来源获取该图片,并放置到对应目录。例如,在源码中查找路径:`plugins/redis/resources/redis-input.png`。-**创建目录结构**:如果`plugins/redis`目录不存在,需要手动创建:```{kettle_home}/plugins/redis/resources/```然后将`redis-input.png`放在`resources`目录下。####3.清理缓存Kettle会缓存插件信息,缓存文件位于用户目录下的`.kettle`文件夹中。尝试删除缓存:-关闭Kettle。-删除以下目录(或类似路径):-Windows:`C:\Users\{你的用户名}\.kettle`-Linux:`~/.kettle`-重新启动Kettle,让Kettle重新加载插件和资源。####4.检查插件配置如果以上步骤无效,检查插件配置文件:-在`plugins/redis`目录下,查看是否有`plugin.xml`文件,确认其中关于图标的配置是否正确。例如:```xml<iconfile>resources/redis-input.png</iconfile>```确保路径与实际文件位置一致。####5.其他可能原因-**版本兼容性问题**:确保Redis插件与Kettle版本(8.2.0.0-342)兼容。-**文件权限问题**:确保Kettle有权限读取图片文件。###参考引用-关于Kettle的源码和插件结构,可以参考Gitee上的pentaho-kettle-8.2.0.0-342源码[^1]。-在数据开发中,ETL工具的插件管理是常见问题,可参考Kettle资料库建立的相关文档[^3]。§§相关问题§§1.如何安装和管理Kettle插件?2.Kettle插件开发中如何配置图标资源?3.如何解决Kettle中的常见资源加载错误?</think>### 解决Kettle无法加载图片资源的问题 您在Kettle 8.2.0.0-342中遇到的`ERROR: Unable to load image redis-input.png`错误,通常是由以下原因导致的: #### 主要原因分析 1. **插件资源路径错误** Redis插件(或其他插件)的图标文件`redis-input.png`未放置在正确目录: ```bash {kettle_home}/plugins/redis/resources/ # 正确路径示例 ``` 2. **缓存未更新** Kettle会缓存插件元数据,新增/修改插件后未清理缓存导致加载旧配置[^3]。 3. **源码编译问题** 若使用自编译源码(如Gitee的pentaho-kettle-8.2.0.0-342[^1]),可能缺少资源文件打包配置。 --- #### 解决方案 ##### ✅ 方法1:手动放置图片资源 1. 获取图片文件: - 从官方插件包提取,或从源码仓库下载(如[pentaho-kettle源码][^1]) 2. 创建目录结构: ```bash # 在Kettle安装目录下执行 mkdir -p plugins/redis/resources/ ``` 3. 将`redis-input.png`放入`resources/`目录 ##### ✅ 方法2:清理Kettle缓存 1. 关闭Kettle 2. 删除缓存目录: - **Windows**:`C:\Users\{用户名}\.kettle\` - **Linux**:`~/.kettle/` 3. 重启Kettle ##### ✅ 方法3:源码编译修复(开发人员适用) 若使用自编译版本[^1]: 1. 检查资源打包配置: ```xml <!-- pom.xml示例 --> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.png</include> </includes> </resource> </resources> ``` 2. 确认图片文件在`src/main/resources/`目录存在 3. 重新编译项目 --- #### 验证步骤 1. 启动Kettle Spoon 2. 新建转换 → 添加"Redis Input"步骤 3. 观察步骤图标是否正常显示: ```mermaid graph LR A[启动Kettle] --> B{Redis步骤图标状态} B -->|正常显示| C[成功] B -->|仍报错| D[检查plugins/redis路径权限] ``` > **注意**:若使用分布式环境(如CDH),需同步修复所有节点上的资源路径[^2]。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值