使用spark-defaults.conf文件

时间:2018-07-30 13:17:24

标签: apache-spark pyspark jupyter-notebook

在Web和SO上实例化pyspark几乎没有不同的答案。但是,有些过时了,有些没有涵盖启动火花的所有“理想和最佳” *特征。这就压缩了Spark会话所需的RAM和CPU的每一位。因此,我正在尝试找出一种方法来进行以下操作。

1)利用最大内核数
2)利用最大的驱动程序内存
3)利用执行程序内存的最大数量
4)利用最大堆栈大小和堆大小。
5)将最大大小传递给spark.driver.extraJavaOptions和spark.executor.extraJavaOption
6)使用2017-2018年关于Spark的备受好评的书籍中推荐的Kryo.serializer。

以及其他合适的属性。

通用方法将实例化spark会话。此Spark会话的目的是稍后从数据库中创建一个DataFrame。

但是,我找不到一种将所有这些步骤组合成一种智能且可行的方式的方法。有人建议使用SparkSession,有人建议在SparkConf中传递conf,有人建议在shell命令中传递conf。

这是我到目前为止尝试过的:

spark = SparkSession.builder.appName('ose')\
    .master('local[*]')\
    .config('spark.driver.memory', '32g')\
    .config('spark.executor.memory', '32g')\
    .config('spark.serializer', 'org.apache.spark.serializer.KryoSerializer')\
    .getOrCreate()

df = spark.read.format("com.mongodb.spark.sql.DefaultSource").option("uri",
"mongodb://localhost/demo.demo_lab").load()

虚拟系统属性是

Spark Version: '2.3.1'
Scala Version: version 2.11.8
Python Version: 3.6.6 | Anaconda custom (64-bit)
Java Version: 1.8.0_181 (Oracle Corporation)


Linux: Ubuntu 16.04.5 LTS
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    1
Core(s) per socket:    8
Socket(s):             1
NUMA node(s):          1
Model name:            Intel(R) Core(TM) i5-6700 CPU @ 2.00GHz

此外,我正在本地计算机上使用Jupyter笔记本工作。 documentation提到了

的某些属性
  

注意:在客户端模式下,不得通过   SparkConf直接在您的应用程序中,因为驱动程序JVM具有   在这一点上已经开始。相反,请通过   --driver-memory命令行选项或默认属性文件中。

由于我要通过笔记本提交作业,因此无法使用命令行。因此,我将坚持为所有属性配置默认属性文件,只是为了创建一个入口点以最大化Spark的属性。然后从Jupiter笔记本实例化火花。

我的问题是,如何更改spark-defaults.conf.template文件以将所有汁从上述刚才提到的虚拟计算机中挤出来进行spark会话,然后在jupyter笔记本中正确实例化spark会话并检查属性是否具有已通过笔记本?

spark-defaults文件位于其中。

/opt/apache-spark/spark-2.3.1-bin-hadoop2.7/conf/spark-defaults.conf.template

*非常有见地的观点。

1 个答案:

答案 0 :(得分:2)

这里有很多误解,大多数与这个简单的事实有关:

  

此外,我正在本地计算机上使用Jupyter笔记本工作。

  • local模式是一种开发和测试工具-并非针对性能进行设计或优化。
  • spark.exectuor属性在local模式下没有意义,因为只有一个JVM在运行-Spark驱动程序,并且仅使用其配置。
  • 压缩并提供火花会话所需的RAM和CPU的每一位-与优化配置不同。看起来同一容器至少包含一个数据库,在这种情况下,该数据库将资源匮乏。

另外:

  • Kryo序列化程序对PySpark和SQL API的影响很小或没有影响。
  • 无法使用命令行-完全可以通过使用PYSPARK_SUBMIT_ARGS

最后,没有适合所有情况的最佳配置。例如,如果您使用任何Python代码“最大化JVM内存分配”,将使Python代码没有所需的资源。同时,“核心”和内存只是您必须调整的资源的子集-对于许多作业,更重要的是IO(本地磁盘IO,存储IO)。