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 _)末尾添加该列,但是它看起来很丑陋,它不是必须的。
有什么技巧可以读取数据存储中的可用数据,即使冰川中有旧数据也是如此?
错误,您与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存储类中的任何对象时
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中可用。
Amazon (s3://) 和 ASF (s3a://) 的 S3 连接器不适用于 Glacier。当然没有人针对冰川测试 s3a。如果出现问题,你就只能自己解决。只需将数据复制到 s3 或本地 HDFS,然后在那里使用它
| 归档时间: |
|
| 查看次数: |
1232 次 |
| 最近记录: |