PySpark 使用过程中遇到的典型问题及处理办法

PySpark 使用过程中遇到的典型问题及处理办法

前言

不知道为啥, 现在写博客总得弄点前言, 观者无不叹息为何生命中宝贵的 20 秒钟要浪费在这无意义的前言上 🤣🤣🤣 好吧, 就是想水点文字, 今天是 7 月的最后一天, 距离零点还有 1 个小时左右, 我想抓住 7 月的尾巴, 再水篇博客, 在 7 月份完成两篇~ 原本是想分享论文的, 但还在酝酿当中. 思来想去, 最快达到目的的方法就是记录一些平时的笔记, 哈哈… 下面的内容考虑在 PySpark 使用过程中, 遇到的一些问题以及处理办法, 以防再次遇到相关问题又要去大量 Google … 总结在一处还是有必要的. 所以本文是会不断更新的. (Flag~)

下面正式进入问题分析.

Failed to create local root dir in /tmp/spark (Spark 无法产生临时目录的问题)

Spark 默认使用 /tmp/spark* 作为临时目录以存储一些临时数据, 如果该默认路径所在的磁盘满了, 会出现报错

Failed to create local root dir in /tmp/spark

此时按照博客 Spark运行在Standalone模式下产生的临时目录的问题 中的处理方法, 可以在提交 Spark 任务时加上配置:

--conf spark.local.dir=/home/xxx/spark_tmp \

使用上面的选项将临时目录修改为 /home 目录下的某个目录;

另一种方法是在 .bashrc 或者 .zshrc 文件中设置 SPARK_LOCAL_DIRS 环境变量:

export SPARK_LOCAL_DIRS=/home/xxx/spark_tmp

在命令行中启动 Spark

使用 PYSPARK_DRIVER_PYTHON=ipython pyspark 会比较香.

保存输出结果时报 UnicodeEncodeError 错误

我在使用 saveTextFile 时有时会遇到 UnicodeEncodeError, 可能是因为使用 Python2 同时输出内容有中文的缘故. 要处理有一下思路可以考虑:

  1. 对于 Python2, 可以增加如下代码, 另外注意 Python3 不需要加, 否则会报错, Python3 中已经无 reload 函数了.
import sys

if sys.getdefaultencoding() != 'utf-8':
	reload(sys)
	sys.setdefaultencoding('utf-8')
  1. 另外就是考虑打包 Python3, 处理 UnicodeEncodeError; 选择一个 Anaconda3 或者 miniconda3 发行版, 然后打包, 打包使用如下命令:
tar czvf miniconda3.tar.gz .miniconda3-latest/

生成 miniconda3.tar.gz 后, 将其上传到 HDFS 上, 比如 hdfs://xxx/yyyy/zzz/:

hadoop fs -put miniconda3.tar.gz hdfs://xxx/yyyy/zzz/

之后在提交 Spark 任务的脚本 (spark-submit 命令) 中加入如下配置:

--archives hdfs://xxx/yyyy/zzz/miniconda3.tar.gz#pyana \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./pyana/miniconda3-latest/bin/python \
--conf spark.yarn.appMasterEnv.PYSPARK_DRIVER_PYTHON=./pyana/miniconda3-latest/bin/python \

处理 Spark 的 port binding error

类似于这样的错误:

WARN Utils: Service 'sparkDriver' could not bind on a random free port.

参考 Port binding error in PySpark 解决.

  • 方法一最省事, 设置 SPARK_LOCAL_IP 环境变量
export SPARK_LOCAL_IP=127.0.0.1
  • 方法二是对 builder 使用 .config('spark.driver.host','127.0.0.1'), 比如:
spark = SparkSession.builder \
		.config('spark.driver.host','127.0.0.1') \
        .master("local") \
        .enableHiveSupport() \
        .getOrCreate()
  • 方法三是 sc 进行设置:
conf = pyspark.SparkConf().set('spark.driver.host','127.0.0.1')
sc = pyspark.SparkContext(master='local', appName='myAppName',conf=conf)

运行主程序时需导入其他 Python 文件

比如 main.py 中需要导入来自 utils.py 中的函数:

from utils import *

此时只需要在任务提交命令 spark-submit 的选项中增加:

--py-files ./utils.py

即可. 此外, 还有一些资料显示可以使用 SparkFiles 提供的功能, 但是我还没有用过, 下面给出链接:

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页