通过 Oozie sqoop 访问 Vertica 数据库

Accessing Vertica Database through Oozie sqoop

我编写了一个 Oozie 工作流来通过 Sqoop 访问 HP Vertica 数据库。这是在 Cloudera VM 上。 运行ning 后,我在 Yarn 日志中收到以下错误:

     RROR sqoop.Sqoop: Got exception running Sqoop:    java.lang.RuntimeException:        Could not load db driver class: dbDriver
     java.lang.RuntimeException: Could not load db driver class: dbDriver
     at org.apache.sqoop.manager.SqlManager.makeConnection(SqlManager.java:848)
     at org.apache.sqoop.manager.GenericJdbcManager.getConnection(GenericJdbcManager.java:52)
     at org.apache.sqoop.tool.EvalSqlTool.run(EvalSqlTool.java:64)
     at org.apache.sqoop.Sqoop.run(Sqoop.java:143)
     at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
     at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:179)
     at org.apache.sqoop.Sqoop.runTool(Sqoop.java:218)
     at org.apache.sqoop.Sqoop.runTool(Sqoop.java:227)"

This is a snippet from the jobprops file:
      "dbDriver=com.vertica.jdbc.Driver
     dbHost=host***.assist.*** 
     dbName=vertica247
     dbPassword=*****
     dbPort=5433
     dbSchema=simod_chat
     dbStagingSchema=simodstg_chat
     dbUser=vertica"

我应该为 --connection-manager 指定什么?当我 运行 在 VM 外部执行相同的工作流时,它 运行 没有连接管理器参数?

如错误所述:

Could not load db driver class: dbDriver

可能有两个问题:

  1. JDBCURL可能不正确
  2. JDBC Jar 需要包含在工作流程中

对于 JDBC URL,确保它看起来像这样:

jdbc:vertica://VerticaHost:portNumber/databaseName

对于 JDBC jar,它需要包含在工作流程中。查看 this article 以获取有关如何使用 HBase 执行此操作的简短示例。 TLDR:当您 运行 通过 oozie Sqoop 时,您必须在工作流程中包含驱动程序:

<workflow-app name="sqoop-import" xmlns="uri:oozie:workflow:0.4">
  <start to="sqoop-import"/>
  <action name="sqoop-import">
    <sqoop xmlns="uri:oozie:sqoop-action:0.2">
      <job-tracker>${jobTracker}</job-tracker>
      <name-node>${nameNode}</name-node>
      <command>import --connect jdbc:vertica://VerticaHost:portNumber/databaseName --username test --password test --table test</command>
      <file>/user/admin/vertica-jdbc.jar#vertica-jdbc.jar</file>
    </sqoop>
    <ok to="end"/>
    <error to="kill"/>
  </action>
  <kill name="kill">
    <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
  </kill>
  <end name="end"/>
</workflow-app>

注意这一行:

<file>/user/admin/vertica-jdbc.jar#vertica-jdbc.jar</file>

它将自动包含在您的 sqoop 作业中。