&哈哈哈哈哈哈 2024-06-14 16:59 采纳率: 0%
浏览 6

在java中使用kettle

我在一个java项目中使用到了kettle9.1.0.0-324。在生成ktr中,我出现于以下问题,要处理

2024/06/14 15:46:19 - org.pentaho.big.data.impl.cluster.NamedClusterManager@53305564 - ERROR (version Unknown, build 0 from 2024/06/14 15:46:18.580 by zyl) : No metastore found and exception encountered looking for user-specified or legacy metastore
2024/06/14 15:46:19 - org.pentaho.big.data.impl.cluster.NamedClusterManager@53305564 - ERROR (version Unknown, build 0 from 2024/06/14 15:46:18.580 by zyl) : java.lang.NullPointerException

我的代码

 public StepMeta addOutputHadoopFileMeta(TransMeta transMeta, PluginRegistry registry, int x, int y, String stepName, String separator, String extension,
                                            boolean createParentFolder, String fileName, boolean addToResultFiles, String encoding, TextFileField[] outputFields, String sourceConfigurationName,
                                            String splitevery) {
        NamedClusterManager clusterManager = new NamedClusterManager();
        NamedCluster cluster = new NamedClusterImpl();
        cluster.setStorageScheme("default");
        cluster.setHdfsHost("localhost");
        cluster.setHdfsPort("3004");
        cluster.setName("cloudera");
        cluster.setHdfsUsername("hadoopdev");
        cluster.setHdfsPassword("");
        clusterManager.setClusterTemplate(cluster);
        HadoopFileOutputMeta outputMeta = new HadoopFileOutputMeta(clusterManager, null, null);
        outputMeta.setDefault();
        outputMeta.setSourceConfigurationName(sourceConfigurationName);
        outputMeta.setFileName(fileName);
        outputMeta.setCreateParentFolder(createParentFolder);
        outputMeta.setExtension(extension);
        outputMeta.setAddToResultFiles(addToResultFiles);

        outputMeta.setSeparator(separator);
        outputMeta.setEncoding(encoding);

        outputMeta.setOutputFields(outputFields);

        outputMeta.setSplitEveryRows(splitevery);

        String hadoopFileOutputMetaPluginId = registry.getPluginId(StepPluginType.class, outputMeta);
        StepMeta hadoopFileOutputMetaStep = new StepMeta(hadoopFileOutputMetaPluginId, stepName, outputMeta);
        hadoopFileOutputMetaStep.setLocation(x, y);
        hadoopFileOutputMetaStep.setStepID("HadoopFileOutputPlugin");
        hadoopFileOutputMetaStep.setDraw(true);
        transMeta.addStep(hadoopFileOutputMetaStep);
        return hadoopFileOutputMetaStep;
    }

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-14 16:59
    关注

    引自免费微信小程序:皆我百晓生

    从你提供的日志信息来看,错误信息提示没有找到元数据存储(metastore),并且在查找用户指定或遗留的元数据存储时遇到了NullPointerException。这通常意味着在Kettle运行时,它未能正确配置或找到所需的Hadoop或Hive元数据存储。

    在你的Java代码中,你直接创建了一个NamedCluster实例并设置了某些属性,但似乎没有正确地将这个集群信息保存或注册到NamedClusterManager中,以便Kettle可以在运行时找到并使用它。此外,NamedClusterManager可能没有被正确初始化,导致它无法识别任何已定义的集群。

    为了解决这个问题,你需要确保NamedClusterManager能够访问和加载你的集群设置。这通常涉及到在Kettle的配置文件或代码中设置正确的路径,使得NamedClusterManager可以从那里加载集群定义。

    解决方案

    1. 确认NamedClusterManager的初始化: 确保NamedClusterManager在使用前已经正确初始化,并且可以访问到集群定义。这可能涉及到设置系统属性或环境变量,或者调用NamedClusterManager的初始化方法。

    2. 持久化集群信息: 将NamedCluster对象的信息持久化,例如通过Kettle的XML文件格式或数据库。然后,在NamedClusterManager中加载这些信息。

    3. 更新代码: 在你的代码中,尝试使用NamedClusterManager加载集群信息,而不是手动创建NamedCluster对象。这里是一个修改后的示例代码片段,展示了如何从文件加载集群信息:

      import org.pentaho.di.core.exception.KettleException;
      import org.pentaho.di.core.util.EnvUtil;
      import org.pentaho.di.core.xml.XMLHandler;
      import org.pentaho.di.repository.Repository;
      import org.pentaho.di.repository.kdr.KettleDatabaseRepository;
      import org.pentaho.di.trans.TransMeta;
      import org.pentaho.di.trans.step.StepMeta;
      import org.pentaho.di.trans.steps.hadoopfileoutput.HadoopFileOutputMeta;
      import org.pentaho.di.trans.steps.textfileoutput.TextFileField;
      import org.pentaho.di.core.plugins.PluginRegistry;
      import org.pentaho.big.data.api.cluster.NamedCluster;
      import org.pentaho.big.data.api.cluster.NamedClusterManager;
      
      // ...
      
      public StepMeta addOutputHadoopFileMeta(TransMeta transMeta, PluginRegistry registry, int x, int y, String stepName, String separator, String extension,
                                              boolean createParentFolder, String fileName, boolean addToResultFiles, String encoding, TextFileField[] outputFields, String sourceConfigurationName,
                                              String splitevery) throws KettleException {
      
          // Initialize the NamedClusterManager
          NamedClusterManager clusterManager = NamedClusterManager.getInstance();
      
          // Load the named cluster
          NamedCluster cluster = clusterManager.readNamedClusterFromXml("path/to/your/cluster.xml");
      
          // Ensure the cluster is loaded
          if (cluster == null) {
              throw new KettleException("Unable to load the named cluster");
          }
      
          // Create a HadoopFileOutputMeta instance using the loaded cluster
          HadoopFileOutputMeta outputMeta = new HadoopFileOutputMeta(clusterManager, null, null);
          outputMeta.setDefault();
          outputMeta.setSourceConfigurationName(sourceConfigurationName);
          outputMeta.setFileName(fileName);
          outputMeta.setCreateParentFolder(createParentFolder);
          outputMeta.setExtension(extension);
          outputMeta.setAddToResultFiles(addToResultFiles);
          outputMeta.setSeparator(separator);
          outputMeta.setEncoding(encoding);
          outputMeta.setOutputFields(outputFields);
          outputMeta.setSplitEveryRows(splitevery);
      
          String hadoopFileOutputMetaPluginId = registry.getPluginId(StepPluginType.class, outputMeta);
          StepMeta hadoopFileOutputMetaStep = new StepMeta(hadoopFileOutputMetaPluginId, stepName, outputMeta);
          hadoopFileOutputMetaStep.setLocation(x, y);
          hadoopFileOutputMetaStep.setStepID("HadoopFileOutputPlugin");
          hadoopFileOutputMetaStep.setDraw(true);
          transMeta.addStep(hadoopFileOutputMetaStep);
          return hadoopFileOutputMetaStep;
      }
      
    4. 检查环境变量: 确保你的应用程序环境变量或系统属性中包含了指向Kettle配置文件的路径,这通常是在PENTAHO_DI_HOMEDI_HOME环境变量中设置的。

    通过上述步骤,你应该能够解决你在Kettle中遇到的问题。如果仍然遇到困难,建议检查Kettle和相关组件的日志以获取更详细的错误信息,这可能会提供额外的线索来诊断问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月14日

悬赏问题

  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错