Spark 踩坑笔记

启动Spark Master失败,但是Worker成功,启动Master时日志如下:

 

原因是第一个WARN,Spark已经不建议使用SPARK_MASTER_IP来指定master的ip,而是使用SPARK_MASTER_HOST


于是在配置文件中改掉就好

Hbase 已启动,但是使用list指令出现错误:Can’t get master address from ZooKeeper; znode data == null

原因可能有很多:

  • 1.hbase 和zookeeper在单机部署上,zookeeper和hbase的服务通常不稳定,重启即可解决。这里我写了一个脚本来重启restart_hbase,注意启动时要先启动zookeeper再启动hbase。
  • 2.新旧版本数据不一致,参考这篇博客can’t get master address from zookeeper /新旧数据不一致
  • 3.如果以上方法都不行,则使用下面这个终极方法,重新格式化namenode(若有重要数据请自行备份)。

    cd {hadoop directory}

    删除data文件夹,这个文件夹为自己配置文件中dfs.name.dir的路径,如果不删除会导致datanode与namenode的clusterID不一致,进而导致datanode启动失败。详情参考这篇博客解决Hadoop启动时,没有启动datanode

    rm -rf {data directory}

    格式化namenode

    bin/hdfs namenode -format

    sbin/start-dfs.sh

    bin/hdfs dfs -mkdir /user

    bin/hdfs dfs -mkdir /user/{username} # make sure you add correct username here

    启动 zookeeper

    zkServer start

    进入zkCli

    zkCli

    删除/hbase数据,防止2中提到的问题

    rmr /hbase

    启动hbase

    ./start-hbase.sh

Spark + python 中的那些坑

注:这里是指在本地搭建环境,包括local模式和standalone模式

之前我用的spark版本时是2.2.0,搭配scala 2.11.11一切运行完美,然而在使用python时却遇到了诸多大坑

  1. Python in worker has different version 2.7 than that in driver 3.6, PySpark cannot run with different minor versions.Please check environment variables PYSPARK_PYTHON and PYSPARK_DRIVER_PYTHON are correctly set.

原因分析:这个报错说得很清晰,即worker和driver中的python版本不同,于是我按照要求在spark-env.sh和.bash_profile中设置了PYSPARK_PYTHON和PYSPARK_DRIVER_PYTHON环境变量,并指向同一个python 3.6, 并修改了电脑上所有关于python的环境变量,使默认的 python指令也指向同一个python环境,但是worker依然会指向python 2.7。

解决方式:在代码中指定PYSPARK_PYTHON,


1
2
    import os
    os.environ['PYSPARK_PYTHON'] = '/anaconda3/python.app/Contents/MacOS/python'

2.在local模式下能正常运行,但是spark-submit提交到master时失败

提交的指令:


1
    spark-submit --master spark://127.0.0.1:7077 SparkTopK.py

出现如下报错:


1
    All masters are unreponsive! Giving up.

master日志中有如下报错,这个比较关键:


1
2
    18/10/22 19:51:53 ERROR TransportRequestHandler: Error while invoking RpcHandler#receive() for one-way message.
java.io.InvalidClassException: org.apache.spark.rpc.RpcEndpointRef; local class incompatible: stream classdesc serialVersionUID = -1329125091869941550, local class serialVersionUID = 1835832137613908542

解决方式:


1
2
3
4
5
6
7
检查pyspark版本与spark是否一致(如果配置了环境变量,可以分别启动spark-shell和pyspark,查看spark版本)
我这里版本不一致的原因是因为spark是我很早以前安装的,而在配置python环境时,直接使用了
conda install pyspark / pip3 install pyspark
默认安装了2.3.2版本(最新版),导致pyspark与spark master的版本不一致,所以出现了这种错误。
所以,重新下载配置了2.3.2的spark,就解决了...

看起来很简单,其实这个bug折腾了我整整一天...

点击量:271

分类: 开发笔记

发表评论

电子邮件地址不会被公开。 必填项已用*标注