当前位置: 首页 > 知识库问答 >
问题:

如何从Spark2.3访问us-east-2区域的parquet文件(使用hadoop aws 2.7)

宋飞文
2023-03-14

我们能够从我们当前的代码访问us-east-1,但是我们不能访问US-East-2上的拼花文件。请注意“US-East-2”连接,创建数据流在intellij上运行良好,但当我们从Spark-Shell尝试时,它会给出400个错误。

我想在星火壳上做工作

/users/test/downloads/spark-2.3.3-bin-hadoop2.7/bin/spark-shell-jars/users/test/downloads/hadoop-aws-2.7.3.jar,/users/test/downloads/aws-java-sdk-1.7.4.jar

val配置=sc.hadoopConfiguration

configuration.set(“fs.s3a.impl.disable.cache”,“true”);

set(“fs.s3a.impl”,“org.apache.hadoop.fs.s3a.s3afilesystem”);

set(“fs.defaultfs”,“s3a://parquet-dev”);

configuration.set(“fs.s3a.endpoint”、“s3.us-east-2.amazonaws.com”)

configuration.set(“fs.s3a.html" target="_blank">access.key”,“xyz”);

配置.设置(“fs.s3a.secret.key”、“abc”);

val fileName=“s3a:/xyz:abc@parquet-dev/c000.snappy.parquet”

val df=spark.sqlcontext.read.Parquet(文件名)

com.amazonaws.services.S3.model.amazons3异常:状态代码:400,AWS服务:Amazon S3,AWS请求ID:asadfas,AWS错误代码:null,AWS错误消息:错误请求

共有2个答案

柳豪
2023-03-14

这是一个简单的更改,但很难在AWS文档或其他任何地方找到

下面是我们所做的更改(可以做特定于语言的代码)

spark-shell \
    --master local[4] \
    --driver-memory 2g \
    --conf 'spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true' \
    --conf 'spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true' \
    --jars aws-java-sdk-1.7.4.jar,hadoop-aws-2.7.7.jar


System.getProperty("com.amazonaws.services.s3.enableV4")

sc.hadoopConfiguration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem");
sc.hadoopConfiguration.set("fs.s3a.access.key", "access")
sc.hadoopConfiguration.set("fs.s3a.secret.key", "secret")
sc.hadoopConfiguration.set("fs.s3a.endpoint", "s3.us-east-2.amazonaws.com")

val fileName = "s3a://parquet123/c000.parquet"
val df = spark.sqlContext.read.parquet(fileName)
df.count

很少有新的s3存储桶只支持签名版本v4支持,除非您指定,否则旧的SDK无法使用

system.getProperty(“com.amazonaws.services.s3.enablev4”)sc.hadoopConfiguration.set(“fs.s3a.endpoint”,“s3.us-east-2.amazonaws.com”)

而且

--conf“spark.executor.extraJavaOptions=-dcom.amazonaws.services.s3.enablev4=true”--conf“spark.driver.extraJavaOptions=-dcom.amazonaws.services.s3.enablev4=true”

System.getProperty(“com.amazonaws.services.s3.enablev4”)非常重要,必须通过指定上面的标志为所有excutor JVM设置。谢谢

许博
2023-03-14
  1. fs.s3a.endpoint是正确的选项;我刚刚验证了它在Hadoop 2.7中
  2. 您不应该将秘密放在文件名URL中,因为它们会在任何地方被记录。
  3. 并且不需要设置fs.defaultfsfs.s3a.impl

“坏请求”是来自亚马逊的一个相当模糊的错误,它意味着某种身份验证问题,没有任何细节。可能需要切换到V4签名,这只能通过JVM属性使用Hadoop-2.7.x/AWS-1.7.xJAR完成。其他堆栈溢出的文章也涉及到这个主题。

如果您试图通过S3A连接器使用S3,最好从升级到Hadoop 2.9 JARs和shaded AWS SDK或2.8.x开始。hadoop-aws代码发生了巨大的变化,最新的aws SDK也带来了很大的变化

 类似资料:
  • 我在us-east-1地区有帐户A,有IAM角色rt-profileRole和我的应用程序设置。帐户B在us-west-1和US-West-2中创建了S3存储桶。 我正在尝试使用aws cli和role RTProfile列出对象。这两个bucket策略都与下面资源相似,具有正确的bucket arn(策略附加到的bucket的bucket arn)。 问题是我可以从我的本地系统中使用aws s3

  • 我正在使用Dropwizard web服务来访问许多parquet文件,我需要使用“真正的”sql(字符串)而不是spark DDL(我已经尝试过了,但没有满足我的需要)。我在独立模式下使用spark从eclipse启动服务。Spark版本是1.4.1。 问题是spark不能解析普通SQL中的parquet引用,如下所示:(我在./bro/conn.parquet中启动web服务的文件夹中有一个测

  • 我在JQuery mobile和Eclipse中的PhoneGap中编写了一个android移动应用程序。在这个应用程序中,我调用jquery ajax来加载来自其他域的数据列表。 我的jQuery ajax调用代码是: 变量“WEBSERVICE\u URL”具有其他域php服务URL。在“pageview”事件上执行上述代码时,我遇到以下错误 有任何解决方案可以从JQuery Mobile P

  • 我们在AWS中有两个区域,每个区域都有一个AWS S3桶。如何使用AWS Java SDK将桶中的文件从一个区域复制到另一个区域? 我们不能访问源区域bucket的凭据,但是我们有源区域bucket中每个文件的源的预签名URL,使用它我们可以下载文件,然后使用AWS上载URL将其上载到目标区域bucket。 编辑: 为了更清楚一些,两个桶都已经创建了,并且这是一个要作为我们代码的一部分实现的连续过

  • 我花了三天时间在Android Studio里试着读一个.aar,但我就是弄不明白。我的项目视图如下所示: 我耐心地等待你能给我的任何帮助。谢谢 编辑:为了导入.aar,我遵循了这篇小文章的图片:在android Studio中导入.aar 并像Daniel Nugent所说的那样,通过将.aar放到libs文件夹中来解决了post报告的错误。然而,当我试着写的时候,大体上: null

  • Parquet是一种柱状(columnar)格式,可以被许多其它的数据处理系统支持。Spark SQL提供支持读和写Parquet文件的功能,这些文件可以自动地保留原始数据的模式。 加载数据 // sqlContext from the previous example is used in this example. // createSchemaRDD is used to implicitl