我在S3中按照日期(dt)划分了镶木地板中的数据集,其中最早的日期存储在AWS Glacier中以节省一些钱。例如,我们有......
29 18 * * * user /var/www/html/myfun.sh
我想要读取这个数据集,但只想读取尚未出现在冰川中的日期子集,例如:
- English:
- - content1
- - content2
- French:
- - content1
- - content2
不幸的是,我有例外
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]
我觉得当某些分区在Glacier中时,spark不喜欢分区数据集。我总是可以专门阅读每个日期,添加当前日期的列和最后的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))
,但它像地狱一样丑陋,它不应该是必要的。
即使是冰川中的旧数据,是否有任何提示可以读取数据存储区中的可用数据?
答案 0 :(得分:3)
由于与Glacier服务无关,错误提示您与Apache spark无关,因为在Glacier存储类中的简短S3对象无法以与普通对象相同的方式进行访问,因此必须先从Glacier中检索它们可以阅读。
Apache Spark无法直接处理映射到S3的冰川存储表/部分。
java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: 该操作对于对象的存储类无效(服务: 亚马逊S3;状态码:403;错误代码:InvalidObjectState;请求 ID:C444D508B6042138)
当S3移动S3存储类中的任何对象
REDUCED_REDUNDANCY
对于GLACIER存储类,您已经将对象S3存储在Glacier中,这是不可见的 给您,S3将仅按Glacier存储费率计费。
它仍然是S3对象,但是具有GLACIER存储类。
当您需要访问这些对象之一时,可以启动还原, 临时复制到S3中。
将数据移到S3存储桶中并读入Apache Spark将解决您的问题。
注意:如果尝试运行Apache Spark,AWS athena等,则无法直接从冰川读取对象。
如果使用Glacier存储选项归档对象,则必须 在尝试检索之前检查对象的存储类 它。如果对象为,则常规GET请求将按预期工作 存储在S3标准或减少冗余(RRS)存储中。它会 如果对象在Glacier中存档,则失败(出现403错误)。在这 在这种情况下,您必须使用RESTORE操作(如下所述) 您的数据可在S3中使用。
答案 1 :(得分:0)
来自亚马逊(s3://)和ASF(s3a://)的S3连接器不能与Glacier合作。当然没有人测试s3a对抗冰川。如果有问题,你可以自己修理它们。只需将数据复制到s3或本地HDFS,然后在那里使用
答案 2 :(得分:0)
如果您通过Hive定义表,并使用Hive Metastore目录进行查询,则不会尝试进入未选择的分区。 看一下spark.sql.hive.metastorePartitionPruning设置
答案 3 :(得分:0)
403错误是由于您无法读取冰川source
中保存的对象而导致的如果要从Glacier中读取文件,则需要先将它们还原到s3,然后再在Apache Spark中使用它们,在还原命令中提到的时间内,s3上将有一个副本,有关详细信息see here,您可以使用S3控制台,CLI或任何语言来做到这一点
比方说,您不想从Glacier恢复所有文件并在处理过程中将其丢弃,可以通过Spark 2.1.1
,2.2.0
忽略这些文件(使用IO/Runtime Exception
),方法是:将spark.sql.files.ignoreCorruptFiles
设置为true
source
答案 4 :(得分:0)
试试这个设置: ss.sql("设置 spark.sql.hive.caseSensitiveInferenceMode=NEVER_INFER") 要么 添加 spark-defaults.conf 配置:
spark.sql.hive.caseSensitiveInferenceMode NEVER_INFER