在写入HDFS或S3时Spark是否锁定文件

kal*_*thy 5 apache-spark apache-spark-sql

我有一个S3位置与在它上面创建的配置单元表中的以下的目录结构:

s3://<Mybucket>/<Table Name>/<day Partition>
Run Code Online (Sandbox Code Playgroud)

比方说,我有一个将数据写入上述表格的位置横跨使用下面的代码行多个分区的星火计划:

Df.write.partitionBy("orderdate").parquet("s3://<Mybucket>/<Table Name>/")
Run Code Online (Sandbox Code Playgroud)

如果另一个程序,如“蜂巢SQL查询”或“AWS雅典娜查询”开始在阅读的同时,从表中的数据:

他们是否考虑写入临时文件?

在写入S3位置时,spark会锁定数据文件吗?

我们如何使用Spark作为ETL工具来处理此类并发情况?

小智 1

Spark 通过两步过程写入输出。首先,它将数据写入_temporary目录,然后一旦写入操作完成并成功,它将文件移动到输出目录。

他们是否考虑写入临时文件?

由于以 开头的文件_是隐藏文件,因此您无法从 Hive 或 AWS Athena 读取它们。

Spark 在写入 S3 位置时是否会锁定数据文件?

由于spark的两步写入过程简单,所以不需要加锁或者任何并发机制。

我们如何使用 Spark 作为 ETL 工具来处理这种并发情况?

再次使用简单的写入临时位置机制。

这里还要注意的一件事是,在上面的示例中,将输出写入输出目录后,您需要使用Alter table <tbl_name> add partition (...)命令或msck repair table tbl_name命令将分区添加到 hive 外部表,否则数据将在 hive 中不可用。