【问题标题】:Spark cache inefficiencySpark缓存效率低下
【发布时间】:2015-10-06 00:54:14
【问题描述】:

我有一个非常强大的集群,有 3 个节点,每个节点有 24 个内核,总共 96gb RAM = 288gb。我尝试将 100gb 的 tsv 文件加载到 Spark 缓存中,并对数据进行一系列简单的计算,例如 sum(col20) by col2-col4 组合。我认为这是缓存使用的明确方案。

但在 Spark 执行期间,我发现尽管 RAM 空间很大,但缓存永远不会加载 100% 的数据。执行 1 小时后,我有 70% 的分区在缓存中,并且 170gb 中的 75gb 缓存使用量可用。看起来 Spark 以某种方式限制了它添加到缓存中的块/分区的数量,而不是在第一次操作时添加所有块/分区,并且从一开始就具有出色的性能。

我使用 MEMORY_ONLY_SER / Kryo(缓存大小约为磁盘数据大小的 110%)

是否有人有类似的经验或知道一些可能导致这种缓存行为的 Spark 配置/环境条件?

【问题讨论】:

  • 你是如何提交工作的?
  • 你的意思是我是否通过 spark-submit 运行这个工作?我是。顺便说一句,现在我将拆分大小从 400mb 减少到 200mb(将分区数从 250 增加到 500),这显着提高了“缓存率”(在循环中的第一次操作完成后提高到 80%)。但是,为什么不是 100%?))
  • 不,你的 spark-submit 行是什么?
  • spark-submit --class co.comp.explore.EventsGroupByTwoFields --master spark://hadoop.namenode:7077 --name testJoin --num-executors 11 --driver-memory 22g - -executor-memory 22g --executor-cores 6 /path/to/jar/jarName.jar --inputPath hdfs://hadoop.namenode/res/Events_20150707/*/ --outputPathPrefix /path/to/local/out/文件夹/Events_2D_

标签: caching apache-spark


【解决方案1】:

因此,“问题”通过进一步减小拆分大小得到了解决。 mapreduce.input.fileinputformat.split.maxsize 设置为 100mb,我在第一次操作完成后获得了 98% 的缓存负载,在第二次操作完成后获得了 100%。

恶化我的结果的其他事情是 spark.speculation=true - 我尽量避免长时间运行的任务,但推测管理会产生很大的性能开销,对我的情况毫无用处。因此,只需为 spark.speculation 保留默认值 ( false )

我对 20 个查询的性能比较如下:
- 没有缓存 - 160 分钟(20 次 x 8 分钟,每次从磁盘重新加载 100gb 到内存)
- 缓存 - 总共 33 分钟 - 10m 加载缓存 100%(在前 2 个查询期间)和 18 个查询 x 1.5 分钟(来自内存中的 Kryo 序列化缓存)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多