[AWS EMR Spark作业在分区或位置更改时读取Athena表胶水

问题描述 投票:0回答:1

我创建了一个带有'AWS Glue数据目录'的AWS EMR Hadoop集群,用于'for Spark表元数据'。因此,在Spark作业或spark-shell中,我可以编写使用Glue / Athena数据库和表的Spark SQL。

如果在EMR中运行的Spark作业正在读取该表的内容时,如果更改Athena表的位置会发生什么?

让我们想象一下,在名为“ my_db”的Glue数据库中有一个名为“ item”的雅典娜表。 Athena表的位置指向一个S3文件夹,其中存储了包含数据的Parquet文件。此文件夹为s3://my_bucket/item_2020_03_02

启动在EMR中运行的Spark作业,并处理读取表内容的Spark SQL字符串:

Dataset<Row> df = spark.sql("select * from my_db.item");
df.write().parquet("some_location_in_emr_hdfs");

几毫秒后,有人在AWS Athena Web控制台中运行此SQL查询:

ALTER TABLE my_db.item SET LOCATION 's3://my_bucket/item_2020_03_03'

Athena表数据的先前位置不会被删除或更改。时段s3://my_bucket/item_2020_03_02不变。

Spark作业会发生什么?

[它启动时是否愉快地继续读取雅典娜表的数据:s3://my_bucket/item_2020_03_02

或者它是否会面临数据不一致,因为将从s3://my_bucket/item_2020_03_02(旧位置)读取部分数据,而从s3://my_bucket/item_2020_03_03(新位置)读取部分数据?

或者会抛出一些AWS错误?

apache-spark apache-spark-sql amazon-emr aws-glue amazon-athena
1个回答
0
投票

理想情况下应该没有任何错误。如果您的spark作业已经在运行,并且在对Athena中的表进行更改时读取了先前的位置,则spark最终将数据从s3://my_bucket/item_2020_03_02写入some_location_in_emr_hdfs

如果在火花开始读取表数据之前执行更改,那么它将从新位置读取数据。

无论是从旧位置读取还是从新位置读取,这取决于对雅典娜表进行实际更改的时间。

© www.soinside.com 2019 - 2024. All rights reserved.