2016-07-11 7 views
1

Ich versuche Funken mit amazon Redshift zu verbinden, aber ich bin immer diese Fehlermeldung:Spark-Redshift mit Python

enter image description here

Mein Code ist wie folgt:

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 \ 
    .option("url", "jdbc:redshift://example.coyf2i236wts.eu-central- 1.redshift.amazonaws.com:5439/agcdb?user=user&password=pwd") \ 
    .option("dbtable", "table_name") \ 
    .option("tempdir", "bucket") \ 
    .load() 

Antwort

-1

ich denke, die s3n:// Der URL-Stil wurde veraltet und/oder entfernt.

Versuchen Sie, Ihre Schlüssel als "fs.s3.awsAccessKeyId" zu definieren.

+0

Danke, habe ich versucht, es zu ändern, aber ich habe immer noch die gleichen Fehler – Aguid

0

wenn Sie databricks verwenden, ich glaube, Sie müssen nicht einen neuen SQL-Kontext erstellt werden, weil sie das für Sie nur SqlContext verwenden müssen, mit diesem Code versuchen:

from pyspark.sql import SQLContext 
    sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", "YOUR_KEY_ID") 
    sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", "YOUR_SECRET_ACCESS_KEY") 

df = sqlContext.read \ ....... 

Vielleicht ist der Eimer nicht

montiert
dbutils.fs.mount("s3a://%s:%[email protected]%s" % (ACCESS_KEY, ENCODED_SECRET_KEY, AWS_BUCKET_NAME), "/mnt/%s" % MOUNT_NAME) 
-1

ich denke, dass Sie .format("com.databricks.spark.redshift") zu Ihrem sql_context.read Anruf hinzufügen müssen; Ich bin überzeugt, dass Spark das Format für diese Datenquelle nicht ableiten kann, also müssen Sie explizit angeben, dass wir den spark-redshift Connector verwenden sollen.

Weitere Einzelheiten zu diesem Fehler finden https://github.com/databricks/spark-redshift/issues/230

1

Der Fehler zu fehlenden Abhängigkeiten zurückzuführen ist.

Stellen Sie sicher, dass Sie diese JAR-Dateien in der 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, was mit ihm gearbeitet hat)

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

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") beginnen

Dadurch wird Spark mit allen notwendigen Abhängigkeiten ausgeführt. 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() Sie erhalten die Nachricht: "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 muss zum Verbinden mit Rotverschiebung
3

Hier ist ein Schritt für Schritt-Prozess innerhalb der gleichen Region ausgeführt werden.

  • Laden Sie die Redshift-Connector-Datei herunter. versuchen, die unter Befehl
wget "https://s3.amazonaws.com/redshift-downloads/drivers/RedshiftJDBC4-1.2.1.1001.jar" 
  • den Code unten in einer Python-Datei speichern (Py, die Sie ausführen möchten) und die Anmeldeinformationen entsprechend ersetzen.
from pyspark.conf import SparkConf 
from pyspark.sql import SparkSession 

#initialize the spark session 
spark = SparkSession.builder.master("yarn").appName("Connect to redshift").enableHiveSupport().getOrCreate() 
sc = spark.sparkContext 
sqlContext = HiveContext(sc) 

sc._jsc.hadoopConfiguration().set("fs.s3.awsAccessKeyId", "<ACCESSKEYID>") 
sc._jsc.hadoopConfiguration().set("fs.s3.awsSecretAccessKey", "<ACCESSKEYSECTRET>") 


taxonomyDf = sqlContext.read \ 
    .format("com.databricks.spark.redshift") \ 
    .option("url", "jdbc:postgresql://url.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") \ 
    .option("dbtable", "table_name") \ 
    .option("tempdir", "s3://mybucket/") \ 
    .load() 
  • laufen die Funken einreichen wie unter
spark-submit --packages com.databricks:spark-redshift_2.10:0.5.0 --jars RedshiftJDBC4-1.2.1.1001.jar test.py