【Spark】【配置】Spark+Hadoop分布式配置(4台服务器)

首先需要安装好JDK环境和HDFS分布式环境,hdfs配置可查看 Hadoop完全分布式配置

注:所有设备上的spark配置的文件路径必须一致,jdk和python版本也需要一致。因此最好放在/usr/
或者/home/下面,不然需要在每个设备上分别创建同样路径的文件夹。python可以使用conda下的环境。

本文使用的4台server,ip分布如下:

master

worker

10.57.175.11

10.57.175.11

10.57.175.35

10.57.175.38

10.57.175.67

  • master上的配置:
    a. 下载spark安装包
    解压到指定文件

    b. 添加环境变量,在~/.bashrc 或 /etc/profile文件后添加 SPARK_HOME等环境变量(配置过程很可能需要root权限):
```bash
  export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-amd64"
  export PATH=$JAVA_HOME/bin:$PATH
  export SPARK_HOME=/mnt/sdb/tinhao/HTlab/spark/spark-3.0.0-bin-hadoop2.7
  export PATH=.:$HADOOP_HOME/bin:$JAVA_HOME/bin:$SPARK_HOME/bin:$PATH

 ```

c. 同hadoop一样需要配置ssh无密码登录,配置方式见 【SSH免密登录】ssh免密设置总是无效?这里有完整的配置步骤

d. 在master上,一共必须配置文件的文件共有2个:spark-env.sh、slaves, 所有文件都在 yourspark/conf/ 路径下。内容如下:
spark-env.sh:

JAVA_HOME=/usr/lib/jvm/jdk-12.0.1
HADOOP_HOME=/mnt/sdb/tinhao/HTlab/spark/hadoopDistribute/hadoop-3.1.4
SPARK_MASTER_HOST=10.57.175.11
SPARK_MASTER_PORT=7077
SPARK_WORKER_INSTANCES=1
SPARK_MASTER_WEBUI_PORT=12321
SPARK_CONF_DIR=/mnt/sdb/tinhao/HTlab/spark/spark-3.0.0-bin-hadoop2.7/conf
  • HADOOP_HOME和JAVA_HOME指定了java和hadoop环境变量地址
  • SPARK_MASTER_HOST和SPARK_MASTER_PORT指定了master的IP地址和端口号
  • SPARK_WORKER_INSTANCES是每个台设备上可以起的worker数量,如果该参数设置不为1,需要配置SPARK_WORKER_CORES,限制每个worker的cpu数量,否则每个worker会默认占用全部CPU资源
  • SPARK_MASTER_WEBUI_PORT 是spark的webui端口号
  • 其他重要参数还有 SPARK_WORKER_MEMORY,用来限制每个worker可占用的内存,默认1G
    slaves
10.57.175.11
10.57.175.35
10.57.175.38
10.57.175.67

同hadoop,列出所有slave的IP或主机名
具体每个参数的意义可以参考 spark2.X集群搭建与参数详解

  • 其他节点配置:
    前面配置好了无密码ssh登录,直接scp分发本机配置到其他三个服务器的相同路径下。
    scp -r spark-3.0.0-bin-hadoop2.7 10.57.175.67:/mnt/sdb/tinhao/HTlab/spark/(这个路径是典型的错误示范,太长太复杂)
  • 启动:
    在Master节点:./sbin/start-all.sh
    启动完成后,jps命令检查运行的程序:
    Master节点:

    会有这两个进程,以及其他4个hadoop的进程
    slave节点:
  • 如果是在已启动好的Spark系统上添加新的工作节点,只需要把ssh无密码登录配置好,每个节点的slaves都增加新节点地址,scp分发好Spark文件夹,然后使用 ./sbin/start-slave.sh spark://10.57.175.11:7077 启动datanode即可(注意这里的地址填已经启动好的master的IP/主机名和port)。

登录 http://10.57.175.11:12321/ ,可以看到节点更新信息:

带有kerberos的hadoop集群扩容 spark集群和hadoop集群配置_SPARK

【pyspark使用错误解决方案】

  1. 在pyspark中使用spark的功能时,如果出现 Exception: Python in worker has different version 3.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的python版本不一致,可以在几台worker上装anaconda,建立一个相同python版本的环境,然后:
export PYSPARK_PYTHON = /home/nokia/anaconda2/envs/ad/bin/python3.6
 export PYSPARK_PYTHON=/home/nokia/anaconda2/envs/ad/bin/python3.6
  1. 如果引入pyarrow,单独使用spark和pandas都正常,但是在spark和pandas结合时(使用pandas_udf)出现以下错误:
Caused by: java.lang.UnsupportedOperationException: sun.misc.Unsafe or java.nio.Direct
ByteBuffer.<init>(long, int) not available

可以在./conf/spark-defaults.conf中添加:

spark.driver.extraJavaOptions="-Dio.netty.tryReflectionSetAccessible=true"
spark.executor.extraJavaOptions="-Dio.netty.tryReflectionSetAccessible=true"

重启后即可解决