Java SQOOP SQLSERVER 无法加载驱动程序“未设置适当的连接管理器”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19597328/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 18:38:25  来源:igfitidea点击:

SQOOP SQLSERVER Failed to load driver " appropriate connection manager is not being set"

javasql-serverjdbchadoopsqoop

提问by hba

I downloaded sqljdbc4.jar. I'm invoking sqooplike so from the folder (where the jar is stored):

我下载了sqljdbc4.jar。我正在sqoop从文件夹(存储 jar 的位置)中这样调用:

sqoop list-tables --driver com.microsoft.jdbc.sqlserver.SQLServerDriver --connect jdbc:sqlserver://localhost:1433;user=me;password=myPassword; -libjars=./sqljdbc4.jar

sqoop list-tables --driver com.microsoft.jdbc.sqlserver.SQLServerDriver --connect jdbc:sqlserver://localhost:1433;user=me;password=myPassword; -libjars=./sqljdbc4.jar

I'm getting the following warning & error:

我收到以下警告和错误:

13/10/25 18:38:13 WARN sqoop.ConnFactory: Parameter --driver is set to an explicit driver however appropriate connection manager is not being set (via --connection-manager). Sqoop is going to fall back to org.apache.sqoop.manager.GenericJdbcManager. Please specify explicitly which connection manager should be used next time.

13/10/25 18:38:13 WARN sqoop.ConnFactory: Parameter --driver is set to an explicit driver however appropriate connection manager is not being set (via --connection-manager). Sqoop is going to fall back to org.apache.sqoop.manager.GenericJdbcManager. Please specify explicitly which connection manager should be used next time.

13/10/25 18:38:13 INFO manager.SqlManager: Using default fetchSize of 1000
13/10/25 18:38:13 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.RuntimeException: Could not load db driver class: com.microsoft.jdbc.sqlserver.SQLServerDriver
java.lang.RuntimeException: Could not load db driver class: com.microsoft.jdbc.sqlserver.SQLServerDriver
    at org.apache.sqoop.manager.SqlManager.makeConnection(SqlManager.java:727)
    at org.apache.sqoop.manager.GenericJdbcManager.getConnection(GenericJdbcManager.java:52)
    at org.apache.sqoop.manager.SqlManager.listTables(SqlManager.java:418)
    at org.apache.sqoop.tool.ListTablesTool.run(ListTablesTool.java:49)
    at org.apache.sqoop.Sqoop.run(Sqoop.java:145)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:181)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:220)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:229)
    at org.apache.sqoop.Sqoop.main(Sqoop.java:238)

UPDATE

更新

I changed the command line to reflect the comments below, I get the same error:

我更改了命令行以反映下面的注释,但出现相同的错误:

sqoop list-databases -libjars=<ABSOLUTE_PATH>/jars/sqljdbc4.jar --connect jdbc:sqlserver://localhost:1433;user=me;password=password

sqoop list-databases -libjars=<ABSOLUTE_PATH>/jars/sqljdbc4.jar --connect jdbc:sqlserver://localhost:1433;user=me;password=password

13/10/28 17:00:33 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.RuntimeException: Could not load db driver class: com.microsoft.sqlserver.jdbc.SQLServerDriver
java.lang.RuntimeException: Could not load db driver class: com.microsoft.sqlserver.jdbc.SQLServerDriver
    at org.apache.sqoop.manager.SqlManager.makeConnection(SqlManager.java:727)
    at org.apache.sqoop.manager.GenericJdbcManager.getConnection(GenericJdbcManager.java:52)
    at org.apache.sqoop.manager.CatalogQueryManager.listDatabases(CatalogQueryManager.java:57)
    at org.apache.sqoop.tool.ListDatabasesTool.run(ListDatabasesTool.java:49)
    at org.apache.sqoop.Sqoop.run(Sqoop.java:145)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:181)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:220)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:229)
    at org.apache.sqoop.Sqoop.main(Sqoop.java:238)

When I look at the listing of sqljdbc4.jar, I do see the class in that path... Is it possible that libjars optionisn't doing what I think it is supposed to do?

当我查看 的列表时sqljdbc4.jar,我确实看到了该路径中的类......是否有可能libjars option没有做我认为应该做的事情?

回答by Mark Rotteveel

According to this sqoop documentation, generic options like -libjarsmust come beforetool-specific options:

根据此 sqoop 文档,通用选项-libjars必须特定工具的选项之前出现

Generic Hadoop command-line arguments:
(must preceed any tool-specific arguments)
...
-libjars <comma separated list of jars>specify comma separated jar files to include in the classpath.

通用 Hadoop 命令行参数:(
必须在任何特定于工具的参数之前)
...
-libjars <comma separated list of jars>指定要包含在类路径中的逗号分隔 jar 文件。

回答by Jarek Jarcec Cecho

In vast majority of cases using parameter --driveris not required and even more will lead to an undesirable behaviour. I would strongly recommend dropping this argument entirely from your command line. Check out Connectors vs Driversblog post for more details.

在绝大多数情况下,--driver不需要使用参数,甚至更多会导致不良行为。我强烈建议您完全从命令行中删除此参数。查看连接器与驱动程序博客文章了解更多详细信息。

Also in addition you are specifying a nonexistent JDBC Driver class. The correct one is:

此外,您还指定了一个不存在的 JDBC Driver 类。正确的一种是:

com.microsoft.sqlserver.jdbc.SQLServerDriver

You can see it in the official docs, whereas you are specifying

您可以在官方文档中看到它,而您正在指定

com.microsoft.jdbc.sqlserver.SQLServerDriver

Notice the different order of jdbcand sqlserverpackages. This is one of the reasons why it's recommended to not use the --driveroption at all.

注意jdbcsqlserver包的不同顺序。这是建议根本不使用该--driver选项的原因之一。

回答by Kuntal-G

You need to put sqljdbc4.jarin $SQOOP_HOME/liband also add sqoop-1.4.4.jaror whatever version you are using along with sqljdbc4.jarto $HADOOP_HOME/lib.

你需要把sqljdbc4.jar$SQOOP_HOME/lib,也可以添加sqoop-1.4.4.jar或任何版本使用的是随sqljdbc4.jar$HADOOP_HOME/lib

I'm using Hadoop-2.2.0, so i put it inside $HADOOP_HOME/share/hadoop/common/libdirectory, and use the following command to do the import:

我正在使用Hadoop-2.2.0,所以我把它放在$HADOOP_HOME/share/hadoop/common/lib目录中,并使用以下命令进行导入:

export HCAT_HOME=/home/Kuntal/BIG_DATA/hive-0.12.0/hcatalog

export HCAT_HOME=/home/Kuntal/BIG_DATA/hive-0.12.0/hcatalog

(sometimes HCatlogof Hive needs to be exported or set.)

(有时HCatlog需要对 Hive 进行exported 或set.)

./sqoop-import --connect "jdbc:sqlserver://IP\INSTANCE;port=1433;username=USERNAME;password=PASSWORD;database=DATABASE_NAME" --table TABLE_NAME --target-dir hdfs://localhost:50315/sqoop --m 1

./sqoop-import --connect "jdbc:sqlserver://IP\INSTANCE;port=1433;username=USERNAME;password=PASSWORD;database=DATABASE_NAME" --table TABLE_NAME --target-dir hdfs://localhost:50315/sqoop --m 1

Sometimes you have to specify the port, otherwise default works. Hope you find it useful.

有时您必须指定端口,否则默认工作。希望你觉得它有用。