使用 ipython 代替 pyspark 默认使用的python解释器

修改 spark-default.conf 指定在 cluster 模式下使用的 python

spark.yarn.appMasterEnv.PYSPARK_PYTHON=py/anaconda3/bin/python3
spark.yarn.appMasterEnv.PYSPARK_DRIVER_PYTHON=py/anaconda3/bin/python3

然后在提交任务的时候,指定压缩环境. --archives "hdfs://HACluster/env/anaconda3.tar.gz#py"

如果是提交到yarn 环境的,仍需手动添加参数 --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=py/py3/bin/python3

添加环境变量 PYSPARK_DRIVER_PYTHON=/opt/anaconda3/bin/ipython 可以在本地pyspark 使用 ipython 环境

添加环境变量 PYSPARK_PYTHON 可以指定本地使用的 python 环境

使用docker spark 做本地测试

docker pull mesosphere/spark
docker run -it --name spark -p 4040:4040 mesosphere/spark /bin/bash

spark 中的 native 与 环境变量加载机制

通过修改 $SPARK_HOME/conf/log4j.properties 中添加如下内容, 打开 native load 的日志

log4j.logger.org.apache.hadoop.util.NativeCodeLoader=DEBUG

spark 在本地启动的时候会默认加载所有的环境变量 (包括 spark-env.sh )

但是在通过程序提交任务(例如yarn)的时候, spark 加载的是 spark-default.conf . 此时 ApplicationMaster 不会加载 spark-env.sh . 只有 executor 在创建的时候才去各节点加载 spark-env.sh

spark 使用 LD_LIBRARY_PATH 加载 hadoop-native 库, 而非 java.library.path .这是因为一旦启用了后者就不会再去 LD_LIBRARY_PATH 中找了.

让 AM 正确加载 native, 需要在 spark-default.conf 中指定如下内容

spark.yarn.appMasterEnv.LD_LIBRARY_PATH=/opt/hadoop/lib/native
# spark.executorEnv.LD_LIBRARY_PATH=xxx