首页 文章

使用spark-defaults.conf文件在jupyter笔记本中初始化pyspark

提问于
浏览
-1

在网上和SO上实例化pyspark几乎没有什么不同的答案 . 但有些已经过时,有些并未涵盖启动火花的所有“理想和最佳”*字符 . 这就是为了火花会话而挤压并提供你所拥有的每一块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笔记本中实例化spark .

我的问题是,如何更改 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 回答

  • 1

    这里有一长串的误解,大部分与这个简单的事实联系在一起:

    此外,我正在我的本地计算机上使用jupyter笔记本 .

    • local mode是一种开发和测试工具 - 它不是为性能而设计或优化的 .

    • spark.exectuor 属性在 local 模式中毫无意义,因为只有一个JVM在运行 - Spark驱动程序,并且仅使用其配置 .

    • 压缩并使您可用于火花会话的每一位RAM和CPU - 与具有最佳配置的不同 . 它看起来像同一个容器至少包含一个数据库,在这种情况下,它将缺乏资源 .

    另外:

    • Kryo序列化程序对PySpark和SQL API的影响很小或没有影响 .

    • 无法使用命令行 - 使用 PYSPARK_SUBMIT_ARGS 完全可以 .

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

相关问题