Spark集群搭建

img

[TOC]

spark环境搭建

版本总览

百度网盘下载 提取码: 7g8v

scala

下载并安装scala

  • 下载 scala-2.12

  • 安装rpm -ivh scala-2.12.15.rpm

  • 查看scala版本scala -version

配置环境

  • 查询包中文件安装位置 -l:

    • rpm -ql 包名

  • 编辑/etc/profile,文件末尾添加配置

执行source /etc/profile令其生效

其他节点同样配置即可

免密登录

修改主机名(非必须)

查看主机名用hostname 修改主机名/etc/hostname 修改后重启服务器reboot

配置host文件vi /etc/hosts

/etc/init.d/network restart

生成秘钥对

使用 RSA 类型的加密类型来创建密钥对

  • -f 参数表示指定密钥对生成位置与名称

  • 密钥对通常放在 ~/.ssh目录下

  • 回车即可创建密钥对,需要输入密码如果不需要为密钥对进行加密,那么可以一路回车

  • 有需要清空文件的可以执行truncate -s 0 authorized_keys

创建成功之后,可以看到 .ssh 目录下多了两个文件,分别是:

  1. id_key:密钥对的私钥,通常放在客户端

  2. id_rsa.pub:密钥对中的公钥,通常放在服务端

秘钥上传服务器

文件权限

将your_key.pub 公钥文件上传至需要连接的服务器

  • -i 参数表示使用指定的密钥,-p参数表示指定端口,ssh 的默认端口是 22

公钥查看

本地的公钥文件上传在服务器的.ssh/authorized_keys 文件中

免密检测

hadoop

新建用户(非必须)

新建hadoop用户

修改hadoop用户密码

切换用户

新建文件夹

关闭防火墙

关闭selinux

安装

下载并解压hadoop到/usr/hadoop-3.2.0

  • 下载 hadoop-3.2.0,解压到/usr/hadoop-3.2.0

  • 配置环境变量

  • 执行source /etc/profile令其生效

  • 查看hadoop版本,hadoop version

配置文件

Hadoop配置文件的配置,需要配置的文件有几个分别是

  • hadoop-env.sh

  • core-site.xml

  • hdfs-site.xml

  • mapred-site.xml

  • yarn-site.xml

  • workers文件

这些文件均可以在/usr/hadoop-3.2.0/etc/hadoop下找到


workers文件

旧版本以及网上的教程是修改etc/hadoop/slaves文件,但是新版已经移除了这一个文件,取而代之的是workers文件,上述设置代表我的集群有三个datanode结点

hadoop_env.sh 在hadoop根目录下执行mkdir pids,用于存放pid文件

注意的是,如果之前没有设置JAVA_HOME的环境变量,此处直接这样引用会出现错误,改用绝对路径即可消除错误。

core-site.xml

hdfs-site.xml

mapred-site.xml

yarn-site.xml

从节点设置

将hadoop目录拷贝到从节点的对应目录 仿照主节点对应的数据目录设置,设置对应的数据目录(即/data一系列目录)

hadoop启动和测试

第一次开启时首先要初始化hdfs

此处需要注意一个问题,第二次开启不需要再次初始化,遇到问题需要再次初始化,建议删除存放文件 上述配置文件中指明了存放数据的文件为dfs,到时候删除即可

主节点启动

查看进程

查看对应的数据结点是否正确

  • hdfs主页Slave03:50070,如果不行,试试默认端口9870

  • hadoop主页Slave03:8088

主要命令

  • 启动集群: ./sbin/start-all.sh

  • 关闭集群: ./sbin/stop-all.sh

常见问题

stop-all.sh的时候hadoop的相关进程都无法停止

解决方案: 参考spark的常见问题,Hadoop的pid命名规则:

因此,这里的pid文件名为:

  1. hadoop-root-datanode.pid

  2. hadoop-root-namenode.pid

  3. hadoop-root-nodemanager.pid

  4. hadoop-root-resourcemanager.pid

  5. hadoop-root-secondarynamenode.pid

通过jps查看相关进程的pid,恢复这些pid文件即可使用stop-all.sh停止hadoop,根治方案参考spark常见问题部分

spark安装

安装配置

下载解压,复制到/usr/spark-3.0

配置环境变量vi /etc/profile

执行source /etc/profile令其生效

配置spark-env.shconf文件夹下的spark-env.sh.template重命名为spark-env.sh,并添加以下内容: 在spark根目录下执行mkdir pids,用于存放pid文件

配置slavesconf文件夹下的slaves.template重命名为slaves,并添加以下内容:

配置从节点(将spark目录复制到其他节点的同一个目录下)

sbin目录下使用start-all.sh启动集群

image-20220125113759221

