当前位置: 首页 > 知识库问答 >
问题:

Spark:groupBy花了很多时间

穆季萌
2023-03-14
JavaPairRDD<CustomTuple, Map<String, Double>>
public class CustomTuple implements Serializable{

private Map hierarchyMap = null;
private Map granularMap  = null;
private String timePeriod = null;
private String sourceKey  = null;
}
<"Inv", 20>

<"GRP", 30>
  1. 在此RDD上应用筛选器,并将相关行的范围移出:filter
  2. 在此RDD上应用筛选器,并将相关行的范围移出:filter
  3. 加入RDD:join
  4. 应用map阶段计算投资:map
  5. 应用GroupBy阶段根据所需视图对数据进行分组:GroupBy
  6. 应用map阶段来按照上述步骤中实现的分组聚合数据(例如跨时间段查看数据),并根据需要收集的resultset创建新对象:map
  7. 收集结果:收集

因此,如果用户想要查看跨时间段的投资,那么将返回下面的列表(这是在上面的步骤4中实现的):

<timeperiod1, value> 

当我检查操作所用的时间时,GroupBy占用了执行整个DAG所用时间的90%。

<"market1", 20>
<"market2", 30>

蒂亚!

共有1个答案

孟健
2023-03-14

洗牌由[K,v]对键的任何更改或repartition()调用触发。根据K(键)值计算分区。默认情况下,分区是使用键的哈希值计算的,通过hashcode()方法实现。在本例中,键包含两个map实例变量。hashcode()方法的默认实现也必须计算这些映射的hashcode(),从而导致对所有it元素进行迭代,从而再次计算这些元素的hashcode()

解决办法是:

  1. 不要在键中包含map实例。这似乎非常不寻常。
  2. 实现并重写您自己的hashcode(),以避免遍历map实例变量。
  3. 可能可以完全避免使用map对象。如果它是在多个元素之间共享的,您可能需要考虑在Spark中使用广播变量。在洗牌期间序列化映射的开销也可能是一个很大的原因。
  4. 通过在两个连续的组间调整哈希值来避免任何洗牌。
  5. 通过选择一个在连续使用期间将分区保持在本地的具有亲和力的分区程序来保持节点本地洗牌。
 类似资料:
  • 我正在开发一个spring批处理应用程序(内存为2GB),尝试处理数据(在处理过程中使用select查询获取数据),并在postgres DB中插入大约100万条处理过的记录。我在这个项目中使用Spring Data JPA。但是Spring JPA在处理这些记录时消耗了太多内存

  • 当我想启动我的jboss AS 7服务器时,需要很长时间才能开始。我正在使用netbean 7.4 这个jboss AS 7实际上是如何运行的?我应该从standalone.bat文件启动服务器吗?还是从netbean? 10: 34:15303信息[org.jboss.modules]jboss模块版本1.1.1。GA 10:34:15422信息[org.jboss.msc]jboss msc版

  • 18/02/07 04:44:51 INFO TaskSetManager:在1025毫秒内完成localhost(executor driver)上阶段1.0(TID 7)中的任务6.0(7/307) 为什么Spark要做这么多'hadooprdd:Input拆分‘?这样做的目的是什么?我如何加快或摆脱这个过程? 代码如下:

  • 我遵循这个链接制作一个CRF模型。我使用以下命令制作模型。 模型制作成功,但我的训练数据非常多,花费了太多时间。当我仔细观察系统中发生的事情时。它只使用了我电脑的一个核心 我能否以使用计算机多个核心的方式运行此命令?看起来它是作为单个线程实现的。是否支持多线程?如果是,请分享。

  • 问题内容: 我注意到,使用基本操作系统Alpine与CentOS或Debian在Docker容器中安装Pandas和Numpy(它的依赖项)需要花费更长的时间。我在下面创建了一个小测试来演示时差。除了Alpine用来更新和下载构建依赖项以安装Pandas和Numpy的几秒钟之外,为什么setup.py所需的时间比Debian的安装要多70倍? 是否有任何方法可以使用Alpine作为基础映像来加快安

  • 我读了一些关于这个问题的帖子,但找不到一个彻底的答案。我有一个有3行的ListView,每行包含一个TextView和一个EditText,还有一个扩展BaseAdapter的自定义适配器。 这是适配器的getView函数: 如您所见,每次值发生变化时,我都尝试用EditText值更新名为RowsList的ColorColumn列表。由于某种原因,onTextChanged方法被调用了太多次,因此