CDH4,Sqoop2和JDBC驱动程序:找不到合适的驱动程序

时间:2013-10-27 12:29:01

标签: java mysql jdbc hadoop sqoop

我正在尝试使用Sqoop 2将数据从MySQL数据库导入HDFS,基本上遵循here的说明。但是,由于找不到合适的驱动程序,Sqoop服务器无法建立与MySQL数据库的连接。

设定:

以下是我的设置背景:

  1. Hadoop集群:我有一台运行CDH 4.4.0的三机Hadoop集群。 Sqoop 2是通过Cloudera Manager配置的,并且与Namenode在同一台机器上运行。 我正在开发一台Windows机器,这也是我的MySQL数据库所在的地方。 Hadoop集群是一组三台Ubuntu Server计算机。

  2. MySQL数据库:我的Windows机器上运行了一个MySQL数据库,我检查过可以从我的Hadoop集群中的每台机器上访问MySQL数据库。

  3. 客户端应用程序:我的客户端应用程序是我的Windows机器上的一个Eclipse项目,它基本上打开了一个对应于Sqoop服务器的Sqoop客户端(我已经验证了Sqoop服务器和客户端正在我的Namenode上运行)。 / p>

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

    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());
    
            }
    
        }
    } 
    

    错误:

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

    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)是我的Eclipse项目的一部分,为了更好地衡量,我已将其添加到sqoop2 lib文件夹

    /opt/cloudera/parcels/CDH-4.4.0-1.cdh4.4.0.p0.39/lib/sqoop2/client-lib
    

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

    export HADOOP_CLASSPATH=/usr/lib/jdbcJars:HADOOP_CLASSPATH;
    

    在我的Hadoop Namenode上,以便echo $HADOOP_CLASSPATH给出/usr/lib/jdbcJars。同样,由于我的客户端应用程序尚未在Hadoop集群上开发,因此我不完全确定其实用性。

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

    任何帮助解决这个问题都将不胜感激。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

将mysql-jdbc-driver放入目录:

/usr/lib/sqoop2/webapps/sqoop/WEB-INF/lib/mysql-connector-java-5.1.25.jar

并重新启动sqoop2服务器