Spark集群搭建
spark环境搭建
版本总览
1 | (ray37) [root@Slave03 huangyc]# java -version |
百度网盘下载 提取码:
7g8v
scala
下载并安装scala
- 下载 scala-2.12
- 安装
rpm -ivh scala-2.12.15.rpm
- 查看scala版本
scala -version
配置环境
查询包中文件安装位置 -l:
rpm -ql 包名
编辑
/etc/profile
,文件末尾添加配置1
2
3# 配置scala环境变量
export SCALA_HOME=/usr/share/scala/bin
export PATH=$PATH:$SCALA_HOME
执行source /etc/profile
令其生效
其他节点同样配置即可
免密登录
修改主机名(非必须)
查看主机名用
hostname
修改主机名/etc/hostname
修改后重启服务器reboot
配置host文件
vi /etc/hosts
1 | 192.168.123.21 Slave00 |
/etc/init.d/network restart
生成秘钥对
使用
RSA
类型的加密类型来创建密钥对
1 | # 生成秘钥(-f换名字好像不行) |
- -f 参数表示指定密钥对生成位置与名称
- 密钥对通常放在
~/.ssh
目录下 - 回车即可创建密钥对,需要输入密码如果不需要为密钥对进行加密,那么可以一路回车
- 有需要清空文件的可以执行
truncate -s 0 authorized_keys
创建成功之后,可以看到 .ssh 目录下多了两个文件,分别是:
- id_key:密钥对的私钥,通常放在客户端
- id_rsa.pub:密钥对中的公钥,通常放在服务端
秘钥上传服务器
文件权限
1 | sudo chmod -R 700 ~/.ssh |
将your_key.pub 公钥文件上传至需要连接的服务器
1 | # 方式一:追加在其他服务器文件末尾(本机不需要) |
- -i 参数表示使用指定的密钥,-p参数表示指定端口,ssh 的默认端口是 22
公钥查看
本地的公钥文件上传在服务器的.ssh/authorized_keys 文件中
1 | cat ~/.ssh/authorized_keys |
免密检测
1 | ssh Slaver00 |
hadoop
新建用户(非必须)
新建hadoop用户
1 | useradd -m hadoop -s /bin/bash |
修改hadoop用户密码
1 | passwd hadoop |
切换用户
1 | su hadoop |
新建文件夹
1 | mkdir /home/hadoop/apps |
关闭防火墙
1 | systemctl stop firewalld |
关闭selinux
1 | vim /etc/sysconfig/selinux |
安装
下载并解压hadoop到
/usr/hadoop-3.2.0
下载 hadoop-3.2.0,解压到
/usr/hadoop-3.2.0
配置环境变量
1
2export HADOOP_HOME=/usr/hadoop-3.2.0
export PATH=$PATH:$HADOOP_HOME执行
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文件
1 | Slave00 |
旧版本以及网上的教程是修改etc/hadoop/slaves
文件,但是新版已经移除了这一个文件,取而代之的是workers
文件,上述设置代表我的集群有三个datanode
结点
hadoop_env.sh
在hadoop根目录下执行mkdir pids
,用于存放pid文件
1 | export JAVA_HOME=${JAVA_HOME} #设置JAVA_HOME的路径,需要再次指明 |
注意的是,如果之前没有设置JAVA_HOME的环境变量,此处直接这样引用会出现错误,改用绝对路径即可消除错误。
core-site.xml
1 | <!-- Put site-specific property overrides in this file. --> |
hdfs-site.xml
1 | <!-- Put site-specific property overrides in this file. --> |
mapred-site.xml
1 | <!-- Put site-specific property overrides in this file. --> |
yarn-site.xml
1 | <configuration> |
从节点设置
将hadoop目录拷贝到从节点的对应目录
仿照主节点对应的数据目录设置,设置对应的数据目录(即/data一系列目录)
hadoop启动和测试
第一次开启时首先要初始化hdfs
1 | cd /usr/hadoop-3.2.0 |
此处需要注意一个问题,第二次开启不需要再次初始化,遇到问题需要再次初始化,建议删除存放文件
上述配置文件中指明了存放数据的文件为dfs,到时候删除即可
主节点启动
1 | cd /usr/hadoop-3.2.0/sbin |
查看进程
1 | # 主节点 |
查看对应的数据结点是否正确
1 | [root@Slave03 sbin]# hdfs dfsadmin -report |
- hdfs主页
Slave03:50070
,如果不行,试试默认端口9870
- hadoop主页
Slave03:8088
主要命令
- 启动集群:
./sbin/start-all.sh
- 关闭集群:
./sbin/stop-all.sh
常见问题
stop-all.sh的时候hadoop的相关进程都无法停止
解决方案: 参考spark的常见问题,Hadoop的pid命名规则:
1 | pid=$HADOOP_PID_DIR/hadoop-$HADOOP_IDENT_STRING-$command.pid |
因此,这里的pid文件名为:
- hadoop-root-datanode.pid
- hadoop-root-namenode.pid
- hadoop-root-nodemanager.pid
- hadoop-root-resourcemanager.pid
- hadoop-root-secondarynamenode.pid
通过jps查看相关进程的pid,恢复这些pid文件即可使用stop-all.sh停止hadoop,根治方案参考spark常见问题部分
spark安装
安装配置
下载解压,复制到
/usr/spark-3.0
配置环境变量
vi /etc/profile
1 | # 配置spark环境 |
执行source /etc/profile
令其生效
配置
spark-env.sh
将conf
文件夹下的spark-env.sh.template
重命名为spark-env.sh
,并添加以下内容:
在spark根目录下执行mkdir pids
,用于存放pid文件
1 | # 环境变量 |
配置
slaves
将conf
文件夹下的slaves.template
重命名为slaves
,并添加以下内容:
1 | Slave00 |
配置从节点(将spark目录复制到其他节点的同一个目录下)
1 | scp -r root@192.168.123.24:/usr/spark-3.0 /usr/ |
在
sbin
目录下使用start-all.sh
启动集群
启动成功后,我们在浏览器输入Slave03:8080
看到有三个结点,就代表我们安装成功了。
如果发现启动错误,请查看logs
目录下的日志,自行检查配置文件!
日志配置
配置spark的执行日志等级,进入到spark根目录下的
conf
目录cp log4j.properties.template log4j.properties
,修改配置如下
1 | # Set everything to be logged to the console |
主要命令
- 启动集群:
./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文件命名规则如下
1 | $SPARK_PID_DIR/spark-$SPARK_IDENT_STRING-$command-$instance.pid |
$SPARK_PID_DIR
默认是/tmp
$SPARK_IDENT_STRING
是登录用户$USER
,我的集群中用户名是root$command
是调用spark-daemon.sh时的参数,有两个:- org.apache.spark.deploy.master.Master
- org.apache.spark.deploy.worker.Worker
$instance
也是调用spark-daemon.sh时的参数,我的集群中是1
因此pid文件名如下(名字不对的情况下,可以执行./start-all.sh
,重新启动查看后,再执行./stop-all.sh
进行本次集群的关闭,注意这里关闭的是本次打开的,之前无法关闭的进程仍然还在):
- spark-root-org.apache.spark.deploy.master.Master-1.pid
- 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
即可
1 | # 修改hadoop-env.sh,增加: |
pyspark
环境配置
基础环境
spark集群服务器配置环境变量,
vi /etc/profile
1 | export PYSPARK_PYTHON=/root/anaconda3/envs/ray37/bin/python3.7 |
执行source /etc/profile
使其生效
安装pyspark库
1 | # 这里需要注意版本需要和spark的版本一致 |
对于spark服务器和work间环境不一致的情况
方式一: 重新安装python虚拟环境,使得路径完全一致
方式二: 配置软链接
1
2
3ln -s 源文件 目标文件
# 需要事先建好路径
ln -s /opt/anaconda/install/envs/ray37/bin/python3.7 /root/anaconda3/envs/ray37/bin/python3.7
在服务器 liunx 环境上修改查看python的包路径site-package
1 | from distutils.sysconfig import get_python_lib |
graphx环境
安装graphframes
1 | pip install graphframes==0.6 |
去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中,可以使用远程配置解释器和项目功能来进行远程开发。这使您可以在本地使用PyCharm编写代码,并将代码部署和运行在远程服务器上。下面是对远程配置解释器和项目的解释:
- 远程配置解释器:远程配置解释器是指在PyCharm中设置和使用位于远程服务器上的解释器。这样,您可以在本地的PyCharm中编写代码,并使用远程服务器上的Python解释器来运行和调试代码。通过远程配置解释器,您可以利用服务器上的计算资源和环境来开发和测试代码
- 远程配置项目:远程配置项目是指将整个项目与远程服务器相关联,以便在远程服务器上运行和管理项目。通过远程配置项目,您可以在本地的PyCharm中编辑代码,并将更改同步到远程服务器上的项目目录。您可以使用远程配置项目来访问和管理远程服务器上的文件、库和其他资源
配置远程连接
配置连接的远程服务器
本地先新建文件夹,用于存放远程项目,新建完用pycharm打开项目
打开
Pycharm -> Tools -> Deployment -> Configuration
,点击加号,选择SFTP,给服务器取一个名字点击SSH configuration后面的省略号
输入服务器IP地址
和账号密码
,结束后测试一下连接情况Connection Parameters
下的心跳可以设置10秒
确认后,保存退出当前窗口Connection选项卡点击自动检测,获取远程服务器的工作路径
Mappings选项卡的Local path选择一开始新建的文件夹,Deployment path选择远程项目的路径,这里为了避免不必要的麻烦,远程项目最好赋予777权限
保存,退出
右键项目名称,选择Deployment下的Download from …,此时会将服务器上的项目同步到本地
配置解释器
选择远程的解释器
点击move即可next
配置路径,远程的选择自己之前新建的/home/huangyc/hyc_test
Automatically upload ...
表示会自动上传项目到服务器中
其它功能
- 在
Pycharm
上显示远程代码:选择Tools -->Deployment-->Browse Remote Host
- 更新代码:将本地代码上传到服务器上
Tools -->Deployment-->upload to
- 服务器上代码下载到本地代码上
Tools -->Deployment-->Download from
,如果无效,就右击项目下的Deployment
测试例子
简单词统计 + pagerank例子
1 | #!/usr/bin/env Python |
执行方法
可以直接在pycharm中执行,这里pycharm使用的是远程的python环境,这里执行时的内存是默认值 1024.0 MiB
在pycharm中执行可能需要加上变量设置,但使用
spark-submit
则可以不需要1
2os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/envs/ray37/bin/python3.7"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/envs/ray37/bin/python3.7"或者执行以下命令执行,这里执行时的内存是spark中配置的 8.0 GiB
1
./bin/spark-submit --master spark://192.168.xx.xx:7077 /home/huangyc/hyc_test/tests/pyspark_test/connenct_test.py
本地连接
除了配置远程服务器的py解释器,还可以配置本地的模式
需要在spark集群中配置host映射,通过
vi /etc/hosts
命令打开hosts文件,添加本地的主机名映射
1 | # hyc |
最后执行/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集群
1 | import os |
⚡: 本地的python版本尽量和spark集群上的一致,避免不必要的错误