龙空技术网

大数据实战丨如何快速搭建一个自己的Spark分布式架构

爱马士团团长 332

前言:

眼前小伙伴们对“spark平台搭建”大概比较关怀,姐妹们都想要分析一些“spark平台搭建”的相关知识。那么小编也在网上收集了一些有关“spark平台搭建””的相关知识,希望兄弟们能喜欢,看官们快快来学习一下吧!

从零开始搭建我们的Spark平台

1、准备centeros环境

为了搭建一个真正的的集群环境,并且要做到高可用的架构,我们至少准备三个虚拟机来作为集群节点。因此我购买了三台阿里云的服务器,来作为我们的集群节点。

注意到,master是主节点,而slave顾名思义就是奴隶,自然就是为主节点工作的节点。实际上,在我们这个集群中,master和slave并没有那么明确的区分,因为事实上他们都在“努力地工作”。当然在搭建集群的时候,我们依然要明确这个概念。

2、下载jdk

1、下载jdk1.8 tar.gz包

wget 
2、解压
tar -zxvf jdk-8u201-linux-x64.tar.gz

解压之后得到

3、配置环境变量

修改profile

vi /etc/profile

添加如下

export JAVA_HOME=/usr/local/java1.8/jdk1.8.0_201export JRE_HOME=${JAVA_HOME}/jreexport CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/libexport PATH=${JAVA_HOME}/bin:$PATH

source使其生效

source /etc/profile

查看是否生效

java -version

看到如图内容表示已经成功。

以上操作三台虚拟机一模一样!以上操作三台虚拟机一模一样!以上操作三台虚拟机一模一样!

3、安装zookeeper

下载zookeeper包

wget 
解压
tar -zxvf zookeeper-3.4.13.tar.gz
进入zookeeper配置目录
cd zookeeper-3.4.13/conf
拷贝配置文件模板
cp zoo_sample.cfg zoo.cfg
拷贝后修改zoo.cfg内容
dataDir=/home/hadoop/data/zkdatadataLogDir=/home/hadoop/log/zklogserver.1=master:2888:3888server.2=slave1:2888:3888


配置环境变量

export ZOOKEEPER_HOME=/usr/local/zookeeper/zookeeper-3.4.13export PATH=$PATH:$ZOOKEEPER_HOME/bin
使环境变量生效
source /etc/profile
注意到前面配置文件中这句话,配置了数据目录
dataDir=/home/hadoop/data/zkdata
我们手动创建该目录,并且进入到其中
cd /home/hadoop/data/zkdata/echo 3 > myid
这里需要特别注意这个
echo 1 > myid
这是对于这个配置,因此在master中我们echo 1,而对于slave1则是 echo 2,对于slave2则是 echo 3
server.1=master:2888:3888server.2=slave1:2888:3888server.3=slave2:2888:3888


配置完启动测试

zkServer.sh start


启动后查看是否启动成功

zkServer.sh status


以上操作三台虚拟机都要进行!只有echo 不一样以上操作三台虚拟机都要进行!只有echo 不一样以上操作三台虚拟机都要进行!只有echo 不一样
在master中启动后查看状态在salve1中启动后查看状态

这里面的Mode是不一样的,这是zookeeper的选举机制,至于该机制如何运行,这里按下不表。后续会有专门说明。 至此,zookeeper集群已经搭建完成

4、安装hadoop

1、通过wget下载hadoop-2.7.7.tar.gz

wget 
2、下载后解压

解压出一个hadoop-2.7.7目录

tar -zxvf hadoop-2.7.7



3、配置hadoop环境变量

修改profile

vi /etc/profile
增加hadoop环境变量
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.7export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
使环境变量生效
source /etc/profile
配置完之后,查看是否生效
 hadoop version


进入hadoop-2.7.7/etc/hadoop中编辑core-site.xml

