2016-10-30 2 views
1

ich spark 1.3.0 bin mit dem mit CDH 5.4.0 vmJDBC nicht in PySpark arbeitet

vorgesehen Ich versuche, das Code-Snippet für das Ausführen von Abfragen auf pyspark über JDBC Ich bin nicht in der Lage zu verbinden, mit einem von ihnen zu laufen:

1) pyspark --driver-class-path /usr/share/java/mysql-connector-java.jar 

2) os.environ['SPARK_CLASSPATH'] = "usr/share/java/mysql-connector-java.jar" 

In beiden Fällen, wenn ich diese Anweisung ausführen:

dept1 = sqlContext.load(source="jdbc", url="jdbc_url", dbtable="departments") 

ich immer bin Fehler:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/spark/python/pyspark/sql/context.py", line 482, in load 
    df = self._ssql_ctx.load(source, joptions) 
    File "/usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py", 
    line 538, in __call__ 
    File "/usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py", 
    line 300, in get_return_value 
py4j.protocol.Py4JJavaError: An error occurred while calling o25.load. 
: java.lang.StringIndexOutOfBoundsException: String index out of range: 10 
    at java.lang.String.substring(String.java:1907) 
    at org.apache.spark.sql.jdbc.DriverQuirks$.get(DriverQuirks.scala:52) 
    at org.apache.spark.sql.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:93) 
    at org.apache.spark.sql.jdbc.JDBCRelation.<init>(JDBCRelation.scala:125) 
    at org.apache.spark.sql.jdbc.DefaultSource.createRelation(JDBCRelation.scala:114) 
    at org.apache.spark.sql.sources.ResolvedDataSource$.apply(ddl.scala:290) 
    at org.apache.spark.sql.SQLContext.load(SQLContext.scala:679) 
    at org.apache.spark.sql.SQLContext.load(SQLContext.scala:667) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231) 
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379) 
    at py4j.Gateway.invoke(Gateway.java:259) 
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133) 
    at py4j.commands.CallCommand.execute(CallCommand.java:79) 
    at py4j.GatewayConnection.run(GatewayConnection.java:207) 
    at java.lang.Thread.run(Thread.java:745) 
+0

Was die tatsächliche JDBC-URL Sie verwenden, ist in der gleichen Region durchgeführt werden müssen –

+0

jdbc_url =." Jdbc: mysql: //quickstart.cloudera : 3306/retail_db? Benutzer = retail_dba & passwort = cloudera " – AJm

Antwort

0

Try --jars /usr/share/java/mysql-connector-java.jar Schalter hinzuzufügen. Warum Sie den Pfad der Treiberklasse angeben, legen Sie das Jar nur auf den Treiber und nicht auf die Worker fest. --jars schickt es ihnen auch.

0

Der Fehler ist auf fehlende Abhängigkeiten zurückzuführen. Haben Sie darüber nachgedacht, stattdessen redshift-spark zu verwenden?

über Rotverschiebung Funken zu verbinden, überprüfen Sie, ob Sie diese JAR-Dateien in den Funken Home-Verzeichnis haben:

  1. Funken redshift_2.10-3.0.0-preview1.jar
  2. RedshiftJDBC41-1.1. 10.1010.jar
  3. hadoop-aws-2.7.1.jar
  4. aws-java-sdk-1.7.4.jar
  5. (aws-java-sdk-s3-1.11.60.jar) (neuere Version aber nicht alles hat damit funktioniert)

diese JAR-Dateien in $ SPARK_HOME Put/Gläser/und dann Funken beginnen

pyspark --jars $SPARK_HOME/jars/spark-redshift_2.10-3.0.0-preview1.jar,$SPARK_HOME/jars/RedshiftJDBC41-1.1.10.1010.jar,$SPARK_HOME/jars/hadoop-aws-2.7.1.jar,$SPARK_HOME/jars/aws-java-sdk-s3-1.11.60.jar,$SPARK_HOME/jars/aws-java-sdk-1.7.4.jar 

(SPARK_HOME sollte = "/ usr/local/Keller/Apache-Funken/$ SPARK_VERSION/libexec")

Dies wird Spark mit allen notwendigen Abhängigkeiten ausführen. Beachten Sie, dass Sie auch den Authentifizierungstyp 'forward_spark_s3_credentials' = True angeben müssen, wenn Sie awsAccessKeys verwenden.

from pyspark.sql import SQLContext 
from pyspark import SparkContext 

sc = SparkContext(appName="Connect Spark with Redshift") 
sql_context = SQLContext(sc) 
sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", <ACCESSID>) 
sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", <ACCESSKEY>) 

df = sql_context.read \ 
    .format("com.databricks.spark.redshift") \ 
    .option("url", "jdbc:redshift://example.coyf2i236wts.eu-central- 1.redshift.amazonaws.com:5439/agcdb?user=user&password=pwd") \ 
    .option("dbtable", "table_name") \ 
    .option('forward_spark_s3_credentials',True) \ 
    .option("tempdir", "s3n://bucket") \ 
    .load() 

Häufige Fehler danach sind:

  • Redshift Connection Error: "SSL off"
    • Lösung: .option("url", "jdbc:redshift://example.coyf2i236wts.eu-central- 1.redshift.amazonaws.com:5439/agcdb?user=user&password=pwd?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory")
  • S3 Fehler: Wenn die Daten Entladen, z.B. Nach df.show() erhalten Sie die Meldung: "Der Bucket, auf den Sie zugreifen möchten, muss über den angegebenen Endpunkt angesprochen werden. Bitte senden Sie alle zukünftigen Anfragen an diesen Endpunkt."
    • Lösung: Der Eimer & Cluster
Verwandte Themen