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程序来处理300个最新文件? 处境_Apache Spark - Fatal编程技术网

Apache spark 如何设计spark程序来处理300个最新文件? 处境

Apache spark 如何设计spark程序来处理300个最新文件? 处境,apache-spark,Apache Spark,新的小文件定期出现。我需要对最近的300个文件进行计算。所以基本上有一个前进的窗口。窗户的尺寸是300,我需要对窗户进行计算 但需要知道的是,这不是一个火花流计算。因为在火花流中,窗口的单位/范围是时间。这里的单位/范围是文件数 解决方案1 我将保留一个dict,dict的大小是300。每一个新文件进来,我把它转换成spark数据帧并放入dict。然后,如果dict的长度超过300,我确保dict中最旧的文件弹出。 在此之后,我将把dict中的所有数据帧合并到一个更大的数据帧中并进行计算 上述过

新的小文件定期出现。我需要对最近的300个文件进行计算。所以基本上有一个前进的窗口。窗户的尺寸是300,我需要对窗户进行计算

但需要知道的是,这不是一个火花流计算。因为在火花流中,窗口的单位/范围是时间。这里的单位/范围是文件数

解决方案1 我将保留一个dict,dict的大小是300。每一个新文件进来,我把它转换成spark数据帧并放入dict。然后,如果dict的长度超过300,我确保dict中最旧的文件弹出。 在此之后,我将把dict中的所有数据帧合并到一个更大的数据帧中并进行计算

上述过程将在循环中运行。每次新文件出现时,我们都会进行循环

解决方案1的伪代码 解决方案1的问题 始终命中内存不足gc开销限制

问题 您认为解决方案1中有什么不合适的地方吗

有没有更好的解决办法


这是使用spark的正确情况吗

一个观察结果是,您可能不想使用
popitem
,Python字典的键没有排序,因此您不能保证弹出的是最早的项。相反,每次我都会使用时间戳的排序列表重新创建字典。假设文件名只是时间戳:

my_dict = {file:get_dataframe(file) for file in sorted(file_list)[-300:]}

不确定这是否能解决您的问题,您能否将错误的完整堆栈跟踪粘贴到问题中?您的问题可能发生在Spark merge/join(未包含在您的问题中)。

我对此的建议是流式传输,但与时间无关,我的意思是您仍将设置一些窗口和滑动间隔,但假设为60秒

因此,每隔60秒,您就会得到文件内容的数据流,在“x”分区中。这些“x”分区表示您放入HDFS或文件系统的文件。
因此,通过这种方式,您可以跟踪读取了多少文件/分区,如果它们少于300,则等待它们变为300。当计数达到300后,您就可以开始处理了。

如果可以跟踪最新的文件,或者可以偶尔发现它们,那么我建议您执行以下操作

sc.textFile(','.join(files));
或者,如果有可能确定获取这300个文件的特定模式,那么

sc.textFile("*pattern*");

甚至可以使用逗号分隔的模式,但可能会出现一些匹配多个模式的文件被多次读取的情况。

您说过您的计算窗口是300,对吗?但是在解决方案1中,如果弹出最旧的文件,那么仍然有299个旧文件,对吗?你能澄清我的理解吗?@LokeshKumarP嗨,我修改了这个问题。在我拿出数据之前,我会检查一下口述。如果dict的总长度没有达到300,那么我不会弹出任何内容。如果仍然不清楚,请告诉我谢谢你的澄清,每个文件的大小是多少,而且你提到它不是流媒体作业,那么你多久轮询一次文件系统?@LokeshKumarP我添加了一些伪代码。文件大小为4KB。该集群是spark独立集群。按照频率。一旦一个循环结束,只要目录中还有文件,我就会进行下一个循环。当你有大数据帧时,它有多少个分区?单个或多个查询,以及您正在运行的查询,因为内存使用情况还取决于您使用的SQL结构。谢谢MaxyMo。实际上,我使用时间戳作为dict的键。因此,找到最早的数据帧不会有问题。堆栈跟踪太多。。但你是对的,我稍后会发布。谢谢我的意思是如果你要用
pop
删除最旧的项目,你需要使用
OrderedDict
——普通的dict并不总是对键排序,所以你不能保证
pop
会得到最早的日期。谢谢。我实际上并没有真正使用简单的pop方法。我用普通的口述。然后用钥匙判断是否应该删除相应的项目。嗨,谢谢。是的,我们可以用这种方式。但问题就像你说的,有些文件可能会被多次读取。这就是为什么我使用dict来跟踪那些已经读取的文件。我想避免这些阅读成本,然后将它们加入逗号分隔的列表中,每次都阅读。代码就这么简单,所以我不会太担心磁盘读取性能。有SSD,有磁盘和缓冲区。读取时间与处理时间的百分比是多少。无论如何,如果这是一个问题,我会测量阅读时间,但最有可能的结果是更简单的代码=)
sc.textFile("*pattern*");