vi core-site.xml 
增加configuration
<configuration>    <!-- 指定hdfs的nameservice为myha01 -->    <property>        <name>fs.defaultFS</name>        <value>hdfs://myha01/</value>    </property>    <!-- 指定hadoop临时目录 -->    <property>        <name>hadoop.tmp.dir</name>        <value>/home/hadoop/data/hadoopdata/</value>    </property>    <!-- 指定zookeeper地址 -->    <property>        <name>ha.zookeeper.quorum</name>        <value>master:2181,slave1:2181,slave2:2181</value>    </property>    <!-- hadoop链接zookeeper的超时时长设置 -->    <property>        <name>ha.zookeeper.session-timeout.ms</name>        <value>1000</value>        <description>ms</description>    </property></configuration>
拷贝mapred-site.xml.template
cp mapred-site.xml.template mapred-site.xml


编辑mapred-site.xml

vi mapred-site.xml
增加如下内容
<configuration>    <!-- 指定mr框架为yarn方式 -->    <property>        <name>mapreduce.framework.name</name>        <value>yarn</value>    </property>    <!-- 指定mapreduce jobhistory地址 -->    <property>        <name>mapreduce.jobhistory.address</name>        <value>master:10020</value>    </property>    <!-- 任务历史服务器的web地址 -->    <property>        <name>mapreduce.jobhistory.webapp.address</name>        <value>master:19888</value>    </property></configuration>
编辑hdfs-site.xml
vi hdfs-site.xml 
增加如下内容
<configuration>    <!-- 指定副本数 -->    <property>        <name>dfs.replication</name>        <value>1</value>    </property>    <!-- 配置namenode和datanode的工作目录-数据存储目录 -->    <property>        <name>dfs.namenode.name.dir</name>        <value>/home/hadoop/data/hadoopdata/dfs/name</value>    </property>    <property>        <name>dfs.datanode.data.dir</name>        <value>/home/hadoop/data/hadoopdata/dfs/data</value>    </property>    <!-- 启用webhdfs -->    <property>        <name>dfs.webhdfs.enabled</name>        <value>true</value>    </property>    <!--指定hdfs的nameservice为myha01,需要和core-site.xml中的保持一致                 dfs.ha.namenodes.[nameservice id]为在nameservice中的每一个NameNode设置唯一标示符。        配置一个逗号分隔的NameNode ID列表。这将是被DataNode识别为所有的NameNode。        例如,如果使用"myha01"作为nameservice ID,并且使用"nn1"和"nn2"作为NameNodes标示符    -->    <property>        <name>dfs.nameservices</name>        <value>myha01</value>    </property>    <!-- myha01下面有两个NameNode,分别是nn1,nn2 -->    <property>        <name>dfs.ha.namenodes.myha01</name>        <value>nn1,nn2</value>    </property>    <!-- nn1的RPC通信地址 -->    <property>        <name>dfs.namenode.rpc-address.myha01.nn1</name>        <value>master:9000</value>    </property>


编辑yarn-site.xml

vi yarn-site.xml 
增加如下内容
<configuration>  <!-- 开启RM高可用 -->    <property>        <name>yarn.resourcemanager.ha.enabled</name>        <value>true</value>    </property>    <!-- 指定RM的cluster id -->    <property>        <name>yarn.resourcemanager.cluster-id</name>        <value>yrc</value>    </property>    <!-- 指定RM的名字 -->    <property>        <name>yarn.resourcemanager.ha.rm-ids</name>        <value>rm1,rm2</value>    </property>    <!-- 分别指定RM的地址 -->    <property>        <name>yarn.resourcemanager.hostname.rm1</name>        <value>slave1</value>    </property>    <property>        <name>yarn.resourcemanager.hostname.rm2</name>        <value>slave2</value>    </property>    <!-- 指定zk集群地址 -->    <property>        <name>yarn.resourcemanager.zk-address</name>        <value>master:2181,slave1:2181,slave2:2181</value>    </property>    <property>        <name>yarn.nodemanager.aux-services</name>        <value>mapreduce_shuffle</value>    </property>    <property>        <name>yarn.log-aggregation-enable</name>        <value>true</value>    </property>    <property>        <name>yarn.log-aggregation.retain-seconds</name>        <value>86400</value>    </property>    <!-- 启用自动恢复 -->    <property>        <name>yarn.resourcemanager.recovery.enabled</name>        <value>true</value>    </property>    <!-- 制定resourcemanager的状态信息存储在zookeeper集群上 -->    <property>        <name>yarn.resourcemanager.store.class</name>        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>    </property></configuration>


