首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CDH4、Sqoop2和JDBC驱动程序:找不到合适的驱动程序

问CDH4、Sqoop2和JDBC驱动程序:找不到合适的驱动程序
EN

Stack Overflow用户
提问于 2013-10-27 12:29:01
回答 2查看 3.4K关注 0票数 1

我试图使用Sqoop 2将数据从MySQL数据库导入到HDFS,基本上遵循这里指令。但是,由于找不到适当的驱动程序,Sqoop服务器无法连接到MySQL数据库。

设置:

以下是我的设置背景:

  1. Hadoop集群:我有一个运行CDH4.4.0的三台机器Hadoop集群。Sqoop 2是通过Cloudera Manager配置的,并且运行在与Namenode相同的机器上。我正在一台Windows机器上进行开发,这也是我的MySQL数据库所在的地方。Hadoop集群由三台Ubuntu机器组成。
  2. MySQL数据库:我有一个运行在MySQL机器上的MySQL数据库,我已经检查了是否可以从MySQL集群中的每台机器访问MySQL数据库。
  3. 客户端应用程序:我的客户端应用程序是Windows机器上的一个Eclipse项目,它基本上打开了一个与Sqoop服务器相对应的Sqoop客户机(我已经验证了Sqoop服务器和客户机正在我的Namenode上运行)。

这里是我的客户端应用程序的主要类。

代码语言:javascript
复制
package com.fc.SqoopImport;

import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;

import org.apache.sqoop.client.*;
import org.apache.sqoop.*;
import org.apache.sqoop.common.*;
import org.apache.sqoop.model.*;
import org.apache.sqoop.validation.Status;

import com.mysql.jdbc.*;

public class SqoopImport {
    // utlity function to cycle through the connector and framework forms for errors
    private static void printMessage(List<MForm> formList) {
    for(MForm form : formList) {
      List<MInput<?>> inputlist = form.getInputs();
      if (form.getValidationMessage() != null) {
        System.out.println("Form message: " + form.getValidationMessage());
      }
      for (MInput minput : inputlist) {
        if (minput.getValidationStatus() == Status.ACCEPTABLE) {
          System.out.println("Warning:" + minput.getValidationMessage());
        } else if (minput.getValidationStatus() == Status.UNACCEPTABLE) {
          System.out.println("Error:" + minput.getValidationMessage());
        }
      }
    }
    }

    public static void main(String[] args) throws Exception {
        String driver = "com.mysql.jdbc.Driver";
        Class.forName(driver);

        // location of the server running Sqoop 2 server
        String urlSqoop2Server = "http://fc-01.fc.com:12000/sqoop/";  
        SqoopClient clientSqoop2 = new SqoopClient(urlSqoop2Server);

        // dummy connection object
        MConnection sqoopConnSAP = clientSqoop2.newConnection(1);
        MConnectionForms sqoopConnSAPFrameworkForm = sqoopConnSAP.getFrameworkPart();
        MConnectionForms sqoopConnSAPConnForm = sqoopConnSAP.getConnectorPart();

        sqoopConnSAP.setName("SqoopConnSAP");

        // Set the values for the connection form
        sqoopConnSAPConnForm.getStringInput("connection.connectionString").setValue("jdbc:mysql://192.168.31.172:3306/dbsap");  

        sqoopConnSAPConnForm.getStringInput("connection.jdbcDriver").setValue("com.mysql.jdbc.Driver");
        sqoopConnSAPConnForm.getStringInput("connection.username").setValue("root");
        sqoopConnSAPConnForm.getStringInput("connection.password").setValue("1234");

        sqoopConnSAPFrameworkForm.getIntegerInput("security.maxConnections").setValue(10);

        Status statusConnSAP = clientSqoop2.createConnection(sqoopConnSAP);  

        if(statusConnSAP.canProceed()) {
            System.out.println("Created. New connection ID: " + sqoopConnSAP.getPersistenceId());
        } else {
            System.out.println("Check for status and forms errors.");
            printMessage(sqoopConnSAP.getConnectorPart().getForms());
            printMessage(sqoopConnSAP.getFrameworkPart().getForms());

        }

    }
} 

错误:

运行此项目会出现以下错误:

代码语言:javascript
复制
Check for status and forms errors.
Form message: Can't connect to the database with given credentials: No suitable driver found for jdbc:mysql:192.168.31.172:3306/dbsap
Error:Can't load specified driver

诊断:

适当的JDBC驱动程序(mysql-connector-java-5.1.26-bin.jar)是我的sqoop2项目的一部分,为了更好地衡量,我将其添加到sqoop2 lib文件夹中。

代码语言:javascript
复制
/opt/cloudera/parcels/CDH-4.4.0-1.cdh4.4.0.p0.39/lib/sqoop2/client-lib

也是。但是,这是我不确定的部分,因为CDH4文档说]1,如果Sqoop是使用Cloudera安装的,那么应该将适当的JDBC驱动程序的位置添加到HADOOP_CLASSPATH中。所以,我做了

代码语言:javascript
复制
export HADOOP_CLASSPATH=/usr/lib/jdbcJars:HADOOP_CLASSPATH;

在我的Hadoop上,这样回波$HADOOP_CLASSPATH就会给出/usr/lib/jdbcJars。同样,由于我的客户端应用程序不是在Hadoop集群上开发的,所以我不完全确定它的实用性。

最后一件我还没有尝试的事情是创建一个新的/usr/lib/sqoop/lib目录并在那里添加JDBC驱动程序。

如果你能帮我解决这个问题,我将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2013-10-30 14:30:37

永远不要改变包裹目录的内容(/opt/cloudera/parcels/*)。配置组件的方法总是不同的。例如,基于正式文件,您需要将MySQL JDBC驱动程序复制到运行Sqoop2服务器的节点上的/var/lib/sqoop2 2目录中。

票数 2
EN

Stack Overflow用户

发布于 2014-02-27 02:34:55

将mysql-jdbc驱动程序放入dir:

代码语言:javascript
复制
/usr/lib/sqoop2/webapps/sqoop/WEB-INF/lib/mysql-connector-java-5.1.25.jar

并重新启动sqoop2服务器

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19618028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档