Драйверы CDH4, Sqoop2 и JDBC: не найден подходящий драйвер

Я пытаюсь использовать Sqoop 2 для импорта данных из базы данных MySQL в HDFS, в основном следуя инструкциям здесь. Однако сервер Sqoop не может подключиться к базе данных MySQL из-за того, что не найдены соответствующие драйверы.

Настраивать:

Вот некоторая предыстория моей установки:

  1. Кластер Hadoop: у меня есть кластер Hadoop из трех машин, на котором работает CDH 4.4.0. Sqoop 2 был настроен через Cloudera Manager и работает на том же компьютере, что и Namenode. Я разрабатываю на компьютере с Windows, где также находится моя база данных MySQL. Кластер Hadoop представляет собой набор из трех машин Ubuntu Server.

  2. База данных MySQL: у меня есть база данных MySQL, работающая на моей машине с Windows, и я проверил, что к базе данных MySQL можно получить доступ с каждой из машин в моем кластере Hadoop.

  3. Клиентское приложение. Мое клиентское приложение представляет собой проект Eclipse на моем компьютере с Windows, который в основном открывает клиент 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

Диагноз:

Соответствующие драйверы JDBC (mysql-connector-java-5.1.26-bin.jar) являются частью моего проекта Eclipse, и на всякий случай я добавил их в папку библиотеки sqoop2.

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

также. Однако это та часть, в которой я не уверен, поскольку в документации CDH4 говорится]1 что в случае, если Sqoop был установлен с помощью Cloudera Manager, местоположение соответствующего драйвера JDBC следует добавить в HADOOP_CLASSPATH. Так я и сделал

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

на моем Hadoop Namenode, так что эхо $HADOOP_CLASSPATH дает /usr/lib/jdbcJars. Опять же, я не совсем уверен в полезности этого, поскольку мое клиентское приложение не разрабатывается в кластере Hadoop.

Последнее, что я еще не пробовал, — это создание нового каталога /usr/lib/sqoop/lib и добавление туда драйвера JDBC.

Любая помощь в выяснении этого будет оценена по достоинству.


person tchakravarty    schedule 27.10.2013    source источник
comment
JAR-файл драйвера должен содержать среди прочих файлов файл com/mysql/jdbc/Driver.class. Убедитесь, что он содержит этот файл.   -  person Robin Green    schedule 27.10.2013
comment
@RobinGreen Ну, я посмотрел папку src для банки, и она содержит файл Driver.java. Будет ли это делать?   -  person tchakravarty    schedule 27.10.2013
comment
Откройте саму банку, чтобы быть уверенным. Это просто zip-файл, и в любом случае Eclipse также может открывать файлы jar.   -  person Robin Green    schedule 27.10.2013
comment
@RobinGreen Действительно.   -  person tchakravarty    schedule 27.10.2013


Ответы (2)


Никогда не изменяйте содержимое каталога посылок (/opt/cloudera/parcels/*). Всегда есть разные способы настройки компонентов. Например, на основе официальной документации, вам необходимо скопировать драйвер MySQL JDBC в каталог /var/lib/sqoop2 на узле, где вы используете сервер Sqoop2.

person Jarek Jarcec Cecho    schedule 30.10.2013
comment
На самом деле мне пришлось это сделать, и это, по-видимому, ожидаемо, как указано в файле sqoop2-server в /opt/cloudera/parcels/CDHxxxxxxxxxxx/etc/default, поскольку я использую MRv1, а не YARN, и это нужно указать sqoop2. - person tchakravarty; 30.10.2013
comment
Я не согласен с тем, что это необходимо, размещение файлов jar JDBC в /var/lib/sqoop2 работает для меня просто отлично — проверьте соответствующий код, который загружает JAR из этого места: github.com/cloudera/cdh- пакет/blob/cdh4-0.6.0_4.4.0/ - person Jarek Jarcec Cecho; 31.10.2013
comment
Хорошо, я понимаю вашу точку зрения. Возможно, я одновременно внес эти изменения, и простое размещение драйвера JDBC в нужном месте решило мою проблему. Все еще думаю, что внесение изменений в файл sqoop2-server было необходимо. :) - person tchakravarty; 31.10.2013
comment
Спасибо за полезный совет. /var/lib/sqoop2 это правильное место. Если какой-либо драйвер jdbc будет скопирован в /opt/cloudera/parcels, он будет удален после перезапуска sqoop2. - person stanleyxu2005; 15.09.2014

поместите драйвер mysql-jdbc в каталог:

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

и перезапустите сервер sqoop2

person cwalet    schedule 27.02.2014