Apache spark 防止FileNotFound异常的Spark代码?

Apache spark 防止FileNotFound异常的Spark代码?,apache-spark,parquet,Apache Spark,Parquet,有没有办法运行我的spark程序并屏蔽文件 在改变之下 代码从读取拼花地板文件开始(读取过程中没有错误): 然后对数据进行转换,例如 val newTable = mappings.join(anotherTable, 'id) 这些转换需要几个小时(这是另一个问题) 有时作业完成,有时则会随着以下类似消息而终止: org.apache.spark.sparkeexception:由于阶段失败,作业中止: 阶段1014.0中的任务6失败4次,最近一次失败:任务丢失 6.3在第1014.0阶段(

有没有办法运行我的spark程序并屏蔽文件 在改变之下

代码从读取拼花地板文件开始(读取过程中没有错误):

然后对数据进行转换,例如

val newTable = mappings.join(anotherTable, 'id)
这些转换需要几个小时(这是另一个问题)

有时作业完成,有时则会随着以下类似消息而终止:

org.apache.spark.sparkeexception:由于阶段失败,作业中止: 阶段1014.0中的任务6失败4次,最近一次失败:任务丢失 6.3在第1014.0阶段(TID 106820、10.127.251.252、executor 5):java.io.FileNotFoundException:无此类文件或目录: s3a://bucket1/table/mappings/part-00007-21eac9c5-yyzz-4295-a6ef-5f3bb13bed64.snappy.parquet


我们相信另一项工作正在更改我们下面的文件,但还没有找到罪魁祸首。

这是一个非常复杂的问题,需要解决。如果在同一数据帧上操作时基础数据发生更改,则spark作业将失败。原因是在创建数据帧时,底层RDD知道数据的位置以及与之相关的DAG。现在,如果某个作业突然改变了底层数据,RDD别无选择,只能失败

启用重试、推测等的一种可能性,但问题仍然存在。通常,如果您在拼花地板中有一个表,并且您希望同时读写,请按日期或时间对该表进行分区,然后在不同的分区中写入,而在不同的分区中读取

现在加入的问题需要很长时间。如果您正在从s3读取数据,然后再次加入并写回s3,则性能会变慢。因为现在hadoop需要先从s3获取数据,然后再执行操作(代码不会返回数据)。虽然网络调用速度很快,但我对s3和EMR FS进行了一些实验,发现s3的速度降低了50%

一种替代方法是将数据从s3复制到HDFS,然后运行连接。这将保护您免受数据覆盖,性能将更快


如果您使用的是spark 2.2 s3 write,那么最后一件事是由于DirectOutputCommitter的不受欢迎,速度非常慢。这可能是经济放缓的另一个原因,这是一个非常复杂的问题。如果在同一数据帧上操作时基础数据发生更改,则spark作业将失败。原因是在创建数据帧时,底层RDD知道数据的位置以及与之相关的DAG。现在,如果某个作业突然改变了底层数据,RDD别无选择,只能失败

启用重试、推测等的一种可能性,但问题仍然存在。通常,如果您在拼花地板中有一个表,并且您希望同时读写,请按日期或时间对该表进行分区,然后在不同的分区中写入,而在不同的分区中读取

现在加入的问题需要很长时间。如果您正在从s3读取数据,然后再次加入并写回s3,则性能会变慢。因为现在hadoop需要先从s3获取数据,然后再执行操作(代码不会返回数据)。虽然网络调用速度很快,但我对s3和EMR FS进行了一些实验,发现s3的速度降低了50%

一种替代方法是将数据从s3复制到HDFS,然后运行连接。这将保护您免受数据覆盖,性能将更快


如果您使用的是spark 2.2 s3 write,那么最后一件事是由于DirectOutputCommitter的不受欢迎,速度非常慢。因此,这可能是速度放缓的另一个原因

您无法安全地将s3a用作Spark中的直接输出,否则会有数据损坏的风险。即使关闭了推测性执行,s3的列表不一致这一事实也意味着它可能会找到错误的文件进行重命名

如果要链接您的工作,则需要为更新的文件添加“足够”的时间在S3复制服务器上传播,以便获得一致的列表

这里有暗示;列出S3中的不一致性


正如Avishek所说:与本地HDFS服务器协作进行一系列查询,最后复制到s3a

您无法安全地将s3a用作Spark中工作的直接输出,否则会有数据损坏的风险。即使关闭了推测性执行,s3的列表不一致这一事实也意味着它可能会找到错误的文件进行重命名

如果要链接您的工作,则需要为更新的文件添加“足够”的时间在S3复制服务器上传播,以便获得一致的列表

这里有暗示;列出S3中的不一致性


正如Avishek所说:使用本地HDFS服务器进行一系列查询,最后复制到s3a

尝试在推测执行打开的情况下运行。当另一个进程尝试写入/修改该目录中的拼花文件时,会发生这种情况。确保在另一个进程完成后读取文件。另一个关于长时间运行作业的问题是,如果没有作业配置,很难提出建议。您的spark版本是什么?启用推测执行,spark.constitution=truetry在推测执行打开的情况下运行。当另一个进程尝试写入/修改该目录中的拼花文件时,会发生这种情况。确保在另一个进程完成后读取文件。另一个关于长时间运行作业的问题是,如果没有作业配置,很难提出建议。您的spark版本是什么?启用推测执行,spark.Projection=true
val newTable = mappings.join(anotherTable, 'id)