【发布时间】:2018-01-29 14:03:05
【问题描述】:
我在 S3 的 parquet 中有一个数据集,按日期 (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]
我想读取这个数据集,但只是尚未在冰川中的日期子集,例如:
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))
不幸的是,我有例外
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)
当某些分区位于 Glacier 中时,我似乎火花不喜欢分区数据集。我总是可以专门阅读每个日期,在最后添加带有当前日期和reduce(_ union _) 的列,但这很丑陋,应该没有必要。
是否有任何提示可以读取数据存储区中的可用数据,即使冰川中有旧数据?
【问题讨论】:
-
我不相信这是可能的。 AWS Glacier 似乎不支持下推谓词...
-
如果您需要检索一些最近的数据,请不要使用冰川。这不值得麻烦,您可能会陷入定价陷阱。只需存储您的数据和标准 IA。 medium.com/@karppinen/…
-
嗨,没有实际意义。我不想解冻 Glacier 中的数据(这会非常昂贵)。我的观点是我想使用我的数据集的分区,这些分区还没有在冰川中,但其他分区(我不想阅读)是!我认为唯一的方法是修改 AWS SDK,使其根本不尝试扫描冻结的分区。
-
@Boris:你能找到答案吗?鉴于现在有更多的冰川可供选择(深层冰川),这个过程变得很痛苦。有什么建议? PS:我确实在jira.apache.org/jira/browse/SPARK-21797看到了这里的讨论
-
不,还没有修复。如果您实现了issues.apache.org/jira/browse/HADOOP-14837,那么spark 可以看到哪个离线,并且可能跳过它,但实际上,这是Spark 不必担心的问题。拆分离线和热数据或期望堆栈跟踪
标签: apache-spark amazon-s3 partitioning amazon-glacier