2

我已经设置了一个spark-jobserver来启用对缩减数据集的复杂查询。

作业服务器执行两个操作:

  • 与主远程数据库同步,它转储一些服务器的表,减少和聚合数据,将结果保存为 parquet 文件并将其作为 sql 表缓存在内存中。这个操作每天都会做;
  • 查询,同步操作完成后,用户可以对聚合数据集执行 SQL 复杂查询,(最终)将结果导出为 csv 文件。每个用户一次只能进行一次查询,并等待其完成。

最大的表(在减少之前和之后,还包括一些连接)有近 30M 的行,至少有 30 个字段。

实际上,我正在开发一台具有 32GB 内存的开发机器,专用于作业服务器,并且一切运行顺利。问题在于,在生产环境中,我们与 PredictionIO 服务器共享相同数量的 ram。

我在问如何确定内存配置以避免内存泄漏或火花崩溃。

我是新手,所以每一个参考或建议都被接受。

谢谢

4

1 回答 1

2

举个例子,如果你有一个 32g 内存的服务器。设置以下参数:

 spark.executor.memory = 32g

记录一下:

可能的第一个冲动是使用 --num-executors 6 --executor-cores 15 --executor-memory 63G。但是,这是错误的方法,因为:

63GB + 执行程序内存开销不适合 NodeManagers 的 63GB 容量。应用程序主控将在其中一个节点上占用一个核心,这意味着该节点上将没有空间容纳 15 核执行器。每个执行器 15 个内核会导致 HDFS I/O 吞吐量不佳。

更好的选择是使用 --num-executors 17 --executor-cores 5 --executor-memory 19G。为什么?

此配置会在所有节点上产生三个执行程序,但带有 AM 的节点除外,它将有两个执行程序。--executor-memory 派生为(每个节点 63/3 个执行器)= 21. 21 * 0.07 = 1.47。21 – 1.47 ~ 19。

如果您想了解更多信息,请在此处解释:http: //blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-2/

于 2016-11-22T16:17:51.137 回答