Spark的介绍及伪分布式集群的搭建

一、概述

在这里插入图片描述
Apache Spark是一个快如闪电的统一分析引擎(并没有提供数据存储的方案)

快如闪电(相比于传统的大数据处理方案MapReduce):

  • Spark将一个复杂的计算任务Job拆分为多个细粒度的Stage,每一个Stage都可以分布式并行计算;对于MapReduce初代的计算引擎,它将任务拆分了粗粒度的MapTask和ReduceTask,对于特别复杂的计算任务,我们需要将多个MapReduce Job串联起来;
  • Spark内存式的计算引擎;对于MapReduce基于磁盘的计算引擎;
  • Spark中间计算结果支持缓存的,极大提高计算效率,这种缓存可以应用于结果复用和故障恢复;对于MapReduce中间结果需要溢写在磁盘;

统一(提供了大数据处理的所有主流方案)

  • 批处理(Batch Processing): Spark RDD,代替了Hadoop MapReduce
  • 流处理(Streams Processing):Spark Streaming和Spark Structured Streaming,代替了Kafka Streams、Storm
  • 交互式查询(SQL):Spark SQL,代替了Hive
  • 机器学习(Machine Learning): Spark MLLib,代替了Mahout
  • 图形计算(Graph):Spark Graphx,基于图形存储的NoSQL数据库的计算支持(Neo4J)
  • Spark生态库: 解决其它大数据处理问题

特点

  • 高效:实现高性能的批和流计算支持,使用了非常先进的DAG Scheduler(有向无环图调度器)是一种查询优化和物理执行引擎
  • 易用:提供了超过80个高阶函数简化了分布式并行应用的开发,并且支持多种编程语言(Java、Python、Scala、R)
  • 通用:集成了多种数据处理方案,如SQL、Batch、Streaming、ML、Graph;
  • 运行环境:支持多种资源管理调度系统,如YARN、Apache Mesos、K8S、Standalone等;

二、MapReduce VS Spark

MapReduce作为第一代大数据处理框架,在设计初期只是为了满足基于海量数据级的海量数据计算的迫切需求。自2006年剥离自Nutch(Java搜索引擎)工程,主要解决的是早期人们对大数据的初级认知所面临的问题。
在这里插入图片描述
整个MapReduce的计算实现的是基于磁盘的IO计算,随着大数据技术的不断普及,人们开始重新定义大数据的处理方式,不仅仅满足于能在合理的时间范围内完成对大数据的计算,还对计算的实效性提出了更苛刻的要求,因为人们开始探索使用Map Reduce计算框架完成一些复杂的高阶算法,往往这些算法通常不能通过1次性的Map Reduce迭代计算完成。由于Map Reduce计算模型总是把结果存储到磁盘中,每次迭代都需要将数据磁盘加载到内存,这就为后续的迭代带来了更多延长。
2009年Spark在加州伯克利AMP实验室诞生,2010首次开源后该项目就受到很多开发人员的喜爱,2013年6月份开始在Apache孵化,2014年2月份正式成为Apache的顶级项目。Spark发展如此之快是因为Spark在计算层方面明显优于Hadoop的Map Reduce这磁盘迭代计算,因为Spark可以使用内存对数据做计算,而且计算的中间结果也可以缓存在内存中,这就为后续的迭代计算节省了时间,大幅度的提升了针对于海量数据的计算效率。
在这里插入图片描述
Spark也给出了在使用MapReduce和Spark做线性回归计算(算法实现需要n次迭代)上,Spark的速率几乎是MapReduce计算10~100倍这种计算速度。
在这里插入图片描述
不仅如此Spark在设计理念中也提出了One stack ruled them all战略,并且提供了基于Spark批处理至上的计算服务分支例如:实现基于Spark的交互查询、近实时流处理、机器学习、Grahx 图形关系存储等。
在这里插入图片描述
从图中不难看出Apache Spark处于计算层,Spark项目在战略上启到了承上启下的作用,并没有废弃原有以hadoop为主体的大数据解决方案。因为Spark向下可以计算来自于HDFS、HBase、Cassandra和亚马逊S3文件服务器的数据,也就意味着使用Spark作为计算层,用户原有的存储层架构无需改动。

