2016-07-11 81 views
1

我想星火與亞馬遜紅移連接,但我得到這個錯誤:星火紅移與Python

enter image description here

我的代碼如下:

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() 

回答

-1

我覺得s3n://網址風格已被棄用和/或刪除。

嘗試將您的密鑰定義爲​​。

+0

謝謝,我試圖改變它,但我仍然有同樣的錯誤 – Aguid

0

如果你正在使用databricks,我覺得你沒有創建一個新的SQL上下文,因爲他們爲你做的只需要使用sqlContext,嘗試使用此代碼:

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 \ ....... 

也許桶未安裝

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

我認爲你需要添加.format("com.databricks.spark.redshift")到您的通話sql_context.read;我的預感是Spark不能推斷出這個數據源的格式,所以你需要明確指定我們應該使用spark-redshift連接器。

有關此錯誤的更多細節,請參見https://github.com/databricks/spark-redshift/issues/230

1

的錯誤是由於缺少依賴。

請確認您有火花的主目錄這些jar文件:

  1. 火花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)(較新的版本,但不是所有的東西都可以使用它)

把這些jar文件在$ SPARK_HOME /瓶/然後啓動火花

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應該是= 「在/ usr /本地/庫/ Apache的火花/ $ SPARK_VERSION/libexec目錄」)

這將運行Spark以及所有必需的依賴項。請注意,如果您使用的是awsAccessKeys,您還需要指定認證類型'forward_spark_s3_credentials'= True。

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() 

常見錯誤之後有:

  • 紅移連接錯誤: 「SSL斷開」
    • 解決方案: .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錯誤:當卸載數據,例如在df之後。show()會得到以下消息:「您嘗試訪問的存儲桶必須使用指定的端點進行尋址,請將所有未來的請求發送到此端點。」
    • 解決方案:桶&羣集必須相同區域
3

這裏是用於連接到紅移一個循序漸進的過程中運行。

  • 下載紅移連接器文件。試試下面的命令
wget "https://s3.amazonaws.com/redshift-downloads/drivers/RedshiftJDBC4-1.2.1.1001.jar" 
  • 保存在一個Python文件下面的代碼和 相應的更換憑證(您想運行的.py)。
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() 
  • 運行火花提交類似下面
spark-submit --packages com.databricks:spark-redshift_2.10:0.5.0 --jars RedshiftJDBC4-1.2.1.1001.jar test.py