启动成功后,我们在浏览器输入Slave03:8080看到有三个结点,就代表我们安装成功了。 如果发现启动错误,请查看logs目录下的日志,自行检查配置文件!

日志配置

配置spark的执行日志等级,进入到spark根目录下的conf目录 cp log4j.properties.template log4j.properties,修改配置如下

主要命令

  • 启动集群: ./sbin/start-all.sh

  • 关闭集群: ./sbin/stop-all.sh

常见问题

stop-all.sh的时候spark的相关进程都无法停止

$SPARK_PID_DIR中存放的是pid文件,就是要停止进程的pid。其中$SPARK_PID_DIR默认是在系统的/tmp目录 系统每隔一段时间就会清除/tmp目录下的内容。到/tmp下查看一下,果然没有相关进程的pid文件了。 这才导致了stop-all.sh无法停止集群。 解决方案: $SPARK_PID_DIR下新建pid文件,pid文件命名规则如下

  • $SPARK_PID_DIR默认是/tmp

  • $SPARK_IDENT_STRING是登录用户$USER,我的集群中用户名是root

  • $command是调用spark-daemon.sh时的参数,有两个:

    1. org.apache.spark.deploy.master.Master

    2. org.apache.spark.deploy.worker.Worker

  • $instance也是调用spark-daemon.sh时的参数,我的集群中是1

因此pid文件名如下(名字不对的情况下,可以执行./start-all.sh,重新启动查看后,再执行./stop-all.sh进行本次集群的关闭,注意这里关闭的是本次打开的,之前无法关闭的进程仍然还在):

  1. spark-root-org.apache.spark.deploy.master.Master-1.pid

  2. spark-root-org.apache.spark.deploy.worker.Worker-1.pid

通过jps查看相关进程的pid,将pid保存到对应的pid文件即可,之后调用spark的stop-all.sh,即可正常停止spark集群 要根治这个问题,只需要在集群所有节点都设置$SPARK_PID_DIR$HADOOP_PID_DIR$YARN_PID_DIR即可

pyspark

环境配置

基础环境

spark集群服务器配置环境变量,vi /etc/profile

执行source /etc/profile使其生效

安装pyspark库

对于spark服务器和work间环境不一致的情况

  • 方式一: 重新安装python虚拟环境,使得路径完全一致

  • 方式二: 配置软链接

在服务器 liunx 环境上修改查看python的包路径site-package

graphx环境

安装graphframes

graphframes官网下载对应jar包,这里spark集群是3.0.3,所以可以下载Version: 0.8.2-spark3.0-s_2.12这个版本的 复制到spark根目录下的jars目录中,集群中每个节点都需要 如果还会出错,可以把该jar包也复制一份到python环境下 /opt/anaconda/install/envs/ray37/lib/python3.7/site-packages/pyspark/jars

配置远程解释器

配置连接

配置连接的远程服务器

打开Pycharm -> Tools -> Deployment -> Configuration

点击加号,选择SFTP,给服务器取一个名字

点击SSH configuration后面的省略号 输入服务器IP地址账号密码,结束后测试一下连接情况 Connection Parameters下的心跳可以设置10秒 确认后,保存退出当前窗口

点击自动检测 ,选择远程服务器的工作路径 这里选的是,自己提前新建的空文件夹/home/huangyc/hyc_test

Mappings下选择Local path,配置当前项目的路径 保存,退出

配置解释器

选择远程的解释器

img

点击move即可next 配置路径,远程的选择自己之前新建的/home/huangyc/hyc_test Automatically upload ...表示会自动上传项目到服务器中

img

其它功能

  • Pycharm上显示远程代码:选择Tools -->Deployment-->Browse Remote Host

  • 更新代码:将本地代码上传到服务器上Tools -->Deployment-->upload to

  • 服务器上代码下载到本地代码上Tools -->Deployment-->Download from

测试例子

简单词统计 + pagerank例子

执行方法

  • 可以直接在pycharm中执行,这里pycharm使用的是远程的python环境,这里执行时的内存是默认值 1024.0 MiB

    在pycharm中执行可能需要加上变量设置,但使用spark-submit则可以不需要

  • 或者执行以下命令执行,这里执行时的内存是spark中配置的 8.0 GiB

本地连接

除了配置远程服务器的py解释器,还可以配置本地的模式

需要在spark集群中配置host映射,通过vi /etc/hosts命令打开hosts文件,添加本地的主机名映射

最后执行/etc/init.d/network restart刷新DNS 如果没有的话,可能会报错误 Caused by: java.io.IOException: Failed to connect to DSE-20191111ZOU:65320 Caused by: java.net.UnknownHostException: DSE-20191111ZOU

py代码中需要添加以下的环境参数才能连接上spark集群

⚡: 本地的python版本尽量和spark集群上的一致,避免不必要的错误

常见问题

Last updated

Was this helpful?