最后编辑salves

masterslave1slave2


以上操作三台虚拟机一模一样!以上操作三台虚拟机一模一样!以上操作三台虚拟机一模一样!
接着就可以启动hadoop首先在三个节点上启动journalnode,切记三个节点都要操作
hadoop-daemon.sh start journalnode
操作完成后用jps命令查看,可以看到



其中QuorumPeerMain是zookeeper,JournalNode则是我启动的内容接着对主节点的namenode进行格式化

hadoop namenode -format


注意标红色方框的地方完成格式化后查看/home/hadoop/data/hadoopdata目录下的内容


目录中的内容拷贝到slave1上,slave1是我们的备用节点,我们需要他来支撑高可用模式,当master宕机的时候,slave1马上能够顶替其继续工作。

cd..scp -r hadoopdata/ root@slave1:hadoopdata/


这样就确保了主备节点都保持一样的格式化内容

接着就可以启动hadoop

首先在master节点启动HDFS

start-dfs.sh 



接着启动start-yarn.sh ,注意start-yarn.sh需要在slave2中启动

start-yarn.sh 


分别用jps查看三个主机

master


slave1


slave2


这里注意到master和slave1都有namenode,实际上只有一个是active状态的,另一个则是standby状态。如何证实呢,我们 在浏览器中输入master:50700,可以访问


在浏览器中输入slave1:50700,可以访问另一种方式,是查看我们配置的两个节点

hdfs haadmin -getServiceState nn1hdfs haadmin -getServiceState nn2

5、spark安装

下载spark

wget 
解压
tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz


进入spark的配置目录

cd spark-2.4.0-bin-hadoop2.7/conf
拷贝配置文件spark-env.sh.template
cp spark-env.sh.template spark-env.sh


编辑spark-env.sh

vi spark-env.sh
增加内容
export JAVA_HOME=/usr/local/java1.8/jdk1.8.0_201export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.7export HADOOP_CONF_DIR=/usr/local/hadoop/hadoop-2.7.7/etc/hadoopexport SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=master:2181,slave1:2181,slave2:2181 -Dspark.deploy.zookeeper.dir=/spark"export SPARK_WORKER_MEMORY=300mexport SPARK_WORKER_CORES=1


其中java的环境变量、hadoop环境变量请从系统环境变量中拷贝,后面SPARK_WORKER_MEMORY是spark运行的内存,SPARK_WORKER_CORES是spark使用的CPU核数

以上操作三台虚拟机一模一样!以上操作三台虚拟机一模一样!以上操作三台虚拟机一模一样!
配置系统环境变量
 vi /etc/profile
增加内容
export SPARK_HOME=/usr/local/spark/spark-2.4.0-bin-hadoop2.7export PATH=$PATH:$SPARK_HOME/bin
拷贝slaves.template 文件
cp slaves.template slaves
使环境变量生效
source  /etc/profile
编辑slaves
vi slaves
增加内容
masterslave1slave2


最后我们启动spark,注意即便配置了spark的环境变量,由于start-all.sh和hadoop的start-all.sh冲突,因此我们必须进入到spark的启动目录下,才能执行启动所有的操作。进入启动目录

cd spark-2.4.0-bin-hadoop2.7/sbin
执行启动
./start-all.sh 
执行完成后,用jps查看三个节点下的状态master:slave1:


slave2:


注意到三个节点都有了spark的worker进程,只有master当中有Master进程。

访问master:8080


至此我们就拥有了正式的spark环境。

6、尝试使用

由于我们已经配置了环境变量,故可以输入spark-shell直接开始。

 spark-shell 

这里我们就进入了spark-shell.

然后进行编码

val lise = List(1,2,3,4,5)val data = sc.parallelize(lise)data.foreach(println)

`


或者我们进入spark-python

pyspark


查看sparkContext

标签: #spark平台搭建 #spark 搭建