在冰川中部分地触发读取S3中的分区数据

Bor*_*ris 5 partitioning amazon-s3 amazon-glacier apache-spark

我在S3中的镶木地板中有一个数据集,该数据集按日期(dt)进行了划分,并且最早的日期存储在AWS Glacier中,以节省一些资金。例如,我们有...

s3://my-bucket/my-dataset/dt=2017-07-01/    [in glacier]
...
s3://my-bucket/my-dataset/dt=2017-07-09/    [in glacier]
s3://my-bucket/my-dataset/dt=2017-07-10/    [not in glacier]
...
s3://my-bucket/my-dataset/dt=2017-07-24/    [not in glacier]
Run Code Online (Sandbox Code Playgroud)

我想读取此数据集,但只读取尚未在冰川中的一部分日期,例如:

val from = "2017-07-15"
val to = "2017-08-24"
val path = "s3://my-bucket/my-dataset/"
val X = spark.read.parquet(path).where(col("dt").between(from, to))
Run Code Online (Sandbox Code Playgroud)

不幸的是,我有例外

java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: The operation is not valid for the object's storage class (Service: Amazon S3; Status Code: 403; Error Code: InvalidObjectState; Request ID: C444D508B6042138)
Run Code Online (Sandbox Code Playgroud)

我似乎在Glacier中有一些分区时,spark不喜欢分区数据集。我总是可以特别地阅读每个日期,在当前日期和reduce(_ union _)末尾添加该列,但是它看起来很丑陋,它不是必须的。

有什么技巧可以读取数据存储中的可用数据,即使冰川中有旧数据也是如此?

vaq*_*han 5

错误,您与Apache spark无关,由于在Glacier服务类中使用Glacier服务,Glacier存储类中的S3对象无法以与普通对象相同的方式进行访问,因此您将获得异常,需要先从Glacier中检索它们,然后才能读取它们。

Apache Spark无法直接处理映射到S3的冰川存储TABLE / PARTITION。

java.io.IOException:com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception:该操作对于对象的存储类无效(服务:Amazon S3;状态码:403;错误代码:InvalidObjectState;请求ID:C444D508B6042138)

当S3移动S3存储类中的任何对象时

  • 标准,
  • STANDARD_IA,
  • REDUCED_REDUNDANCY

    对于GLACIER存储类,您有对象S3已存储在Glacier中,而您看不到该对象,因此S3将仅按Glacier存储费率计费。

它仍然是S3对象,但是具有GLACIER存储类。

当需要访问这些对象之一时,可以启动还原,并将其临时复制到S3中。

将数据移到S3存储桶中并读入Apache Spark将解决您的问题。

注意:如果尝试,Apache Spark,AWS athena等无法直接从冰川读取对象,则会出现403错误。

如果使用Glacier存储选项归档对象,则在尝试检索对象之前,必须检查对象的存储类。如果对象存储在S3标准或减少冗余(RRS)存储中,则常规GET请求将按预期工作。如果将对象存储在Glacier中,它将失败(出现403错误)。在这种情况下,必须使用RESTORE操作(如下所述)才能使数据在S3中可用。


Ste*_*ran 0

Amazon (s3://) 和 ASF (s3a://) 的 S3 连接器不适用于 Glacier。当然没有人针对冰川测试 s3a。如果出现问题,你就只能自己解决。只需将数据复制到 s3 或本地 HDFS,然后在那里使用它