如何避免在查询spark同时加载的配置单元表时出错

9wbgstp7  于 2021-05-27  发布在  Spark
关注(0)|答案(3)|浏览(374)

我们有一个用例,我们在一些流数据之上运行spark中编写的etl,etl每小时将结果写入目标配置单元表,但是用户通常会对目标表运行查询,而且我们也遇到过由于spark同时加载表而导致查询错误的情况。我们有什么办法来避免或尽量减少这种错误?spark作业(或配置单元表)的任何属性?或者创建一个临时表?
错误是:
java.io.filenotfoundexception:文件不存在[hdfs path]
我认为这是因为元数据显示有一个文件在作业执行期间被删除。
表按年、月、日(使用hdfs作为存储)进行分区,每次etl运行时,它只更新(通过分区覆盖)当前日期分区。目前集群中没有启用“事务”表(即使我在测试集群上测试用例时没有运气)

cngwdvgl

cngwdvgl1#

简单的选择是使用一种表格式,这种表格式被设计用来处理并发读写,比如hudi或delta-lake。更复杂的版本涉及使用编写器写入的分区只追加表。完成后,编写器更新视图以指向新数据。另一种可能的选择是在插入时对表进行分区。

yv5phkfx

yv5phkfx2#

有一组两个表和它们上面的视图:

CREATE TABLE foo_a (...);
CREATE TABLE foo_b (...);
CREATE VIEW foo AS SELECT x, y, z, ... FROM foo_a;

etl过程的第一次迭代需要:
使同步 foo_a -> foo_b 做这项工作 foo_b 下拉视图 foo 并指向 foo_b 直到第3步用户查询对表运行为止 foo_a . 从一开始他们就和 foo_b . etl的下一次迭代将以相反的方式工作。
这并不完美。在etl中需要双重存储和一些额外的复杂性。无论如何,这种方法可能会失败,如果:
用户很不幸在删除视图和重新创建视图之间出现了一段短时间
用户提交的查询足够重,可以在etl的两次迭代中运行

xqk2d5yq

xqk2d5yq3#

不确定,但看看
创建表foo_a(…);创建表foo_b(…);

相关问题