【转载】Spark集群环境搭建——服务器环境初始化
转自doublexi: https://www.cnblogs.com/doublexi/p/15623436.html
Spark也是属于Hadoop生态圈的一部分,需要用到Hadoop框架里的HDFS存储和YARN调度,可以用Spark来替换MR做分布式计算引擎。
接下来,讲解一下spark集群环境的搭建部署。
一、集群规划
我们这里使用三台Linux服务器来搭建一个Spark集群。各个组件的分布规划如下:
二、服务器环境初始化
系统初始化:
1、设置系统IP (三台机器都要设置)
每个人的环境都不一样,根据自己的网络环境,设置自己三台机器的ip,最好设置为静态ip,不要每次都从DHCP获取,避免ip发生变动。
我们这里三台机器的ip如下:
dev-spark-master-206:192.168.90.206 dev-spark-slave-171:192.168.90.171 dev-spark-slave-172:192.168.90.172
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 | # dev-spark-master-206 # vi /etc/sysconfig/network-scripts/ifcfg-enp2s0 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static # 改为静态ip DEFROUTE= yes IPV4_FAILURE_FATAL=no IPV6INIT= yes IPV6_AUTOCONF= yes IPV6_DEFROUTE= yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=enp2s0 UUID=d7af5ebf-4755-4a35-bcd6-267ab7adbba6 DEVICE=enp2s0 ONBOOT= yes # 开启网卡 IPADDR=192.168.90.206 # 设置属于自己网络的静态ip NETMASK=255.255.255.0 # 设置掩码 GATEWAY=192.168.90.1 # 设置网关 DNS1=202.96.128.166 # 设置DNS地址 DNS2=8.8.8.8 # 设置副DNS地址 |
重启网络
01 | systemctl restart network |
三台机器都要配置好ip,并确保可以上外网。
2、关闭系统防火墙 (三台机器都要设置)
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # 先查看selinux状态 [root@localhost ~] # getenforce permissive [root@localhost ~] # setenforce 0 # 修改selinux状态为disabled [root@localhost ~] # vim /etc/sysconfig/selinux # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # 修改为disabled # SELINUXTYPE= can take one of three values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted [root@localhost ~] # 关闭firewalld # 查看当前状态 [root@localhost ~] # systemctl status firewalld # 关闭 [root@localhost ~] # systemctl stop firewalld [root@localhost ~] # systemctl disable firewalld # 清除iptables规则 [root@localhost ~] # iptables -F |
3、更换yum源,可选 (三台机器一起设置)
01 02 03 04 05 | # 这里使用aliyun的yum源 wget -O /etc/yum .repos.d /CentOS-Base .repo http: //mirrors .aliyun.com /repo/Centos-7 .repo # 清除yum缓存 yum clean all yum makecache |
4、安装基础软件包 (三台机器一起设置)
01 02 | yum install -y net-tools vim lrzsz wget tree lsof tcpdump bash -completion.noarch ntp zip unzip git lvm2 yum install -y gcc gcc -c++ libstdc++ make cmake curl bind-utils |
5、设置hostname (三台机器一起设置)
我们三台机器的规划是:(可以根据自己的习惯,单独命名)
dev-spark-master-206:192.168.90.206 dev-spark-slave-171:192.168.90.171 dev-spark-slave-172:192.168.90.172
所以依次设置主机名:
在第一台机器上,修改主机名
01 | hostnamectl set - hostname dev-spark-master-206 |
第二台机器上,修改主机名
01 | hostnamectl set - hostname dev-spark-slave-171 |
第三台机器上,修改主机名:
01 | hostnamectl set - hostname dev-spark-slave-172 |
编辑hosts配置(三台机器都要配置)
三台机器都配置好IP之后,为了方便互相访问,可以配置hosts配置,使用主机名来访问。
01 02 03 04 05 06 | # 编辑hosts文件,增加以下配置,根据自己的环境,修改为自己的ip和主机名。 # vim /etc/hosts 192.168.90.206 dev-spark-master-206 192.168.90.171 dev-spark-slave-171 192.168.90.172 dev-spark-slave-172 |
6、设置ssh免密登录 (三台机器)
1) 在第一台机器上生成一对钥匙,公钥和私钥
01 | # 输入命令,生成秘钥<br>ssh-keygen -t rsa |
当前用户的宿主目录下的.ssh目录多了两个文件,一个是私钥,一个是公钥
01 | ll /root/ . ssh / |
2) 将公钥拷贝给要免密码登录的机器
将本机生成的公钥id_rsa.pub文件拷贝到另外两台机器,就可以从另外两台机器免密登录本机了。
拷贝到dev-spark-slave-171上:
01 | # ssh-copy-id root@dev-spark-slave-171 |
拷贝到dev-spark-slave-172上:
01 | # ssh-copy-id root@dev-spark-slave-172 |
01 |
注意:
注意: 1.主机名和ip都可以(确保配置了主机名 ip的映射) 2.如果出现-bash: ssh-copy-id: command not found,说明ssh-copy-id这个指令没有找到,自己安装下即可 安装命令:yum -y install openssh-clients
如果感觉ssh-copy-id这个命令不好使,你也可以自己新建authorized_keys文件,把公钥贴进去
01 02 03 04 05 06 07 08 09 10 11 | # 在另外两台机器上 # 查看.ssh目录是否存在 ll /root/ . ssh # 不存在则创建 mkdir /root/ . ssh # 编辑authorized_keys,将第一台机器上生成的id_rsa.pub文件里的内容复制,粘贴在这里。 vim /root/ . ssh /authorized_keys # 因为是自己创建的文件,需要修改权限,文件目录权限不能错 chown -R root.root /root/ . ssh chmod 700 /root/ . ssh chmod 600 /root/ . ssh /authorized_keys |
3)拷贝完成之后,会在要免密登录的机器(另外两台机器)上生成授权密码文件
在dev-spark-slave-171上,尝试免密登录dev-spark-master-206
01 | ssh root@dev-spark-master-206 |
在dev-spark-slave-172上,尝试免密登录dev-spark-master-206
01 | ssh root@dev-spark-master-206 |
4)、在另外两台机器上,重复上述1-3步骤。
注意:免密码登录是单向的,必须要在另外两台机器也生成一对公钥私钥,并把公钥发送到其他服务器上。
最后的结果是:三台机器上,每台机器都有其他两台机器的公钥。才能实现三台机器互相免密登录。(并且需要保证/etc/ssh/sshd_config中的 PubkeyAuthentication值为Yes,不能被注释掉)
7、设置时间 (三台机器)
01 02 03 04 05 06 07 08 09 10 | # ll /etc/localtime lrwxrwxrwx. 1 root root 35 Aug 1 2020 /etc/localtime -> .. /usr/share/zoneinfo/Asia/Shanghai # 如果不正确,则修改 mv /etc/localtime /etc/localtime_bak ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 时钟同步: # 这里使用aliyun的时钟服务器 crontab -e * /30 * * * * ntpdate ntp1.aliyun.com |
8、时钟同步:
时间同步的方式:在集群中找一台机器,作为时间服务器。(以master为主)
01 02 03 04 | 通过网络连接外网进行时钟同步,必须保证虚拟机连上外网 ntpdate us.pool.ntp.org; 阿里云时钟同步服务器 ntpdate ntp4.aliyun.com |
集群中其他机器与这台机器定时的同步时间,比如,每 隔十分钟,同步一次时间。
8.1、时间服务器配置(必须root用户)(在master上设置)
第一步:确定是否安装了ntpd的服务
01 02 03 04 05 06 07 08 | 如果没有安装,可以进行在线安装 yum -y install ntp 启动ntpd的服务 systemctl start ntpd 设置ntpd的服务开机启动 systemctl enable ntpd 确定是否安装了ntpd的服务 rpm -qa | grep ntpd |
第二步:编辑/etc/ntp.conf
01 02 03 04 05 06 07 08 09 10 11 12 | 编辑第一台机器器的 /etc/ntp .conf vim /etc/ntp .conf 在文件中添加如下内容 restrict 192.168.90.0 mask 255.255.255.0 nomodify notrap 注释一下四⾏行行内容 #server 0.centos.pool.ntp.org #server 1.centos.pool.ntp.org #server 2.centos.pool.ntp.org #server 3.centos.pool.ntp.org 去掉以下内容的注释,如果没有这两行注释,那就自己添加上 server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10 |
配置以下内容,保证BIOS与系统时间同步 vim /etc/sysconfig/ntpd
添加一行内容
01 | SYNC_HWLOCK= yes |
第三步:
重新启动ntpd
01 02 | systemctl restart ntpd systemctl status ntpd |
8.2、其他机器配置(必须root用户)
第一步:在其他机器配置10分钟与时间服务器同步一次
01 02 03 | # 另外两台机器与192.168.90.206进行时钟同步 # crontab -e * /10 * * * * /usr/sbin/ntpdate 192.168.90.206 |
9、安装jdk (三台机器都要配置)
jdk下载地址:https://www.oracle.com/java/technologies/downloads/#java8
查看自带的openjdk
01 | rpm -qa | grep java |
如果有自带的,卸载系统自带的openjdk
01 | # 将上面找出来的包复制到下面命令中,使用rpm -e卸载<br>rpm -e java-1.6.0-openjdk-1.6.0.41-1.13.13.1.el6_8.x86_64 tzdata-java-2016j-1.el6.noarch java-1.7.0-openjdk-1.7.0.131-2.6.9.0.el6_8.x86_64 --nodeps |
创建软件包目录:
01 02 | mkdir -p /data/apps/shell/software mkdir /usr/java |
软件安装目录:/data/apps
自己去oracle官网下载指定版本的jdk,这里使用的是jdk1.8
上传jdk并解压然后配置环境变量
01 02 | cd /data/apps/shell/software tar xf jdk-8u162-linux-x64. tar .gz -C /usr/java/ |
配置环境变量:
01 02 03 04 05 | vim /etc/profile # jdk1,8 export JAVA_HOME= /usr/java/jdk1 .8.0_162 export CLASSPATH=.:$JAVA_HOME /jre/lib/rt .jar:$JAVA_HOME /lib/dt .jar:$JAVA_HOME /lib/tools .jar export PATH=$PATH:$JAVA_HOME /bin |
加载profile使立即生效:
01 | source /etc/profile |
测试jdk是否生效:
01 02 03 04 | # java -version java version "1.8.0_162" Java(TM) SE Runtime Environment (build 1.8.0_162-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode) |
10、编写rsync-script工具:
rsync 远程同步工具
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。
scp是把所有文件都复制过去。
基本语法
01 | rsync -rvl $pdir/$fname $user@$host:$pdir/$fname |
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
rsync案例
10.1、三台虚拟机安装rsync (系统默认已经安装了)
01 | yum install rsync -y |
10.2、期望脚本
脚本+要同步的文件名称
10.3. 说明:在/usr/local/bin这个目录下存放的脚本,root用户可以在系统任何地方直接执行。
10.4. 脚本实现
01 02 | touch rsync -script vim rsync -script |
脚本内容如下:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #!/bin/bash #1 获取命令输入参数的个数,如果个数为0,直接退出命令 paramnum=$ # if ((paramnum==0)); then echo no params; exit ; fi #2 根据传入参数获取文件名称 p1=$1 file_name=` basename $p1` echo fname=$file_name #3 获取输入参数的绝对路径 pdir=` cd -P $( dirname $p1); pwd ` echo pdir=$pdir #4 获取用户名称 user=` whoami ` #5 循环执行rsync host_arr=( "dev-spark-master-206" "dev-spark-slave-171" "dev-spark-slave-172" ) for host in ${host_arr[@]}; do echo ------------------- $host -------------- rsync -rvl $pdir/$file_name $user@$host:$pdir done |
赋予权限:
01 02 | chmod 777 rsync -script cp rsync -script /usr/local/sbin/ |
测试:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 | touch test # rsync-script test fname= test pdir= /data/apps/shell ------------------- dev-spark-master-206 -------------- sending incremental file list sent 40 bytes received 12 bytes 104.00 bytes /sec total size is 0 speedup is 0.00 ------------------- dev-spark-slave-171 -------------- sending incremental file list test sent 83 bytes received 35 bytes 236.00 bytes /sec total size is 0 speedup is 0.00 ------------------- dev-spark-slave-172 -------------- sending incremental file list test sent 83 bytes received 35 bytes 78.67 bytes /sec total size is 0 speedup is 0.00 |