我无法模拟此情况,因此可以快速检查非流式传输情况,仅是DF或RDD常规处理:
即我们在这里谈论的是不确定性情况。
答案 0 :(得分:0)
更新-如果我们考虑类似JDBC
的源,则在重新计算期间将对数据库执行查询[1]。如果记录发生更改,将导致结果偏斜。我认为这项工作不会失败。
[1]-这是基于JdbcRDD代码的。
关于第一个问题,Spark的分区非常相似(实际上是从InputFormat的Hadoop InputSplit构建的)。每个FileSplit通常包含以下属性
因此,当您说源数据已更改时,请考虑以下情况
+--------------------------+-------------------------------------------------------------+
| Scenario | What happens |
+--------------------------+-------------------------------------------------------------+
| New file get's added | The new files are not part of the input splits |
| | so they're not captured as part of the partitions. |
| Existing file is deleted | This will cause the job to fail with FileNotFoundException. |
+--------------------------+-------------------------------------------------------------+
关于第二个问题,当您说重新分区时,还是有两种方法。使用shuffling=true
,不使用。
无需混洗,实际上只是将InputSplits列表聚集在一起形成一个分区(如果新的numPartitions
<现有分区)。在重新评估的情况下,将从源头再次读取它们。
如果在重新分区期间有shuffling=true
,则Spark会进行簿记以查找丢失的分区并重新运行任务。您可以阅读有关该in here的更多信息。因此,在从输入中重新读取分区时,适用与上述相同的情况。
PS:我假设源是与Hadoop兼容的文件系统。