Apache Spark

Spark

概述

Spark是一个计算框架(快如闪电的统一分析引擎) 可以做大规模数据集的处理 Spark批处理计算性能大约是Hadoop MapReduce的10~100倍 因为Spark使用先进的基于DAG任务调度 可以将任务拆分成若个阶段 然后将这些阶段批次交给集群计算节点处理

在这里插入图片描述

MapReduce vs Spark

MapRduce作为第一代大数据处理框架 在设计初期只是为了满足基于海量数据级的计算的迫切需求 整个MapReduce的计算实现是基于磁盘的IO计算 由于MapReduce计算模型总是把结果存在磁盘中 每次迭代都需要将数据磁盘加载到内存 为后续的迭代带来更多延长

而spark的计算层方面明显优于hadoop的MapReduce 它可以使用内存对数据做计算 而且计算的中间结果也可以缓存在内存中 为后续的迭代计算节省了时间 大幅度提升了针对海量数据的计算效率

Spark也给出了在使⽤MapReduce和Spark做线性回归计算(算法实现需要n次迭代)上,Spark的速率⼏ 乎是MapReduce计算10~100倍这种计算速度

不仅如此Spark在设计理念中也提出了 One stack ruled them all 战略,并且提供了基于Spark批处

理⾄上的计算服务分⽀例如:实现基于Spark的交互查询、近实时流处理、机器学习、Grahx 图形关系存储 等。
在这里插入图片描述

从图中可以看出spark出于计算层 启到承上启下的作用 并没有废弃原有以hadoop为主题的大数据解决方案 因为Spark向下可以计算来⾃于HDFS、HBase、Cassandra和亚⻢逊 S3⽂件服务器的数据,也就意味着使⽤Spark作为计算层,⽤户原有的存储层架构⽆需改动。

计算流程

MapReduce计算流程:

在这里插入图片描述
MapRduce的缺点:

1)MapReduce虽然基于⽮量编程思想,但是计算状态过于简单,只是简单的将任务分为Map state 和Reduce State,没有考虑到迭代计算场景。

2)在Map任务计算的中间结果存储到本地磁盘,IO 调⽤过多,数据读写效率差。

3)MapReduce是先提交任务,然后在计算过程中申请资源。并且计 算⽅式过于笨重。每个并⾏度都是由⼀个JVM进程来实现计算。

通过上述罗列发现Mapreduce计算的问题 因此Spark在计算层面借鉴了MapReduce计算设计的经验 提出了DGASchedule(有向无环调度器)和TaskSchedual(任务调度器)概念 spark提出先进的设计理念 任务状态拆分 Spark在任务计算初期先通过DAGSchedule计算任务的Stage 将每个Stage封装成一个TaskSet 然后TskSchedual将TaskSet提交集群进行计算

在这里插入图片描述

Spark的优点:

1)智能DAG任务拆分,将⼀个复杂计算拆分成若⼲个Stage,满⾜迭代计算场景

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

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

⽬前Spark提供了Cluster Manager的实现由Yarn、Standalone、Messso、kubernates等实现。其中企 业常⽤的有Yarn和Standalone⽅式的管理

环境搭建

Spark On Yarn

前提:Hadoop环境运行正常

  • 设置进程数和文件书(可选)
[root@hbase ~]# vim /etc/security/limits.conf

* soft nofile 204800
* hard nofile 204800
* soft nproc 204800
* hard nproc 204800

提示:优化linux性能 修改这个最大值 重启生效

Spark环境

下载:https://archive.apache.org/dist/spark/spark-2.4.5/spark-2.4.5-bin-without-hadoop.tgz

  • 解压安装spark
[root@hbase ~]# tar -zxf spark-2.4.5-bin-without-hadoop.tgz -C /usr/ 
[root@hbase ~]# mv /usr/spark-2.4.5-bin-without-hadoop/ /usr/spark-2.4.5 
[root@hbase ~]# tree -L 1 /usr/soft/spark-2.4.5/
/usr/soft/spark-2.4.5/
├── bin
├── conf
├── data
├── examples
├── jars
├── kubernetes
├── LICENSE
├── licenses
├── logs
├── NOTICE
├── python
├── R
├── README.md
├── RELEASE
├── sbin
├── work
└── yarn

13 directories, 4 files
  • 配置Spark服务
