1

我正在尝试使用 Sqoop 2 将数据从 MySQL 数据库导入 HDFS,基本上按照此处的说明进行操作。但是,由于找不到合适的驱动程序,Sqoop 服务器无法连接到 MySQL 数据库。

设置:

这是我的设置的一些背景:

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

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

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

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

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

诊断:

mysql-connector-java-5.1.26-bin.jar适当的JDBC 驱动程序(

/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 上,以便回显$HADOOP_CLASSPATH给出/usr/lib/jdbcJars. 同样,我不完全确定它的实用性,因为我的客户端应用程序不是在 Hadoop 集群上开发的。

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

任何解决此问题的帮助将不胜感激。

4

2 回答 2

2

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

于 2013-10-30T14:30:37.740 回答
0

将 mysql-jdbc-driver 放入目录:

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

并重新启动 sqoop2 服务器

于 2014-02-27T02:34:55.510 回答