火花在S3中部分地在冰川中读取分区数据

时间:2017-08-21 13:12:59

标签: apache-spark amazon-s3 partitioning amazon-glacier

我在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)) ,但它像地狱一样丑陋,它不应该是必要的。

即使是冰川中的旧数据,是否有任何提示可以读取数据存储区中的可用数据?

5 个答案:

答案 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存储类中的任何对象

  • 标准,
  • STANDARD_IA,
  • 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文件

比方说,您不想从Glacier恢复所有文件并在处理过程中将其丢弃,可以通过Spark 2.1.12.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
相关问题