基于内存计算的大数据并行计算框架,可用于构建大型的、低延迟的数据分析应用程序。
Apache软件基金会最重要的三大分布式计算系统开源项目之一(Hadoop、Spark、Storm)
运行速度快
Spark拥有DAG执行引擎
,支持在内存中对数据进行迭代计算
。官方提供的数据表明,如果数据由磁盘读取,速度是Hadoop MapReduce的10倍以上
,如果数据从内存中读取,速度可以高达100多倍
。
易用性好
Spark不仅支持Scala
编写应用程序,而且支持Java
和Python
等语言进行编写,特别是Scala是一种高效、可拓展的语言,能够用简洁的代码处理较为复杂的处理工作。
通用性强
随处运行
Hadoop:
一个MapReduce程序就是一个Job,一个Job里有一个或多个Task,区分为Map Task和Reduce Task
Spark:
Job概念与Hadoop不同,在它之上还有Application,一个Application和一个SparkContext相关联,每个Application可以有一个或多个Job并行或串行运行;Job由Action触发Job里又包含多个Stage,Stage是以Shuffle进行划分的,每个Stage包含了由多个Task组成的Task Set。
Spark容错性比Hadoop更好:
Spark引进了弹性分布式数据集RDD的抽象,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”(即允许基于数据衍生过程)对他们进行重建。
另外在RDD计算时,可以通过CheckPoint来实现容错,CheckPoint有两种方式:
CheckPoint Data 和Logging The Updates,用户可以控制采用哪种方式来实现容错。
Spark通用性也比Hadoop更好:
Hadoop只提供了Map和Reduce两种操作;
Spark提供了数据集操作类型很多种,大致分为Transformation
和Action
两大类:
在实际应用中,大数据处理主要包括以下三个类型:
目前对以上三种场景需求都有比较成熟的处理框架,
Hadoop的MapReduce
来进行批量海量数据处理,Impala
进行交互式查询,Storm
分布式处理框架处理实时流式数据。成本问题:
而Spark
的出现能够一站式平台满意以上需求
应用场景 | 时间跨度 | 其他框架 | Spark生态系统中的组件 |
---|---|---|---|
复杂的批量数据处理 | 小时级 | MapReduce、Hive | Spark |
基于历史数据的交互式查询 | 分钟级 、秒级 | Impala、Dremel、Drill | Spark SQL |
基于实时数据流的数据处理 | 毫秒、秒级 | Storm、S4 | Spark Streaming |
基于历史数据的数据挖掘 | - | Mahout | MLlib |
图结构数据的处理 | - | Pregel、Hama | GraphX |
一个 Application 由一个 Driver 和若干个 Job 构成,一个 Job 由多个 Stage 构成,一个Stage 由多个没有 Shuffle 关系的 Task 组成
当执行一个 Application 时, Driver 会向集群管理器申请资源,启动 Executor ,并向 Executor 发送应用程序代码和文件,然后在 Executor 上执行 Task ,运行结束后执行结果会返回给 Driver 或者写到 HDFS 或者其他数据库中
特点:
Application
都有自己专属的Executor
进程,并且该进程在Application
运行期间一直驻留。Executor
进程以多线程的方式运行Task
Spark
运行过程与资源管理器无关,只要能够获取Executor
进程并保持通信即可Task
采用了数据本地性和推测执行等优化机制Spark
的核心概念;RDDs
的创建、转换、操作完成的。lineage graph
(血统关系图)partitions
组成,每个partition 都包括一部分数据,这些 partitions
可以在集群的不同节点上计算;Spark
中的并行处理单元。“动作 Action
和“转换 Transformation
两种类型map
、 filter
、groupBy
、join
等粗粒度的数据转换操作,而不是针对某个数据项的细粒度修改 (不适合网页爬虫RDD
已经被实践证明可以高效地表达,许多框架的编程模型 比如MapReduce
、 SQL
、 Pregel
RDD
的 API
,程序员可以通过调用 API
实现对 RDD
的各种操作RDD典型的执行顺序如下:
RDD的 transformations
和 actions
点击这里
RDD 运行过程:
Scala 是一门现代的多范式编程语言,运行于 Java 平台( JVM Java 虚拟机),并兼容现有的 Java 程序
Scala 的特性:
API
Java
,运行速度快,且能融合到 Hadoop
生态圈中Spark
还支持 Java
、 Python
、R
作为编程语言Read Eval Print Loop
,交互式解释器 ),提高程序开发效率Spark SQL在Hive兼容层面仅依赖HiveQL解析、Hive元数据,也就是说,从HQL被解析成抽象语法树(AST)起,就全部由Spark SQL接管了。Spark SQL执行计划生成和优化都由Catalyst(函数式关系查询优化框架)负责
解压安装包(sudo tar -zxvf scala-2.11.8.tgz -C /usr/local/),并更改 scala
所属用户和用户组为当前用户及所在组。
配置环境变量:添加
S
C
A
L
A
H
O
M
E
变
量
为
s
c
a
l
a
解
压
路
径
,
并
在
SCALA_HOME 变量为 scala 解压路径,并在
SCALAHOME变量为scala解压路径,并在PATH 变量添加相应 的 bin 目录。
使得环境生效
查看是否安装成功
解压安装包(sudo tar -zxvf spark-2.4.8-bin-without-hadoop.tgz -C /usr/local/),更改所属用户及用户组,并将目录重命名为 spark-2.4.8,方便后续配置:
更改所属用户及用户组
并将目录重命名为 spark-2.4.8
配置环境变量,添加 SPARK_HOME 变量,并在 PATH 变量中添加相应的 bin 目录。
export SPARK_HOME=/usr/local/spark-2.4.8
export PATH=
P
A
T
H
:
PATH:
PATH:SPARK_HOME/bin
将 spark-env.sh.template 文件复制为 spark-env.sh 文件:
并配置内容如下:
启动 spark:启动 spark 之前要先启动 HDFS
启动之后网页访问 Master:8080 可以查看当前 Spark workers 状态。
Spark-shell 进入spark shell
会有这种错误
但不需要慌张!不影响使用 scala 使用,如果要解决,可以通过添加系统环境变量。export TERM=xterm-color
就不会有了
1.5 举个例子
通 过 spark-submit 命令运行 spark 自 带 实 例 , spark 自 带 实 例 都 在
SPARK_HOME/examples/jars/spark-examples_2.11-2.4.8.jar 中提供:
spark-submit --class org.apache.spark.examples.SparkPi examples/jars/spark-examples_2.11-2.4.8.jar
注:在运行SparkPi实例时会输出很多运行日志,可以通过加 grep 命令进行过滤,显示关心的信息:
(1)分别从本地文件
、HDFS上的文件
以及Spark Context的parallelized()方法
生成分别生成RDD_1、RDD_2、RDD_3,要求本地文件格式为每行多个单词,以空格隔开;HDFS上的文本为每行1个单词,即单词以换行符隔开,每个RDD中都要包含1个或多个你的学号或者姓名拼音;
1.1 本地创建in.txt
1.3 spark创建文件
创建成功!
(2) 输出RDD_1的第一行、RDD_2的所有内容、RDD_3的最大值;
2.1RDD_1的第一行
2.3 RDD_3的最大值
(3) 统计 RDD_1 中“姓名拼音”、“学号”两个单词出现的次数;
结果:
zqc 有6个
031904102 有 4个
(4) 对去重后的 RDD_1再去掉RDD_2中的内容;
(5) 将上述结果与RDD_3合并,并将RDD_3分别写入本地文件系统和HDFS文件系统;
先创建一个文件
使用 Scala 语言编写的 Spark 程序,需要使用 sbt 进行编译打包。Spark 中没有自带sbt,需要单独安装。可以到 官网 下载 sbt 安装文件,最新版即可
下载好
创建一个目录
这里我们把 sbt 安装到“/usr/local/sbt”目录下,执行如下命令:
#!/bin/bash
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"
保存后,还需要为该 Shell 脚本文件增加可执行权限:
然后,可以使用命令 sbt sbtVersion 查看 sbt 版本信息:
(1) 实现wordcount功能,并将结果写入本地文件;
在本地创建目录
创建这个文件。
写入数据。
实现生成任意RDD,并将结果写入文件;
在终端中执行如下命令创建一个文件夹 spark_zqc_maven_scala 作为应用程序根,目录:
写入下面内容
(2) 分别使用maven打包上述程序;
该 程 序 依 赖 Spark Java API, 因 此 我 们 需 要 通 过 Maven 进 行 编 译 打 包 。 在./spark_zqc_maven_scala 目录中新建文件 pom.xml,然后,在 pom.xml 文件中 添加如下内容,用来声明该独立应用程序的信息以及与 Spark 的依赖关系:
为了保证 Maven 能够正常运行,先执行如下命令检查整个应用程序的文件结构,
接下来,我们可以通过如下代码将整个应用程序打包成 JAR 包(注意:计算机需要保持连接网络的状态,而且首次运行打包命令时,Maven 会自动下载依赖包,需要消耗几分钟的时间):
(3) 通过spark-submit执行生成的jar。
小生凡一,期待你的关注。
联系客服