2015-06-04 110 views
1

我已经开始学习Spark并且目前正在运行WordCount实验(统计文本文件中每个单词出现的次数)。 该文件被放置在网络挂载的共享文件系统中。 我有一个集群1主和5执行者(每个都有:处理器AMD Opteron 1.7 Ghz,24核心,48GB RAM,250GB存储)。Apache Spark性能

我已经离开了星火的默认配置为

我已经注意到了,我第一次运行该程序,我得到一个较长的执行时间的时刻(如spark.executor.memory =512米),这降低在第二次,第三次运行。 例如,对于一个40GB的文件的执行时间为:

  1. 第一次执行:419.769396小号
  2. 第二次执行:176.242206小号
  3. 第三个执行:134.411345小号
  4. 四执行:126.052158小号
  5. 第五次执行:126.287600 s

我正在运行它:

> ./spark-submit --class com.spark.example.WordCount --master spark://master:7077 wordCountOriginal.jar /data/input40GB 

WordCount的代码与Spark提供的示例完全相同。

我不明白为什么第一次执行和下一次执行之间会有如此大的差异。我认为缓存是答案,但从我读的Spark缓存中执行结果中的中间结果,但在这里有不同的执行。

谢谢!

+0

我认为这种差异可能更多地沿着将可重用数据对象进行池化或在活动实例的内存中保持加载类的方式。 (免责声明:我没有与Spark合作过)。 –

回答

0

这是因为Spark有一个缓存机制。第一次运行后,Spark将缓存执行结果。您可以在此page阅读更多关于此。祝你好运!

+0

对于更深的潜水 - 在引擎盖下,这是由于spark没有在shuffle文件上调用fsync,所以它将被写入OS缓冲区缓存 –

+0

谢谢!那么,如果我评估性能,平均执行几次执行时间还是仅执行第一次执行时间更准确? –

+0

@JustinPihony那些是独立运行的。 Spark系统中不应该存在以前运行的任何“内存”。对我来说,它看起来像纯粹的操作系统缓存'热门'文件。 – maasg

0

为了消除执行时间中的这些差异,每次执行后,我停止了主节点和节点,并手动清除OS缓存。经过更多的调查,我认为Spark只处理内存缓存,并且只在服务器运行时从缓存中删除,并且使用LRU(最近最少使用)策略从缓存中删除数据。没有手动清除缓存,我仍然看到执行时间递减模式。

+0

正确。火花缓存并不是这里的罪魁祸首。首先,你必须明确地指定数据应该被缓存,而字数计数例子不会这样做。其次,高速缓存生存期与Spark上下文的生命周期相关联。每个提交的作业都会创建一个新的Spark上下文。 –