我们有一个用例,我们在一些流数据之上运行spark中编写的etl,etl每小时将结果写入目标配置单元表,但是用户通常会对目标表运行查询,而且我们也遇到过由于spark同时加载表而导致查询错误的情况。我们有什么办法来避免或尽量减少这种错误?spark作业(或配置单元表)的任何属性?或者创建一个临时表?
错误是:
java.io.filenotfoundexception:文件不存在[hdfs path]
我认为这是因为元数据显示有一个文件在作业执行期间被删除。
表按年、月、日(使用hdfs作为存储)进行分区,每次etl运行时,它只更新(通过分区覆盖)当前日期分区。目前集群中没有启用“事务”表(即使我在测试集群上测试用例时没有运气)
3条答案
按热度按时间cngwdvgl1#
简单的选择是使用一种表格式,这种表格式被设计用来处理并发读写,比如hudi或delta-lake。更复杂的版本涉及使用编写器写入的分区只追加表。完成后,编写器更新视图以指向新数据。另一种可能的选择是在插入时对表进行分区。
yv5phkfx2#
有一组两个表和它们上面的视图:
etl过程的第一次迭代需要:
使同步
foo_a
->foo_b
做这项工作foo_b
下拉视图foo
并指向foo_b
直到第3步用户查询对表运行为止foo_a
. 从一开始他们就和foo_b
. etl的下一次迭代将以相反的方式工作。这并不完美。在etl中需要双重存储和一些额外的复杂性。无论如何,这种方法可能会失败,如果:
用户很不幸在删除视图和重新创建视图之间出现了一段短时间
用户提交的查询足够重,可以在etl的两次迭代中运行
xqk2d5yq3#
不确定,但看看
创建表foo_a(…);创建表foo_b(…);