三、计算流程

因为Spark计算是在MapReduce计算之后诞生,吸取了MapReduce设计经验,极大地规避了MapReduce计算过程中的诟病,先来回顾一下MapReduce计算的流程。
在这里插入图片描述
总结一下几点缺点:

1)MapReduce虽然基于矢量编程思想,但是计算状态过于简单,只是简单的将任务分为Map state和Reduce State,没有考虑到迭代计算场景。
2)在Map任务计算的中间结果存储到本地磁盘,IO调用过多,数据读写效率差。
3)MapReduce是先提交任务,然后在计算过程中申请资源。并且计算方式过于笨重。每个并行度都是由一个JVM进程来实现计算。

通过简单的罗列不难发现MapReduce计算的诟病和问题,因此Spark在计算层面上借鉴了MapReduce计算设计的经验,提出了DGASchedule和TaskSchedual概念,打破了在MapReduce任务中一个job只用Map State和Reduce State的两个阶段,并不适合一些迭代计算次数比较多的场景。因此Spark 提出了一个比较先进的设计理念,任务状态拆分,Spark在任务计算初期首先通过DGASchedule计算任务的State,将每个阶段的Sate封装成一个TaskSet,然后由TaskSchedual将TaskSet提交集群进行计算。可以尝试将Spark计算的流程使用一下的流程图描述如下:
在这里插入图片描述
相比较于MapReduce计算,Spark计算有以下优点:

1)智能DAG任务拆分,将一个复杂计算拆分成若干个State,满足迭代计算场景

2)Spark提供了计算的缓存和容错策略,将计算结果存储在内存或者磁盘,加速每个state的运行,提升运行效率

3)Spark在计算初期,就已经申请好计算资源。任务并行度是通过在Executor进程中启动线程实现,相比较于MapReduce计算更加轻快。

扫描二维码关注公众号,回复: 10313902 查看本文章

目前Spark提供了Cluster Manager的实现由Yarn、Standalone、Messso、kubernates等实现。其中常用的有Yarn和Standalone方式的管理。

四、Spark伪分布式集群环境搭建(Standalone)

  • 在一台服务器上模拟所有的集群服务;
  • Standalone集群是spark自带一种资源管理调度系统,类似于Hadoop YARN

准备工作

  • CentOS7.2以上的虚拟机
  • JDK8.0以上
  • hadoop-2.9.2.tar.gz
  • spark-2.4.4-bin-without-hadoop.tgz

虚拟机初始化配置