[root@hbase ~]# cd /usr/soft/spark-2.4.5/
[root@hbase spark-2.4.5]#  mv conf/spark-env.sh.template conf/spark-env.sh
[root@hbase spark-2.4.5]# vim conf/spark-env.sh
# Options read in YARN client/cluster mode
# - SPARK_CONF_DIR, Alternate conf dir. (Default: ${SPARK_HOME}/conf)
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
# - YARN_CONF_DIR, to point Spark towards YARN configuration files when you use YARN
# - SPARK_EXECUTOR_CORES, Number of cores for the executors (Default: 1).
# - SPARK_EXECUTOR_MEMORY, Memory per Executor (e.g. 1000M, 2G) (Default: 1G)
# - SPARK_DRIVER_MEMORY, Memory for Driver (e.g. 1000M, 2G) (Default: 1G)
HADOOP_CONF_DIR=/usr/hadoop-2.9.2/etc/hadoop #hadoop_conf的目录
YARN_CONF_DIR=/usr/hadoop-2.9.2/etc/hadoop #yarn_conf的目录
SPARK_EXECUTOR_CORES= 2
SPARK_EXECUTOR_MEMORY=1G
SPARK_DRIVER_MEMORY=1G
LD_LIBRARY_PATH=/usr/hadoop-2.9.2/lib/native
export HADOOP_CONF_DIR
export YARN_CONF_DIR
export SPARK_EXECUTOR_CORES
export SPARK_DRIVER_MEMORY
export SPARK_EXECUTOR_MEMORY
export LD_LIBRARY_PATH
export SPARK_DIST_CLASSPATH=$(hadoop classpath):$SPARK_DIST_CLASSPATH
export SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs:///spark-logs"
[root@CentOS spark-2.4.5]# mv conf/spark-defaults.conf.template conf/sparkdefaults.conf
[root@CentOS spark-2.4.5]# vi conf/spark-defaults.conf
spark.eventLog.enabled=true
spark.eventLog.dir=hdfs:///spark-logs

需要现在在HDFS上创建 spark-logs ⽬录,⽤于作为Sparkhistory服务器存储历史计算数据的地 ⽅。

[root@CentOS ~]# hdfs dfs -mkdir /spark-logs
  • 启动Spark history server
[root@CentOS spark-2.4.5]# ./sbin/start-history-server.sh
[root@CentOS spark-2.4.5]# jps
124528 HistoryServer
122690 NodeManager
122374 SecondaryNameNode
122201 DataNode
122539 ResourceManager
122058 NameNode
124574 Jps
  • 访问http://主机ip:18080

测试环境

[root@CentOS spark-2.4.5]# ./bin/spark-submit
 --master yarn
 --deploy-mode client
 --class org.apache.spark.examples.SparkPi
 --num-executors 2
 --executor-cores 3
 /usr/spark-2.4.5/examples/jars/spark-examples_2.11-2.4.5.jar

结果

19/04/21 03:30:40 INFO scheduler.DAGScheduler: Job 0 finished: reduce at
SparkPi.scala:38, took 30.317103 s
`Pi is roughly 3.141915709578548`
19/04/21 03:30:40 INFO server.AbstractConnector: Stopped Spark@41035930{
   HTTP/1.1,
[http/1.1]}{
   0.0.0.0:4040}
参数 说明
–master 连接资源服务器的名字yarn
–deploy-mode 部署模式 可选值有clientcluster 决定Driver程序是否在远程执行
–class 运行主类的名字
–num-executors 计算过程所需的进程数
–executor-cores 每个执行者最多使用的CPU的核数

spark shell

