查看帮助 pyspark -h
—executor-memory : 为每个executor配置内存
—num-executor : 配置executor数量
—verbose : 查看详细信息【建议打印出来,看看配置情况】
—conf : 常用配置。具体看官网https://spark-reference-doc-cn.readthedocs.io/zh_CN/latest/more-guide/configuration.html
示例:
pyspark —verbose —executor-memory=10G —num-executor=4 —conf spark.local.dir=/home/dfs/tmp

踩过的坑

  1. 上述配置,统一在pyspark shell中使用,不要在python的SparkConf中进行配置,好像会不起作用。
  2. 跑算法时,会因为内存不足,而将中间过程写进磁盘。问题来了,如果没有配置“spark.local.dir”这个属性,系统默认使用/tmp目录,使得/tmp磁盘紧张而引发告警。。
  3. RDD持久化到内存时,cache()和persisit()使用是有规则的
    必须在创建一个RDD 之后执行
    另起一行单独执行这个方法是没有效果的
    例如
    list=sc.textFile(“C:\Users\haha174\Desktop\data\test\hive-site.xml”).cache();
    但是如果是这样的
    list=sc.textFile(“C:\Users\haha174\Desktop\data\test\hive-site.xml”);
    list.cache();
    是没有效果的
  4. —executor-memory的值不是executor memory的值,—executor-memory包含了(executor memory、storage memory、user memory、reserved memory),具体区别与调参看下面。
  5. at py4j.GatewayConnection.run(GatewayConnection.java:238) at java.lang.Thread.run(Thread.java:748)
  6. pyspark main.py 是不支持的,改用 spark-submit main.py 。
    如果报错:Error executing Jupyter command ‘/home/pqchen/main.py’: [Errno 2] No such file or directory,则修改 PYSPARK_DRIVER_PYTHON=jupyter为PYSPARK_DRIVER_PYTHON=python,我的配置在.bashrc中
  7. 使用spark-submit main.py,报错: NameError: name ‘spark’ is not defined。 则在main.py中添加:
  1. from pyspark.context import SparkContext
  2. from pyspark.sql.session import SparkSession
  3. sc = SparkContext.getOrCreate()
  4. spark = SparkSession(sc)
  1. 使用spark-submit会有大量日志,使用 —conf “spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties”来配置
    文件 log4j.properties 如下 (关于 Logger其他相关内容可以查看文章:)

常用属性

  1. spark.kryoserializer.buffer.max 最大允许的Kryo序列化buffer。必须必你所需要序列化的对象要大。如果你在Kryo中看到”buffer limit exceeded”这个异常,你就得增加这个值了。【在聚类数过多(50)时,曾报过这个错误,可以增加这个属性,默认64M】
  2. —executor-memory=10G
  3. —num-executor=4
  4. —conf spark.local.dir=/home/dfs/tmp
  5. —conf spark.default.parallelism=12 # task的并行度
  6. —verbose

    警告信息

  7. WARN memory.MemoryStore: Not enough space to cache broadcast_37 in memory computed 384.0MB so far
    WARN storage.BlockManager: Persisting block broadcast_37 to disk instead.
    这两个警告会一起报——因为storage的内存不足,所以将broadcast写到了磁盘.

  8. 12:33:01 WARN BLAS: Failed to load implementation from: com.github.fommil.netlib.NativeSystemBLAS
    12:33:01 WARN BLAS: Failed to load implementation from: com.github.fommil.netlib.NativeRefBLAS
    系统中没有 libgfortran (MLlib的加速库)就会看到这些信息。