1

基本的にこちらの手順に従って、Sqoop 2 を使用して MySQL データベースから HDFS にデータをインポートしようとしています。ただし、適切なドライバーが見つからないため、Sqoop サーバーは MySQL データベースに接続できません。

設定:

ここに私のセットアップの背景があります:

  1. Hadoop クラスター: CDH 4.4.0 を実行する 3 台のマシンの Hadoop クラスターがあります。Sqoop 2 は Cloudera Manager を介して構成され、Namenode と同じマシンで実行されています。私は、MySQL データベースが存在する場所でもある Windows マシンで開発しています。Hadoop クラスタは、3 台の Ubuntu Server マシンのセットです。

  2. MySQL データベース: Windows マシンで実行している MySQL データベースがあり、Hadoop クラスター内の各マシンから MySQL データベースにアクセスできることを確認しました。

  3. クライアント アプリケーション: 私のクライアント アプリケーションは、基本的に Sqoop サーバーに対応する Sqoop クライアントを開く Windows マシン上の Eclipse プロジェクトです (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 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で、エコー$HADOOP_CLASSPATHが得られるようにします/usr/lib/jdbcJars。繰り返しますが、私のクライアント アプリケーションは Hadoop クラスターで開発されていないため、これが有用かどうかは完全にはわかりません。

まだ試していない最後のことは、新しい/usr/lib/sqoop/libディレクトリを作成し、そこに JDBC ドライバーを追加することです。

これを理解するための助けをいただければ幸いです。

4

2 に答える 2