Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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
Time Spark时间序列-按10分钟间隔自定义分组:提高性能_Time_Apache Spark_Pyspark_Series - Fatal编程技术网

Time Spark时间序列-按10分钟间隔自定义分组:提高性能

Time Spark时间序列-按10分钟间隔自定义分组:提高性能,time,apache-spark,pyspark,series,Time,Apache Spark,Pyspark,Series,我们有时间序列数据(自1970年以来美国的时间戳和整数数据值): 现在,我们想使用外部python库在10分钟的时间窗口上计算一些非平凡的事情。为此,我们需要将每个时间帧的数据加载到内存中,应用外部函数并存储结果。因此,用户定义的聚合函数(UDAF)是不可能的 现在的问题是,当我们将GroupBy应用于RDD时,速度非常慢 df_cache.rdd.groupBy(lambda x: int(x.time / 600e6) ). \ # create 10 minute groups

我们有时间序列数据(自1970年以来美国的时间戳和整数数据值):

现在,我们想使用外部python库在10分钟的时间窗口上计算一些非平凡的事情。为此,我们需要将每个时间帧的数据加载到内存中,应用外部函数并存储结果。因此,用户定义的聚合函数(UDAF)是不可能的

现在的问题是,当我们将GroupBy应用于RDD时,速度非常慢

df_cache.rdd.groupBy(lambda x: int(x.time / 600e6) ). \ # create 10 minute groups
             map(lambda x: 1). \ # do some calculations, e.g. external library
             collect() # get results
此操作在两个具有6GB Ram的节点上进行约14分钟的120Mio采样(100Hz数据)。groupBy阶段的Spark详细信息:

Total Time Across All Tasks: 1.2 h
Locality Level Summary: Process local: 8
Input Size / Records: 1835.0 MB / 12097
Shuffle Write: 1677.6 MB / 379
Shuffle Spill (Memory): 79.4 GB
Shuffle Spill (Disk): 1930.6 MB
如果我使用一个简单的python脚本并让它在输入文件上迭代,那么完成所需的时间就会少很多


如何在spark中优化此作业?

groupBy是您的瓶颈:它需要在所有分区中洗牌数据,这非常耗时,占用大量内存空间,从指标中可以看出

这里的方法是使用
reduceByKey
操作并按如下方式链接它:
df_cache.rdd.map(lambda x:(int(x.time/600e6),(x.time,x.data)).reduceByKey(lambda x,y:1.collect()

这里的关键点是,
groupBy
需要在所有分区上洗牌所有数据,而
reduceByKey
将首先在每个分区上减少数据,然后在所有分区上减少数据,从而大幅度减少全局洗牌的大小。请注意,我是如何将输入组织成一个键来利用
r按键教育
操作


正如我在评论中提到的,您可能还希望使用Spark SQL的数据帧抽象来尝试您的程序,这可能会给您带来额外的提升,这要感谢它的优化器。

我不确定这是否可行,但您可能希望将数据映射到int(x.time,600e^)作为元组的第三个成员,然后将reduceByKey还原到此成员上。我不确定您可以通过此操作获得多少性能,但它应该会产生较小的无序。请告诉我您的情况。类似的内容:
df_cache.rdd.map(lambda x:(int(x.time/600e^),x.time,x.data)).reduceByKey(lambda x:1.collect()
(错过了编辑时间跨度…)但是要小心使用collect,这可能会导致OOM异常。我以前尝试过这个。它比direct group by慢。“asdfI几乎想不出比reduceByKey更快的任何东西。您可能希望查看groupBy生成的组的分布是否有任何异常,并查看reduceByK的详细信息ey作业,以确定确切的问题操作。您是否尝试使用Spark SQL的数据帧重写作业?这只需要9.47秒即可完成。似乎它更快了很多:
df_cache.rdd.map(lambda x:(int(x.time/600e6),(x.time,x.data))).reduceByKey(lambda x,y:1.collect()
Total Time Across All Tasks: 1.2 h
Locality Level Summary: Process local: 8
Input Size / Records: 1835.0 MB / 12097
Shuffle Write: 1677.6 MB / 379
Shuffle Spill (Memory): 79.4 GB
Shuffle Spill (Disk): 1930.6 MB