本文详细阐述如何搭建Spark集群,并分别使用Maven和SBT编译部署Spark,最后在CentOS中安装IDEA进行开发。
CentOS 7
JDK:1.8
Spark:2.0.0、2.2.0
Scala:2.11.8
Hadoop: 2.7
Maven:3.3.9
以下所有步骤均亲自完成并详细截图!(本文为原创,转载请标明本文地址,谢谢!)
一、准备工作:
CentOS镜像:http://mirrors.163.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1708.iso
二、用VMware搭建虚拟机集群
1.规划
master:1核、4G内存
slave1:1核、2G内存
slave2:1核、2G内存
2.搭建一个样板虚拟机
接下来进入安装,期间需设置语言、密码。
选择语言,我这里选择英文,您也可以下拉选择中文
等待数秒。。。
选择软件安装(重要)
这里给出中文翻译,参考选择
等待数秒,设置安装位置
点击一下就行
点进去自行设置密码、用户
完成,重启
然后
网络进去后在配置
————————————
3登录进入CentOS,进行相关配置
设置ip地址
注意:这里的ip,子网掩码,网关,DNS是根据我的笔记本电脑上的网络情况设定的,请您根据您的实际情况设置
这是我windows笔记本网络
设置主机名
打开终端,以root登录
[root@localhost spark]# vi /etc/sysconfig/network
添加或修改:
NETWORKING=yes
HOSTNAME=master
[root@localhost spark]# vi /etc/hosts
添加:
192.168.1.191 master
192.168.1.192 slave1
192.168.1.193 slave2
(slave1、2 见下文)
关闭防火墙和SELinux(Hadoop和Spark运行时需要通过端口通信,关闭其就不会受到阻拦)
查看系统
[root@localhost spark]# rpm -q centos-release centos-release-7-4.1708.el7.centos.x86_64
CentOS 7 查看防火墙状态
[root@localhost spark]# firewall-cmd --state running
关闭并禁止开机启动防火墙
[root@localhost spark]# systemctl stop firewalld.service [root@localhost spark]# systemctl disable firewalld.service Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. [root@localhost spark]# firewall-cmd --state not running
关闭SELinux
[root@localhost spark]# vi /etc/selinux/config
修改:SELINUX=disabled
重启
————————
更新OpenSSL(防止编译过程无法通过ssh连接节点)
[root@localhost spark]# yum update openssl
更改OpenSSL配置(确认使用RSA算法)
[root@localhost spark]# vi /etc/ssh/sshd_config
设置以下三项:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
重启ssh
[root@localhost spark]# service sshd restart
创建Spark用户目录,方便管理(前面装系统时设置了用户和用户组)
[root@localhost spark]# vi /etc/sysconfig/network [root@localhost spark]# mkdir /spark [root@localhost spark]# mkdir /spark/soft [root@localhost spark]# mkdir /spark/compile [root@localhost spark]# chown -R spark:spark /spark/
下载
jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
scala:https://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.tgz
[root@localhost Downloads]# mv /home/spark/Downloads/jdk-8u162-linux-x64.tar.gz /spark/soft/ [root@localhost Downloads]# mv /home/spark/Downloads/scala-2.11.8.tgz /spark/soft/ [root@localhost Downloads]# mv /home/spark/Downloads/spark-2.0.0.tgz /spark/soft/
[root@localhost soft]# cd /spark/soft/ [root@localhost soft]# tar -zxvf scala-2.11.8.tgz [root@localhost soft]# tar -zxvf jdk-8u162-linux-x64.tar.gz
配置环境变量
[root@localhost soft]# vi /etc/profile
最后一行添加:
export JAVA_HOME=/spark/soft/jdk1.8.0_162
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CLASSPATH
export PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
export SCALA_HOME=/spark/soft/scala-2.11.8
export PATH=$PATH:$SCALA_HOME/bin
保存配置:
[root@localhost soft]# source /etc/profile
配置使用上面的jdk
[root@localhost soft]# update-alternatives --install /usr/bin/java java /spark/soft/jdk1.8.0_162 170130 [root@localhost soft]# update-alternatives --config java
4配置集群环境
将上面做好的样板虚拟机,克隆2份,再修改ip和主机名。
先关机
右键-管理-克隆
然后重复克隆操作
更改slave1、2的内存配置
slave1、2操作相同
然后启动master、slave1、slave2
修改网络连接(3个节点操作相同)
打开终端,root登录
[root@localhost spark]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改:
修改主机名(salve1、2相同操作)
[root@slave1 spark]# vi /etc/sysconfig/network
重启master、slave1、2
————————————
配置SSH无密码登录
3个节点都打开终端(注意不是root登录,而是spark用户登录)
[spark@master ~]$ ssh-keygen -t rsa
[spark@slave1 ~]$ ssh-keygen -t rsa
[spark@slave2 ~]$ ssh-keygen -t rsa
然后按回车多次得到
3个节点对应以下操作(注意看主机名操作,别搞混淆了)
[spark@master ~]$ cd /home/spark/.ssh/ [spark@master .ssh]$ mv id_rsa.pub master.pub
[spark@slave1 .ssh]$ cd /home/spark/.ssh/ [spark@slave1 .ssh]$ mv id_rsa.pub slave1.pub [spark@slave1 .ssh]$ scp slave1.pub spark@master:/home/spark/.ssh/(注:之后输入yes,再输入密码)
[spark@slave2 ~]$ cd /home/spark/.ssh/ [spark@slave2 .ssh]$ mv id_rsa.pub slave2.pub [spark@slave2 .ssh]$ scp slave2.pub spark@master:/home/spark/.ssh/
如下
在master节点是合并
[spark@master .ssh]$ cat master.pub >> authorized_keys [spark@master .ssh]$ cat slave1.pub >> authorized_keys [spark@master .ssh]$ cat slave2.pub >> authorized_keys
得到
把合并的公钥发送到两个节点
[spark@master .ssh]$ scp authorized_keys spark@slave1:/home/spark/.ssh/ (同样需要输入yes,密码) [spark@master .ssh]$ scp authorized_keys spark@slave2:/home/spark/.ssh/
配置权限(3个节点均需要)
[spark@master .ssh]$ chmod 400 authorized_keys
[spark@slave1 .ssh]$ chmod 400 authorized_keys
[spark@slave2 .ssh]$ chmod 400 authorized_keys
验证ssh(3个节点都验证)
ssh master ssh slave1 ssh slave2
如果通就好,可能让输入yes,输入即可,如
三、编译Spark
在master节点上进行以下操作(不想编译可直接看:四)
1解压Spark
下载spark源码(2.0.0):https://archive.apache.org/dist/spark/spark-2.0.0/spark-2.0.0.tgz
下载spark源码(2.2.0):https://www.apache.org/dyn/closer.lua/spark/spark-2.2.0/spark-2.2.0.tgz
下载完成后解压,配置国内阿里镜像
[spark@master ~]$ mv /home/spark/Downloads/spark-2.0.0.tgz /spark/compile/ [spark@master ~]$ cd /spark/compile/ [spark@master compile]$ tar -zxf spark-2.0.0.tgz [spark@master compile]$ cd spark-2.0.0/ [spark@master spark-2.0.0]$ vi pom.xml
修改url为:<url>http:
//maven.aliyun.com/nexus/content/groups/public/</url>
注:修改两处,您可以输入 / 然后输入repo1定位到那里
2使用Maven编译Spark
Maven:https://archive.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
[spark@master ~]$ mv /home/spark/Downloads/apache-maven-3.3.9-bin.tar.gz /spark/soft/ [spark@master ~]$ cd /spark/soft/ [spark@master soft]$ tar -zxvf apache-maven-3.3.9-bin.tar.gz
配置环境变量(使用root用户)
[root@master soft]# vi /etc/profile
最后添加:
export MAVEN_HOME=/spark/soft/apache-maven-3.3.9
export PATH=$PATH:${MAVEN_HOME}/bin
验证
[root@master soft]# vi /etc/profile [root@master soft]# source /etc/profile [root@master soft]# mvn -version
——————————
注:下面的编译,阁下可以选择2.2.0,也可以选择2.0.0,我的截图为2.0.0的,使用root权限编译,初次编译会下载很多东西,根据网络情况,可能需要一个多小时。我在测试时编译过多次,所以19分钟完事。
开始编译(2.0.0)
[root@master ~]$ cd /spark/compile/ [root@master compile]# cp -r spark-2.0.0 spark-2.0.0-mvn [root@master compile]# cd spark-2.0.0-mvn/
[root@master spark-2.0.0-mvn]# ./build/mvn -Pyarn -Phadoop-2.7 -Pspark-ganglia-lgpl -Pkinesis-asl -Phive -DskipTests clean package
然后构建部署包(生成tar.gz)
./dev/make-distribution.sh --name dev --tgz -Pyarn -Phadoop-2.7 -Phadoop-provided -Phive -Phive-thriftserver -Pnetlib-lgpl
最后出现
——————————
同理编译2.2.0也可以得到
3使用SBT编译Spark
[root@master spark]# cd /spark/compile/ [root@master compile]# cp -r spark-2.0.0 spark-2.0.0-sbt [root@master compile]# cd spark-2.0.0-sbt/ [root@master spark-2.0.0-sbt]# build/sbt assembly -Pyarn -Phadoop-2.7 -Pspark-ganglia-lgpl -Pkinesis-asl-Phive
注:我在SBT编译时,提示SBT下载网络代理有错,试了多种方法未果,遂放置。建议使用maven编译,或者无定制版本需求的话直接下载官网提供编译好的包。
四搭建Spark集群
安装包准备:
可以用上一步编译好的(2.0.0):spark-2.0.0-bin-dev.tgz(位于/spark/compile/spark-2.0.0-mvn/)
或者上一步编译好的(2.2.0):spark-2.2.0-bin-dev.tgz(位于/spark/compile/spark-2.2.0mvn/)
也可以到官网下载编译好Spark的版本:http://spark.apache.org/downloads.html
Hadoop:http://archive.apache.org/dist/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz
master节点下操作:
1搭建hadoop集群环境(如果下载Spark官网spark-2.x.x-bin-hadoop2.x.tgz则可以不用这一步)
[spark@master ~]$ mkdir /spark/hadoop/ [spark@master ~]$ mkdir /spark/hadoop/data [spark@master ~]$ mkdir /spark/hadoop/name [spark@master ~]$ mkdir /spark/hadoop/tmp [spark@master ~]$ mv /home/spark/Downloads/hadoop-2.7.2.tar.gz /spark/soft/ [spark@master soft]$ tar -zxf hadoop-2.7.2.tar.gz配置环境:
[spark@master soft]$ cd hadoop-2.7.2/etc/hadoop/ [spark@master hadoop]$ vi core-site.xml
<configuration> <!-- 指定HDFS(namenode)的通信地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <!-- 指定hadoop运行时产生文件的存储路径 --> <property> <name>hadoop.tmp.dir</name> <value>/spark/hadoop/tmp</value> </property> </configuration>
[spark@master hadoop]$ vi hdfs-site.xml
添加:
<configuration> <!-- 设置namenode存放的路径 --> <property> <name>dfs.namenode.name.dir</name> <value>/spark/hadoop/name</value> </property> <!-- 设置hdfs副本数量 --> <property> <name>dfs.replication</name> <value>2</value> </property> <!-- 设置datanode存放的路径 --> <property> <name>dfs.datanode.data.dir</name> <value>/spark/hadoop/data</value> </property> </configuration>
[spark@master hadoop]$ vi mapred-site.xml
添加:
<configuration> <!-- 通知框架MR使用YARN --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- mapreduce任务记录访问地址--> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property> </configuration>
[spark@master hadoop]$ vi yarn-site.xml
添加:
<configuration> <!-- Site specific YARN configuration properties --> <!-- 设置 resourcemanager 在哪个节点--> <property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property> <!-- reducer取数据的方式是mapreduce_shuffle --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> </configuration>
[spark@master hadoop]$ vi slaves
添加:
master slave1 slave2
[spark@master hadoop]$ vi hadoop-env.sh
添加修改:
export JAVA_HOME=/spark/soft/jdk1.8.0_162 export HADOOP_HOME=/spark/soft/hadoop-2.7.2 export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export HADOOP_LOG_DIR=$HADOOP_HOME/logs
root 权限添加环境变量
[root@master hadoop]# vi /etc/profile
最下面添加:
export HADOOP_HOME=/spark/soft/hadoop-2.7.2 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export CLASSPATH=.:$HADOOP_HOME/lib:$CLASSPATH export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME export HADOOP_ROOT_LOGGER=INFO,console export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib" export HADOOP_CONF_DIR=/spark/soft/hadoop-2.7.2/etc/hadoop export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
[root@master hadoop]# source /etc/profile
将hadoop复制到两个从节点
[spark@master hadoop]$ scp -r /spark/soft/hadoop-2.7.2 spark@slave1:/spark/soft/ [spark@master hadoop]$ scp -r /spark/soft/hadoop-2.7.2 spark@slave2:/spark/soft/
启动验证
[spark@master hadoop]$ cd /spark/soft/hadoop-2.7.2/ [spark@master hadoop-2.7.2]$ ./sbin/start-all.sh
2搭建Spark集群环境
用spark用户创建一个目录
[spark@master ~]$ mkdir /spark/work
放置、解压安装包
[spark@master ~]$ mkdir /spark/work [spark@master ~]$ mkdir /spark/work/mvn1 [spark@master ~]$ cp /spark/compile/spark-2.0.0-mvn/spark-2.0.0-bin-dev.tgz /spark/work/mvn1/ [spark@master ~]$ cd /spark/work/mvn1/ [spark@master mvn1]$ tar -zxf spark-2.0.0-bin-dev.tgz
配置conf/slavers
[spark@master mvn1]$ cd spark-2.0.0-bin-dev/conf/ [spark@master conf]$ cp slaves.template slaves [spark@master conf]$ vi slaves
修改添加:
master slave1 slave2
配置conf/spark-enc.sh
[spark@master conf]$ cp spark-env.sh.template spark-env.sh [spark@master conf]$ vi spark-env.sh
最下面添加:
export JAVA_HOME=/spark/soft/jdk1.8.0_162 export SCALA_HOME=/spark/soft/scala-2.11.8 export SPARK_HOME=/spark/work/mvn1/spark-2.0.0-bin-dev export HADOOP_HOME=/spark/soft/hadoop-2.7.2 export HADOOP_CONF_DIR=/spark/soft/hadoop-2.7.2/etc/hadoop export SPARK_DIST_CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath) export SPARK_MASTER_IP=master export SPARK_MASTER_PORT=7077 export SPARK_EXECUTOR_INSTANCES=1 export SPARK_WORKER_INSTANCES=1 export SPARK_WORKER_CORES=1 export SPARK_WORKER_MEMORY=1024M export SPARK_MASTER_WEBUI_PORT=8080 export SPARK_CONF_DIR=$SPARK_HOME/conf
复制Spark到其他两个节点
[spark@master conf]$ cd /spark/work/mvn1/ [spark@master mvn1]$ rm -rf spark-2.0.0-bin-dev.tgz [spark@master mvn1]$ scp -r /spark/work/ spark@slave1:/spark/ [spark@master mvn1]$ scp -r /spark/work/ spark@slave2:/spark/
启动Spark
[spark@master mvn1]$ cd /spark/work/mvn1/spark-2.0.0-bin-dev/ [spark@master spark-2.0.0-bin-dev]$ ./sbin/start-all.sh
结果:
master
slave1
salve2
至此编译部署、搭建Spark集群完成,IDEA开发见下一篇,谢谢!
Spark集群环境搭建+Maven、SBT编译部署+IDEA开发(二)