【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/ ,可以看到节点更新信息:
【pyspark使用错误解决方案】
- 在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
- 如果引入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"
重启后即可解决