【问题标题】:Initialize pyspark in jupyter notebook using the spark-defaults.conf file使用 spark-defaults.conf 文件在 jupyter notebook 中初始化 pyspark
【发布时间】:2019-01-06 18:11:51
【问题描述】:

在 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 会话的目的是稍后从 DataBase 创建一个 DataFrame。

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

这是我目前尝试过的:

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 notebook 实例化 spark。

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

spark-defaults 文件位于。

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

*高度自以为是的观点。

【问题讨论】:

    标签: apache-spark pyspark jupyter-notebook


    【解决方案1】:

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

    此外,我正在本地计算机上使用 jupyter notebook。

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

    另外:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多