【问题标题】:Connect to Teradata Using Airflow JDBC Connection使用 Airflow JDBC 连接连接到 Teradata
【发布时间】:2018-01-09 01:49:20
【问题描述】:

我正在尝试使用与 Teradata 数据库的连接在 Airflow 中执行 SqlSensor 任务。连接配置如下:

我特别提供了 2 个以“,”分隔的驱动程序路径,但我不确定这是否是正确的做法?

  • /home/airflow/java_sample/tdgssconfig.jar

  • /home/airflow/java_sample/terajdbc4.jar

DAG 执行时,会触发错误信息

[2017-08-02 02:32:45,162] {models.py:1342} INFO - Executing <Task(SqlSensor): check_running_batch> on 2017-08-02 02:32:12
[2017-08-02 02:32:45,179] {base_hook.py:67} INFO - Using connection to: jdbc:teradata://myservername.mycompanyname.org/database=MYDBNAME,TMODE=ANSI,CHARSET=UTF8
[2017-08-02 02:32:45,313] {sensors.py:109} INFO - Poking: SELECT BATCH_KEY FROM MYDBNAME.AUDIT_BATCH WHERE BATCH_OWNER='ARO_TEST' AND AUDIT_STATUS_KEY=1;
[2017-08-02 02:32:45,316] {base_hook.py:67} INFO - Using connection to: jdbc:teradata://myservername.mycompanyname.org/database=MYDBNAME,TMODE=ANSI,CHARSET=UTF8
[2017-08-02 02:32:45,497] {models.py:1417} ERROR - java.lang.RuntimeException: Class com.teradata.jdbc.TeraDriver not found

我做错了什么?

【问题讨论】:

  • 似乎没有像“,”这样的分隔符,github.com/apache/incubator-airflow/blob/master/airflow/hooks/…
  • 是的,它似乎只接受驱动程序路径的一个值,而 JayDeBeAPI 接受 Python 列表。我该怎么办?
  • 您必须删除 , 分隔符后的空格。例如:path/a.jar,path/bjar ...否则第二个jar路径以空格开头,气流将找不到...

标签: jdbc teradata airflow


【解决方案1】:

在连接页面中输入多个 jar 的适当方法是用逗号分隔两个完全限定路径,就像您在上面所做的那样。

我可以确认这是我采用的方法并且它有效(Airflow 10.1.1 和 10.1.2)。

见:https://github.com/apache/airflow/blob/master/airflow/hooks/jdbc_hook.py#L51

奖励:如果您在 Data Profiling 中使用 Ad Hoc Query 进行测试,您会注意到发送 SELECT 语句时会出错,因为 Airflow 将其包装在 TD 不支持的 LIMIT 子句中.

【讨论】:

    【解决方案2】:

    我的团队成员提供的解决方案是将两个 jar 合并到一个 jar 文件中。完成并在驱动程序路径中指示新的 jar 文件后,它按预期工作。

    这里是 JAR 文件的链接:https://github.com/alexisrolland/linux-setup/blob/master/teradataDriverJdbc.jar

    这是一个在SQLSensor 任务中使用连接的代码 sn-p 示例:

    CheckRunningBatch = SqlSensor(
      task_id='check_running_batch',
      conn_id='ed_data_quality_edw_dev',
      sql="SELECT CASE WHEN MAX(BATCH_KEY) IS NOT NULL THEN 0 ELSE 1 END FROM DATABASE.AUDIT_BATCH WHERE STATUS_KEY=1;",
      poke_interval=300,
      dag=dag)
    

    【讨论】:

    • Alexis,您介意将两个 TD 驱动程序合并为一个的步骤吗?我这里没有设置 java 环境,并且已经在网上尝试这样做了....
    • @XiushiLe 抱歉回复晚了。我不知道 JAR 文件是如何合并的,但如果您想使用它,我已经在此处发布了合并版本:github.com/alexisrolland/linux-setup/blob/master/…
    • 您能否通过包含如何使用 conn_id 来扩展您的示例代码?我不确定如何为 Teradata 创建自定义运算符。
    • @XiushiLe 我不确定是否可以在自定义运算符中使用 Airflow 连接,您可能需要谷歌一下。我在上面发布了一个示例,如何在 SQLSensor 运算符中使用连接。您只需要在操作员参数中提供conn_id。如果你想在你的代码中创建一个自定义连接,你也可以这样做:stackoverflow.com/questions/42599411/…
    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 2014-01-26
    • 2019-06-02
    • 2014-04-08
    • 1970-01-01
    • 2021-03-15
    • 2017-07-24
    • 2015-01-10
    相关资源
    最近更新 更多