在 Pentaho Data Integration 中为不同的连接复制作业

Posted

技术标签:

【中文标题】在 Pentaho Data Integration 中为不同的连接复制作业【英文标题】:Duplicating a job in Pentaho Data Integration for different connections 【发布时间】:2016-08-25 15:43:00 【问题描述】:

我通过 Spoon UI 中的复制表向导生成了一个作业,它将一些表从 oracle 数据库源复制到 SQL Server 源,并对作业进行了一些更改。

现在我想复制相同的作业(相同的表和相同的更改),但只更改连接。 Spoon 有可能吗?

我查看了 Spoon UI,但没有找到任何选项可以让我通过更改连接来复制工作。

编辑 在我创建了两个步骤后:一个用于生成行,另一个用于混淆密码,在 encrypted 字段中,我没有得到预期的“加密:Obfusctaed Password”输出

这是生成行的步骤:

这是修改后的 Java 脚本值的另一张图片:

【问题讨论】:

您需要复制您的kjb 文件。作业和转换实际上是 XML 文件。然后您可以手动编辑它。这很简单,带有<connection> 标签,所以你应该能够自己搞清楚。如果您想保留两个工作而不是每次都更改数据库连接凭据,我发现这是最快的方法。 我应该如何为连接提供密码,因为我注意到它们在 .ktr 文件中被加密 我已将其附在我的答案中。 我很困惑。为什么不能直接在左侧菜单的“数据库连接”中复制粘贴文件并更改连接?您可以只创建新连接或编辑现有连接。您的转换/作业是基于文件的还是在存储库中?你想不时动态地改变它们吗? 看起来没有找到那个 javascript 包。也许使用旧的 pentaho 版本或不完整的版本? :s 【参考方案1】:

您需要复制您的kjb 文件。作业和转换实际上是 XML 文件。然后您可以手动编辑它。

这很简单,带有<connection> 标签,所以您应该能够自己解决所有问题。

如果您想保留两个作业而不是每次都更改数据库连接凭据,我发现这是最快的方法。

如果您需要提供混淆密码(它们没有加密,只是经过混淆处理),您可以创建一个转换来为您提供混淆密码,为您提供要放入 XML 文件的值。

在 Kettle 6.1 中重现创建用于混淆密码的转换的步骤(对于旧版本,Script Values / Mod 步骤的名称是 Modified Java Script Value):

    步骤生成行只有 1 行存储密码作为值 步骤 Script Values / Mod 进行基本混淆

【讨论】:

找不到脚本值/修改步骤,您使用的是哪个版本的 pdi? 我使用的是 PDI 6.1。这是一个常规的 Javascript 步骤(可能对你来说它被称为修改后的 Java 脚本值) 嘿,@mounaim 给我留言,让我知道你是如何处理事情的,还有什么你还在苦苦挣扎的事情 嘿@Kamil G。我已经成功执行了这些步骤,在哪里可以查看我的加密密码? @mounaim 在 执行结果 面板中,该面板在左下角我的答案所附的屏幕上可见。【参考方案2】:

$KETTLE_HOME/samples/transformation/job-executor 中有示例。 将连接参数传递给子作业

不好的是你不能传递 jdbc 驱动程序名称,所以它们必须是具有不同连接设置的相同类型的数据库

【讨论】:

能否提供更多细节? 不幸的是,这对我没有帮助,因为我有不同的数据库类型 :) 也许您可以使用“连接类型”:通用数据库并将“自定义驱动程序类名称”作为参数传递(例如 MS SQL Server“自定义驱动程序类名称”:net.sourceforge.jtds.jdbc .Driver,“自定义连接 URL”:jdbc:jtds:sqlserver://localhost:1433/;instance)。【参考方案3】:

没有办法直接从 Pentaho 做你想做的事,一种选择是直接改变转换的 XML 来改变连接。所以思路如下:

    弄清楚连接的 XML 的样子。为此只 注册一个新连接,在转换中的某个地方使用它 并观看元素的 XML 源代码,例如 ........ 制作转换的物理副本 替换 XML 文件中的连接定义和引用。为此,您可以像这样使用 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- This template will replace the connection definition -->
    <xsl:template match="connection[./name='SOURCE_CONNECTION_NAME']">
    <!-- This is the connection configuration --> 
            <connection>
                <name>TARGET_CONNECTION_NAME</name>
                <server>localhost</server>
                <type>ORACLE</type>
                <access>Native</access>
                <database><!-- DB NAME --> </database>
                <port>1521</port>
                <username><!-- USERNAME --> </username>
                <password><!-- PWD --></password>
                <servername/>
                <data_tablespace><!-- --></data_tablespace>
                <index_tablespace/>
                <attributes>
                  <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
                  <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
                  <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
                  <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
                  <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>Y</attribute></attribute>
                  <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
                  <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
                  <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
                  <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
                </attributes>
            </connection>
    </xsl:template>
    <!-- And that one will replace the connection's reference in table input/table output --> 
    <xsl:template match="connection[text()='SOURCE_CONNECTION_NAME']">
            <connection>TARGET_CONNECTION_NAME</connection>
    </xsl:template>
</xsl:stylesheet>

【讨论】:

我应该如何为连接提供密码,因为我注意到它们在 .ktr 文件中被加密 @mounaim,我写了这个。创建一些空转换,在此处放置一个“表格输入”并指定此步骤所需的连接。将转换保存在某处,打开 .ktr 文件,然后复制整个 标记内容,包括加密密码。【参考方案4】:

啊,我相信你可以做到这一点,但我自己还没有做到。没必要。但我相信您可以使用共享对象来获得您想要的这种功能,并且只需进行一次(更容易维护)的转换。这是讨论它的论坛链接。

让我知道结果如何。很好奇。

http://forums.pentaho.com/showthread.php?75069-Fully-Dynamic-Database-Configuration-Including-underlying-databsae-type

【讨论】:

以上是关于在 Pentaho Data Integration 中为不同的连接复制作业的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pentaho Data Integration (Kettle) 中合并两个文件

Pentaho data integration(kettle) 在Mac上启动不了

如何在 Pentaho Data Integration (Kettle) 中向文件添加行号?

在 Pentaho Data Integration 中为不同的连接复制作业

如何通过 Pentaho Data Integration 的 table_output 步骤填充表格?

Pentaho 中没有 MongoDB 选项