[root@CentOS bin]# ./spark-shell --master yarn --deploy-mode client --executor-cores
4 --num-executors 3
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use
setLogLevel(newLevel).
19/04/17 01:46:04 WARN yarn.Client: Neither spark.yarn.jars nor spark.yarn.archive is
set, falling back to uploading libraries under SPARK_HOME.
Spark context Web UI available at http://CentOS:4040
Spark context available as 'sc' (master = yarn, app id =
application_1555383933869_0004).
Spark session available as 'spark'.
Welcome to
 ____ __
 / __/__ ___ _____/ /__
 _\ \/ _ \/ _ `/ __/ '_/
 /___/ .__/\_,_/_/ /_/\_\ version 2.4.1
 /_/
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_171)
Type in expressions to have them evaluated.
Type :help for more information.
scala>

Spark Standalone

hadoop环境正常运行

spark环境-

注意:与上步骤相同 只有配置文件不同

  • 配置Spark服务
[root@CentOS ~]# cd /usr/spark-2.4.5/
[root@CentOS spark-2.4.5]# mv conf/spark-env.sh.template conf/spark-env.sh
[root@CentOS spark-2.4.5]# vi conf/spark-env.sh
# - SPARK_DAEMON_JAVA_OPTS, to set config properties for all daemons (e.g. "-Dx=y")
# - SPARK_DAEMON_CLASSPATH, to set the classpath for all daemons
# - SPARK_PUBLIC_DNS, to set the public dns name of the master or workers
SPARK_MASTER_HOST=CentOS
SPARK_MASTER_PORT=7077
SPARK_WORKER_CORES=4
SPARK_WORKER_INSTANCES=2
SPARK_WORKER_MEMORY=2g
export SPARK_MASTER_HOST
export SPARK_MASTER_PORT
export SPARK_WORKER_CORES
export SPARK_WORKER_MEMORY
export SPARK_WORKER_INSTANCES
export LD_LIBRARY_PATH=/usr/hadoop-2.9.2/lib/native
export SPARK_DIST_CLASSPATH=$(hadoop classpath)
export SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs:///spark-logs"
[root@CentOS spark-2.4.5]# mv conf/spark-defaults.conf.template conf/sparkdefaults.conf
[root@CentOS spark-2.4.5]# vi conf/spark-defaults.conf
spark.eventLog.enabled=true
spark.eventLog.dir=hdfs:///spark-logs
  • 启动历史服务
  • 启动Spark自己计算服务
[root@CentOS spark-2.4.5]# ./sbin/start-all.sh
starting org.apache.spark.deploy.master.Master, logging to /usr/spark-
2.4.5/logs/spark-root-org.apache.spark.deploy.master.Master-1-CentOS.out
localhost: starting org.apache.spark.deploy.worker.Worker, logging to /usr/spark-
2.4.5/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-CentOS.out
localhost: starting org.apache.spark.deploy.worker.Worker, logging to /usr/spark-
2.4.5/logs/spark-root-org.apache.spark.deploy.worker.Worker-2-CentOS.out
[root@CentOS spark-2.4.5]# jps
7908 Worker
7525 HistoryServer
8165 Jps
122374 SecondaryNameNode
7751 Master
122201 DataNode
122058 NameNode
7854 Worker

用户可以访问 http://主机名:8080

测试环境

[root@CentOS spark-2.4.5]# ./bin/spark-submit
 --master spark://主机名:7077
 --deploy-mode client
 --class org.apache.spark.examples.SparkPi
 --total-executor-cores 6
 /usr/spark-2.4.5/examples/jars/spark-examples_2.11-2.4.5.jar

结果

SparkPi.scala:38) finished in 29.116 s
19/04/21 03:30:40 INFO scheduler.DAGScheduler: Job 0 finished: reduce at
SparkPi.scala:38, took 30.317103 s
`Pi is roughly 3.141915709578548`
19/04/21 03:30:40 INFO server.AbstractConnector: Stopped Spark@41035930{
   HTTP/1.1,
[http/1.1]}{
   0.0.0.0:4040}
参数 说明
–total-executor-cores 计算过程所需的计算资源线程数

Spark常见疑问

  • Spark与Apache Hadoop有何关系?

    Spark是与Hadoop数据兼容的快速通⽤处理引擎。它可以通过YARN或Spark的Standaone在Hadoop群集中

    运⾏,并且可以处理HDFS,HBase,Cassandra,Hive和任何Hadoop InputFormat中的数据。它旨在执⾏

    批处理(类似于MapReduce)和提供新的额⼯作特性,例如流计算,SparkSQL 交互式查询和 Machine

    Learning机器学习等 。

  • 我的数据需要容纳在内存中才能使用Spark吗

    不会。Spark的operators会在不适合内存的情况下将数据溢出到磁盘上,从⽽使其可以在任何⼤⼩的数

    据上正常运⾏。同样,由RDD(弹性分布式数据集合)的存储级别决定,如果内存不⾜,则缓存的数据

    集要么溢出到磁盘上,要么在需要时即时重新计算。

http://spark.apache.org/faq.html

Spark RDD详解

概述

At a high level, every Spark application consists of a driver program that runs the user’s main function

and executes various parallel operations on a cluster. The main abstraction Spark provides is a resilient

distributed dataset (RDD), which is a collection of elements partitioned across the nodes of the cluster that

can be operated on in parallel.

每个Spark应用程序都包含一个Driver 该Driver程序运行用户的main方法并在集群上执行各种并行操作 Spark是弹性分布式数据集(RDD resilient distributed dataset)它是 跨集群 分的元素的集合 可以并行操作

RDD可以通过任何其他hadoop支持的文件系统及hadoop本身系统中的文件或驱动程序中现有的Scala集合开始并进行转换来创建RDD 调用RDD算子实现对RDD的转换运算Spark可以将RDD持久存储在内存中 可以并行操作中高效重复使用 RDD会自动从节点故障恢复

开发环境

  • 导入Maven依赖
<!--Spark RDD依赖-->
<dependency>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值