使用 spark(py)从 amazon redshift 读取数据时出错请求存储桶位置时必须指定存储桶名称参数

Posted

技术标签:

【中文标题】使用 spark(py)从 amazon redshift 读取数据时出错请求存储桶位置时必须指定存储桶名称参数【英文标题】:getting error while reading data from amazon redshift using spark(py)The bucket name parameter must be specified when requesting a bucket's location 【发布时间】:2017-09-28 03:27:05 【问题描述】:

你能帮我用 spark+redshift+data 砖驱动程序,读取数据吗?

现在我在调用读取方法时遇到错误。下面是我的一段代码。

df = spark.read.format("com.databricks.spark.redshift")
    .option("url",redshifturl).option("dbtable", "PG_TABLE_DEF")
    .option("tempdir","s3n://KEY_ID:SECRET_KEY_ID@/S2_BUCKET_NAME/TEMP_FOLDER_UNDER_S3_BUCKET/")
    .option("aws_iam_role","AWS_IAM_ROLE").load()

下面是我收到的错误日志

    IllegalArgumentException: u"The bucket name parameter must be specified when requesting a bucket's location"
---------------------------------------------------------------------------
IllegalArgumentException                  Traceback (most recent call last)
<command-3255625043609925> in <module>()
----> 1 df = spark.read   .format("com.databricks.spark.redshift")   .option("url", redshifturl)   .option("dbtable", "pg_table_def")   .option("tempdir", "s3n://AKIAJXVW3IESJSQUTCUA:kLHR85WfcieNrd7B7Rm/1FK1JU4NeKTrpe8BkLbx@/weatherpattern/temp/")   .option("aws_iam_role", "arn:aws:iam::190137980335:user/user1")  .load()

/databricks/spark/python/pyspark/sql/readwriter.py in load(self, path, format, schema, **options)
    163             return self._df(self._jreader.load(self._spark._sc._jvm.PythonUtils.toSeq(path)))
    164         else:
--> 165             return self._df(self._jreader.load())
    166 
    167     @since(1.4)

/databricks/spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py in __call__(self, *args)
   1131         answer = self.gateway_client.send_command(command)
   1132         return_value = get_return_value(
-> 1133             answer, self.gateway_client, self.target_id, self.name)
   1134 
   1135         for temp_arg in temp_args:

/databricks/spark/python/pyspark/sql/utils.py in deco(*a, **kw)
     77                 raise QueryExecutionException(s.split(': ', 1)[1], stackTrace)
     78             if s.startswith('java.lang.IllegalArgumentException: '):
---> 79                 raise IllegalArgumentException(s.split(': ', 1)[1], stackTrace)
     80             raise
     81     return deco

IllegalArgumentException: u"The bucket name parameter must be specified when requesting a bucket's location"

我认为 s3n 路径存在一些问题,但我在 .option 方法中给出的方式与我的真实凭据看起来是正确的。

任何建议将不胜感激。

谢谢

伊姆兰 :)

--

【问题讨论】:

【参考方案1】:

你的路径 url 不正确,

格式应该是,

s3n://ACCESSKEY:SECRETKEY@bucket/path/to/temp/dir

df = spark.read.format("com.databricks.spark.redshift")
    .option("url",redshifturl).option("dbtable", "PG_TABLE_DEF")
    .option("tempdir","s3n://KEY_ID:SECRET_KEY_ID@S2_BUCKET_NAME/TEMP_FOLDER_UNDER_S3_BUCKET/")
    .option("aws_iam_role","AWS_IAM_ROLE").load()

文档:

https://github.com/databricks/spark-redshift

希望对你有帮助。

【讨论】:

嗨 Kannaiyan,我按照你说的在下面尝试过,但现在显示不同的错误 df = spark.read \ .format("com.databricks.spark.redshift") \ .option(" url", redshifturl) \ .option("dbtable", "pg_table_def") \ .option("tempdir", "s3n://path/for/temp/data")\ .option("aws_iam_role", iamrole)\ .load() Py4JJavaError: 调用 o1684.load 时出错。 : java.lang.NullPointerException 我认为它解决了问题所在。您现在还有更多错误。

以上是关于使用 spark(py)从 amazon redshift 读取数据时出错请求存储桶位置时必须指定存储桶名称参数的主要内容,如果未能解决你的问题,请参考以下文章

从 Apache Spark 分段上传到 Amazon S3

Spark Streaming 检查点到 amazon s3

从 Amazon SQS 馈送 Apache Spark 流?

Spark 和 Amazon S3 未在执行程序中设置凭证

sh 使用Crontab和Amazon EC2上的s3cmd.Red Hat Linux对Amazon S3进行MongoDB自动备份

Amazon s3a 使用 Spark 返回 400 Bad Request