Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark “期间发生了什么?”;“停机时间”;Spark何时读取S3上的大数据集?_Apache Spark - Fatal编程技术网

Apache spark “期间发生了什么?”;“停机时间”;Spark何时读取S3上的大数据集?

Apache spark “期间发生了什么?”;“停机时间”;Spark何时读取S3上的大数据集?,apache-spark,Apache Spark,我在AWS S3中有一堆JSON数据——比如说100k个文件,每个大约5MB——我使用Spark 2.2的DataFrameReader通过以下方式读取和处理它们: sparkSession.read.json(…) 我发现Spark会在开始计算前挂起5分钟左右。对于较大的数据集,这可能需要数小时。当我说“挂起”时,我的意思是终端可视化显示集群正在工作的阶段以及它的运行距离没有出现——据我所知,它不知何故处于两个阶段之间 Spark在这段时间做了什么,我如何帮助它更快 我有两个想法,但似乎都错了

我在AWS S3中有一堆JSON数据——比如说100k个文件,每个大约5MB——我使用Spark 2.2的
DataFrameReader
通过以下方式读取和处理它们:

sparkSession.read.json(…)

我发现Spark会在开始计算前挂起5分钟左右。对于较大的数据集,这可能需要数小时。当我说“挂起”时,我的意思是终端可视化显示集群正在工作的阶段以及它的运行距离没有出现——据我所知,它不知何故处于两个阶段之间

Spark在这段时间做了什么,我如何帮助它更快

我有两个想法,但似乎都错了

我的第一个想法是Spark正在尝试列出进行计算所需的所有文件。我通过实际脱机创建一个文件列表并直接将其提供给Spark而不是使用glob语法来测试这一点:

val fileList=loadFiles()
sparkSession.read.json(文件列表:*)

这实际上导致了“绞刑”时间的延长

我的第二个想法是Spark利用这段时间为所有数据创建一个模式。但我通过手动指定模式排除了这一点:

val schema=createSchema()
sparksession.read.schema(schema).json(…)

这里的“挂起”时间和以前一样,尽管计算速度要快得多


所以我不确定到底发生了什么,也不知道如何诊断。还有人遇到过这种情况吗?

在S3中列出目录树的成本非常高,“分区”。这就是你正在经历的

修复

  • 更少、更大的文件
  • 浅目录树

我真的不能告诉你spark在做什么,但我可以说spark从来都不喜欢阅读很多小文件。如果您有任何方法可以事先将文件聚合为更少但更大的文件(比如至少500MB),您应该会看到一个巨大的速度。@GliennieHellesSindholt感谢您的建议-现在您提到了它,我可以想到我使用过的其他大型数据集,它们的分区效率更高,他们没有这个问题。我仍然对一个不需要重新构造数据的解决方案抱有温和的希望,但这也许是最好的策略。根据您的经验,文件大小是否有上限?也许这取决于集群?好吧,我使用的S3有5GB的上限(或者至少以前是这样,不确定是否已经删除了),所以我的文件总是小于5GB。然而,在我所有的写作工作中,我确实确保我将数据存储在少量但较大的文件中,正是出于这个原因。@GlennieHellesSindholt我接受了你/史蒂夫的建议,并获得了显著的回报-使用更少但较大的文件(约2.6gb)消除了“停机时间”,工作运行速度比以前更快。谢谢谢谢-考虑到我的数据组织方式,这听起来似乎是合理的。然而,我本以为给spark提供一个完整的文件列表(没有全局文件)可以省去解析目录树的麻烦——在我的实验中,这实际上让事情变得更糟。是否有其他方法来缓存目录树或加快未来计算的速度?我在同一数据上做了很多计算,所以也许最好的策略是将文件合并在一起,并按照您的建议简化目录结构。是的,合并很好,不仅用于列表,而且用于调度:每个工作人员将一次调度一个文件的全部或部分:文件越大,在需要与驱动程序交谈以提交该工作并请求更多之前,每个人可以做的工作越多,+spark可能会占用文件列表并重新扫描它,因为它不知道哪些是目录,哪些是文件。每个文件一个HEAD请求。我咬紧牙关,重新构造数据,使目录树是扁平的,有1000个文件,而不是接近100万个。它得到了回报:完全消除了“停机时间”,各种计算运行速度大大加快。所以你在钱上是对的。(现在尝试说服系统团队改变我们接收数据的方式…)