我创建了一个带有'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错误?
理想情况下应该没有任何错误。如果您的spark作业已经在运行,并且在对Athena中的表进行更改时读取了先前的位置,则spark最终将数据从s3://my_bucket/item_2020_03_02
写入some_location_in_emr_hdfs
。
如果在火花开始读取表数据之前执行更改,那么它将从新位置读取数据。
无论是从旧位置读取还是从新位置读取,这取决于对雅典娜表进行实际更改的时间。