2016-04-08 7 views
3

Ich versuche, JDBC in Spark zu verwenden, um aus einer MS SQL-Tabelle (in Azure) zu lesen und es als eine Parkett-Datei (entweder lokal oder S3) zu speichern. Ich habe das lokal arbeiten, aber ich kann es nicht funktionieren, wenn Spark auf EC2 ist.Hinzufügen von JDBC-Treiber zu PySpark beim Start ohne Konfigurationsdatei

Meine lokale Version funktioniert, weil ich manuell mein Funken defaults.conf Datei geöffnet und dieses Add **:

spark.driver.extraClassPath /Users/<my_user>/spark-1.6.1-bin-hadoop2.4/lib/postgresql-9.4.1208.jre6.jar:/Users/<my_user>/spark-1.6.1-bin-hadoop2.4/lib/sqljdbc4.jar 

** I nur für diesen speziellen Anwendungsfall mssql brauchen

Mit EC2 I versucht, die folgenden Aktionen ausführen: ich mache das

wget https://download.microsoft.com/download/0/2/A/02AAE597-3865-456C-AE7F-613F99F850A8/sqljdbc_6.0.7130.100_enu.tar.gz 

tar -xf sqljdbc_6.0.7130.100_enu.tar.gz 

ls 

./spark/bin/pyspark --packages com.databricks:spark-csv_2.11:1.2.0 --driver-class-path "/root/sqljdbc_6.0/enu/sqljdbc4.jar" 

Dann aus Python:

sqlserver_user = <my_sql_user> 
sqlserver_pw = <my_sql_pw> 

sqlserver_<my_database>_url = "jdbc:sqlserver://<my_server>.cloudapp.net:<port_num>;DatabaseName=<my_db>;user=<my_user>;password=<my_password>;" 

my_jdbc_test = sqlContext.load(
    source="jdbc", 
    url=sqlserver_<my_database>_url, 
    dbtable=<my_table> 
    ) 

my_jdbc_test.printSchema() 

Die my_jdbc_test.printSchema() korrekt angezeigt, das Schema:

>>> my_jdbc_test.printSchema() 
root 
|-- my_var1: string (nullable = true) 
|-- my_var2: string (nullable = true) 
|-- my_var3: string (nullable = false) 

>>> 

Doch wenn ich versuche, es zu meiner lokalen Festplatte als Parkett-Datei ich einen Treiber Fehler erhalten zu speichern:

my_jdbc_test.write.save("my_jdbc_test", format="parquet") 

No suitable driver found for jdbc:sqlserver://<my_server>.cloudapp.net:<port_num>;DatabaseName=<my_db>;user=<my_user>;password=<my_password>; 

Da es richtig angezeigt das Schema ich nehme an, es ist das jar wurde dem Master hinzugefügt, aber vielleicht ist die Quelle des Fehlers, es wird nicht zu den Arbeiter Knoten hinausgeschoben? Ich suchte eine Tonne und konnte nichts finden.

Vielen Dank im Voraus.

+0

Können Sie versuchen: my_jdbc_test.write.save ("my_jdbc_test.parquet", format = "Parkett")? –

Antwort

0

Nach den Informationen zum Problem wurde durch den SQL-Datenbanktreiber & Verbindungszeichenfolge verursacht. Der jdbc-Treiber & Verbindungszeichenfolge wird für Java verwendet, nicht für Python.

Sie müssen also den odbc-Treiber und die Verbindungszeichenfolge für Python verwenden. Bitte versuchen Sie, das Python-Paket für den Zugriff auf die SQL-Datenbank über das Dokument http://pymssql.org/en/stable/ zu installieren.

Die Verbindungszeichenfolge für ODBC mit Python ist wie folgt.

Driver={SQL Server Native Client 10.0};Server=tcp:<your-server>.database.windows.net,1433;Database=<my_db>;Uid=<your-username>@<your-server>;Pwd={your_password_here};Encrypt=yes;Connection Timeout=30;

Wenn Sie die JDBC-Treiber und Verbindungszeichenfolge verwenden, können Sie versuchen, das Dokument zu verweisen Databases and Jython: Object Relational Mapping and Using JDBC in Jython statt mit Python.

Jede Sorge, bitte zögern Sie nicht, lassen Sie es mich wissen.

+0

Hallo @ Peter, danke für die Antwort. –

+0

Ich bin verwirrt von Ihrer Antwort, weil die JDBC einwandfrei funktioniert, wenn ich die Konfigurationsdatei modifiziere (z. B. mein lokales Beispiel oben); Ich versuche nur während der Initialisierung über die Kommandozeile darauf zu zeigen und nicht über die Konfigurationsdatei. Für mich ist das keine JDBC-Frage, weil das alles gut geht. Dies ist eine PySpark-Initialisierungsfrage: Wie zeige ich beim Startvorgang auf eine JAR-Datei, die den JDBC-Treiber an alle Knoten liefert? Ich habe den Treiber am Master arbeiten oder das 'printSchema()' würde nicht funktionieren. –

Verwandte Themen