网络
# 1. 双网卡配置,添加网卡硬件,网络连接设置为NAT模式
# 2. 修改网卡的配置文件,ens33网卡(内网通信,静态地址) ens37网卡(外围通信,动态地址)
[root@SparkOnStandalone ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=static
IPADDR=192.168.197.201
NETMASK=255.255.255.0

关闭防火墙

[root@SparkOnStandalone ~]# systemctl disable firewalld

设置主机名

[root@SparkOnStandalone ~]# vi /etc/hostname
SparkOnStandalone

配置主机名和IP映射

[root@SparkOnStandalone ~]# vi /etc/hosts
192.168.48.201 SparkOnStandalone

配置SSH免密登录

[root@SparkOnStandalone ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:60iw7cJLQf2X1GZIDBq8GKTVy5OmL21xUw5XYecYNSQ root@SparkOnStandalone
The key's randomart image is:
+---[RSA 2048]----+
|   .oo. .o. E+=  |
|   o..oo ..+.* . |
|  . .+o+  o.= .  |
|   .. B...o+     |
|    oo .S=o      |
|    .=. oo.      |
|   .oooo..       |
|   .+o+o         |
|    .=o .        |
+----[SHA256]-----+
[root@SparkOnStandalone ~]# ssh-copy-id SparkOnStandalone
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'sparkonstandalone (192.168.197.201)' can't be established.
ECDSA key fingerprint is SHA256:gsJGwQ2NjqNlR1WjbLzlxJQnv24GdfTiqDm/hu4d7+s.
ECDSA key fingerprint is MD5:11:f9:7c:cd:f3:e1:b9:89:60:71:51:dd:b5:1e:49:0e.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

# 验证免密登录
[root@SparkOnStandalone ~]# ssh SparkOnStandalone
Last login: Mon Jan 13 11:23:33 2020 from 192.168.197.1
[root@SparkOnStandalone ~]# exit
登出
Connection to sparkonstandalone closed.

安装JDK

[root@SparkOnStandalone ~]# rpm -ivh jdk-8u171-linux-x64.rpm

安装Hadoop HDFS

[root@SparkOnStandalone ~]# tar -zxf hadoop-2.9.2.tar.gz -C /usr

[root@SparkOnStandalone ~]# vi /usr/hadoop-2.9.2/etc/hadoop/core-site.xml
<!--nn访问入口-->
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://SparkOnStandalone:9000</value>
</property>
<!--hdfs工作基础目录-->
<property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/hadoop-2.9.2/hadoop-${user.name}</value>
</property>

[root@SparkOnStandalone ~]# vi /usr/hadoop-2.9.2/etc/hadoop/hdfs-site.xml
<!--block副本因子-->
<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>
<!--配置Sencondary namenode所在物理主机-->
<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>SparkOnStandalone:50090</value>
</property>
<!--设置datanode最大文件操作数-->
<property>
        <name>dfs.datanode.max.xcievers</name>
        <value>4096</value>
</property>
<!--设置datanode并行处理能力-->
<property>
        <name>dfs.datanode.handler.count</name>
        <value>6</value>
</property>

[root@SparkOnStandalone ~]# vi /usr/hadoop-2.9.2/etc/hadoop/slaves
SparkOnStandalone

修改环境配置

[root@SparkOnStandalone ~]# vi .bashrc
HADOOP_HOME=/usr/hadoop-2.9.2
JAVA_HOME=/usr/java/latest
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
CLASSPATH=.
export HADOOP_HOME
export JAVA_HOME
export PATH
export CLASSPATH
[root@SparkOnStandalone ~]# source .bashrc

初始化NameNode

[root@SparkOnStandalone ~]# hdfs namenode -format

启动HDFS

[root@SparkOnStandalone ~]# start-dfs.sh
[root@SparkOnStandalone ~]# jps
11266 NameNode
11847 Jps
11416 DataNode
11611 SecondaryNameNode

安装Spark

[root@SparkOnStandalone ~]# tar -zxf spark-2.4.4-bin-without-hadoop.tgz -C /usr
[root@SparkOnStandalone ~]# cd /usr/
[root@SparkOnStandalone usr]# mv spark-2.4.4-bin-without-hadoop/ spark-2.4.4

配置

[root@SparkOnStandalone conf]# cp slaves.template slaves
[root@SparkOnStandalone conf]# cp spark-env.sh.template spark-env.sh
[root@SparkOnStandalone conf]# cp spark-defaults.conf.template spark-defaults.conf

[root@SparkOnStandalone conf]# vi spark-env.sh
SPARK_WORKER_INSTANCES=1
SPARK_MASTER_HOST=SparkOnStandalone
SPARK_MASTER_PORT=7077
SPARK_WORKER_CORES=4
SPARK_WORKER_MEMORY=2g
LD_LIBRARY_PATH=/usr/hadoop-2.9.2/lib/native
SPARK_DIST_CLASSPATH=$(hadoop classpath)
export SPARK_MASTER_HOST
export SPARK_MASTER_PORT
export SPARK_WORKER_CORES
export SPARK_WORKER_MEMORY
export LD_LIBRARY_PATH
export SPARK_DIST_CLASSPATH
export SPARK_WORKER_INSTANCES

[root@SparkOnStandalone conf]# vi slaves
SparkOnStandalone

启动Spark Standalone模式集群(伪分布式)

[root@SparkOnStandalone spark-2.4.4]#./sbin/start-all.sh

验证服务

# 方法1
[root@SparkOnStandalone sbin]# jps
17216 Master
11266 NameNode
17347 Worker
11416 DataNode
11611 SecondaryNameNode
17612 Jps

# 方法2
http://192.168.48.201:8080/
发布了24 篇原创文章 · 获赞 1 · 访问量 502

猜你喜欢

转载自blog.csdn.net/Mr_YXX/article/details/105001190