Spark 快速入门

栏目: 编程工具 · 发布时间: 5年前

内容简介:官网:Spark是一种快速、通用、可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPLab,2010年开源,2013年6月成为Apache孵化项目,2014年2月成为Apache顶级项目。目前,Spark生态系统已经发展成为一个包含多个子项目的集合,其中包含SparkSQL、Spark Streaming、GraphX、MLlib等子项目,Spark是基于内存计算的大数据并行计算框架。Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spa

Spark

Spark 背景

什么是 Spark

官网: http://spark.apache.org

Spark是一种快速、通用、可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPLab,2010年开源,2013年6月成为Apache孵化项目,2014年2月成为Apache顶级项目。目前,Spark生态系统已经发展成为一个包含多个子项目的集合,其中包含SparkSQL、Spark Streaming、GraphX、MLlib等子项目,Spark是基于内存计算的大数据并行计算框架。Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量廉价硬件之上,形成集群。

Spark与Hadoop

Spark是一个计算框架,而Hadoop中包含计算框架MapReduce和分布式文件系统HDFS,Hadoop更广泛地说还包括在其生态系统上的其他系统.

为什么使用Spark?

Hadoop的MapReduce计算模型存在问题:

Hadoop的MapReduce的核心是Shuffle(洗牌).在整个Shuffle的过程中,至少产生6次I/O流.基于MapReduce计算引擎通常会将结果输出到次盘上,进行存储和容错.另外,当一些查询(如:hive)翻译到MapReduce任务是,往往会产生多个Stage,而这些Stage有依赖底层文件系统来存储每一个Stage的输出结果,而I/O的效率往往较低,从而影响MapReduce的运行速度.

Spark的特点

与Hadoop的MapReduce相比,Spark基于内存的运算要快100倍以上,基于硬盘的运算也要快10倍以上。Spark实现了高效的DAG执行引擎,可以通过基于内存来高效处理数据流。

易用

Spark支持 JavaPython 和Scala的API,还支持超过80种高级算法,使用户可以快速构建不同的应用。而且Spark支持交互式的Python和Scala的shell,可以非常方便地在这些 shell 中使用Spark集群来验证解决问题的方法。

通用

Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。这些不同类型的处理都可以在同一个应用中无缝使用。Spark统一的解决方案非常具有吸引力,毕竟任何公司都想用统一的平台去处理遇到的问题,减少开发和维护的人力成本和部署平台的物力成本。

兼容性

Spark 可以非常方便地与其他的开源产品进行融合。比如,Spark 可以使用Hadoop 的 YARN 和 Apache Mesos 作为它的资源管理和调度器.并且可以处理所有 Hadoop 支持的数据,包括 HDFS、HBase 和 Cassandra 等。这对于已经部署Hadoop 集群的用户特别重要,因为不需要做任何数据迁移就可以使用 Spark 的强大处理能力。Spark 也可以不依赖于第三方的资源管理和调度器,它实现了Standalone 作为其内置的资源管理和调度框架,这样进一步降低了 Spark 的使用门槛,使得所有人都可以非常容易地部署和使用 Spark。此外,Spark 还提供了在EC2 上部Standalone 的 Spark 集群的工具。

Spark的生态系统

  • Spark Core:

实现了 Spark 的基本功能,包含任务调度、内存管理、错误恢复、与存储系统 交互等模块。Spark Core 中还包含了对弹性分布式数据集(resilient distributed dataset,简称RDD)的 API 定义。

  • Spark Streaming:

Spark Streaming基于微批量方式的计算和处理,可以用于处理实时的流数据.它使用DStream,简单来说是一个弹性分布式数据集(RDD)系列,处理实时数据.数据可以从Kafka,Flume,Kinesis或TCP套接字等众多来源获取,并且可以使用由高级函数(如 map,reduce,join 和 window)开发的复杂算法进行流数据处理。最后,处理后的数据可以被推送到文件系统,数据库和实时仪表板。

  • Spark SQL

SPark SQL可以通过JDBC API将Spark数据集暴露出去,而且还可以用传统的BI和可视化 工具 在Spark数据上执行类似 SQL 的查询,用户哈可以用Spark SQL对不同格式的数据(如Json, Parque以及数据库等)执行ETl,将其转化,然后暴露特定的查询.

  • Spark MLlib

MLlib是一个可扩展的Spark机器学习库,由通用的学习算法和工具组成,包括二元分类、线性回归、聚类、协同过滤、梯度下降以及底层优化原语。

  • Spark Graphx:

GraphX是用于图计算和并行图计算的新的(alpha)Spark API。通过引入弹性分布式属性图(Resilient Distributed Property Graph),一种顶点和边都带有属性的有向多重图,扩展了Spark RDD。为了支持图计算,GraphX暴露了一个基础操作符集合(如subgraph,joinVertices和aggregateMessages)和一个经过优化的Pregel API变体。此外,GraphX还包括一个持续增长的用于简化图分析任务的图算法和构建器集合。

  • 集群管理器:

Spark 设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计 算。为了实现这样的要求,同时获得最大灵活性,Spark 支持在各种集群管理器(cluster manager)上运行,包括 Hadoop YARN、Apache Mesos,以及 Spark 自带的一个简易调度 器,叫作独立调度器。

Spark得到了众多大数据公司的支持,这些公司包括Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿里、腾讯、京东、携程、优酷土豆。当前百度的Spark已应用于凤巢、大搜索、直达号、百度大数据等业务;阿里利用GraphX构建了大规模的图计算和图挖掘系统,实现了很多生产系统的推荐算法;腾讯Spark集群达到8000台的规模,是当前已知的世界上最大的Spark集群。

Spark 的用户和用途

我们大致把Spark的用例分为两类:数据科学应用和数据处理应用。也就对应的有两种人群:数据科学家和工程师。

数据科学任务

主要是数据分析领域,数据科学家要负责分析数据并建模,具备 SQL、统计、预测建模(机器学习)等方面的经验,以及一定的使用 Python、 Matlab 或 R 语言进行编程的能力。

数据处理应用

工程师定义为使用 Spark 开发 生产环境中的数据处理应用的软件开发者,通过对接Spark的API实现对处理的处理和转换等任务。

Spark架构中的基本组件:

  • Driver:运行Application的main() 函数并创建SparkContext
  • Worker:从节点,负责控制计算节点,启动Ex而粗投入或Driver
  • SparkContext: 整个应用的上下文,监控应用的生命周期
  • SparkConf:负责存储配置信息。
  • Executor: 执行器,在worker node上执行任务组件,用于启动线程执行任务.每个Application拥有独立的一组Executors
  • ClusterManager:在standlone模式中即为Master(主节点),控制整个集群.监控Worker.在Yarn模式中为资源管理器.
  • RDD:弹性分布式集合,spark的基本计算单元,一组RDD可形成执行的有向无环图RDD Graph
  • DAG Scheduler: 根据作业(Job)构建基于Stage的DAG,并交给Stage给TaskScheduler
  • TaskScheduler:将任务(Task)分发给Executor执行
  • SparkEnv:线程级别的上下文,存储运行时的重要组件的引用。SparkEnv内创建并包含如下一些重要组件的引用。
  • MapOutPutTracker:负责Shuffle元信息的存储。
  • BroadcastManager:负责广播变量的控制与元信息的存储。
  • BlockManager:负责存储管理、创建和查找块。
  • MetricsSystem:监控运行时性能指标信息。

Spark的整体流程:client提交应用,Master找到一个Worker启动Driver,Driver向Master或者向资源管理器申请资源,之后将应用转化为RDD Graph,再由DAGScheduler将RDD Graph转化为Stage的有向无环图提交给TaskScheduler,由TaskScheduler提交任务给Executor执行。在任务执行的过程中,其他组件协同工作,确保整个应用顺利执行。

搭建 Spark 集群

Spark的部署模式有Local、Local-Cluster、Standalone、Yarn、Mesos,我们选择最具代表性的Standalone集群部署模式。安装java环境,Spark自动会把scala SDK打包到Spark中无需安装scala环境

环境

linux: CentOS-7.5_x64

hadoop: hadoop-3.2.0

spark: spark-2.3.3

zookeeper: zookeeper-3.4.10

机器规划

主机名 IP 安装软件 运行进程
node-1 192.168.91.11 spark Master
node-2 192.168.91.12 spark,zookeeper Worker,QuorumPeerMain
node-3 192.168.91.13 spark,zookeeper Worker,QuorumPeerMain
node-4 192.168.91.14 spark,zookeeper Worker,QuorumPeerMain

配置 Spark 环境

# 下载对应的Spark安装包
$ wget http://mirrors.hust.edu.cn/apache/spark/spark-2.3.3/spark-2.3.3-bin-hadoop2.7.tgz

# 解压缩
$ tar -zxvf spark-2.3.3-bin-hadoop2.7.tgz

# 进入spark解压目录
$ cd $SPARK_HOME

# 修改Spark的环境配置文件
$ cp conf/spark-env.sh.template spark-env.sh
$ vim conf/spark-env.sh

# 添加如下配置
export JAVA_HOME=/usr/java/jdk1.8.0_191

# 修改slave的配置
$ cp $SPARK_HOME/conf/slaves.template slaves
$ vi slaves

# 在该文件中添加子节点所在的位置(Worker节点)
node-2
node-3
node-4

# 将配置好的spark 复制到其他机器上(node-2,node-3,node-4)
$ scp -r spark-2.3.2-bin-hadoop2.7 root@node-2:/xxx/xxx

# 启动spark集群
$ sbin/start-master.sh
$ sbin/start-slaves.sh

# 也可以是用这个脚本启动所有机器
$ sbin/start-all.sh

启动后执行jps命令,主节点上有Master进程,其他子节点上有Work进行,登录Spark管理界面查看集群状态(主节点): http://node-1:8080/

Spark 集群 HA

机器规划

主机名 IP 安装软件 运行进程
node-1 192.168.91.11 spark Master
node-2 192.168.91.12 spark,zookeeper Master,QuorumPeerMain
node-3 192.168.91.13 spark,zookeeper Worker,QuorumPeerMain
node-4 192.168.91.14 spark,zookeeper Worker,QuorumPeerMain

1.安装配置zk集群,并启动zk集群 zookeeper安装

2.修改spark的配置文件添加如下配置

export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node-2:2181,node-3:2181,node-4:2181 -Dspark.deploy.zookeeper.dir=/spark"

3.修改所有节点的slaves文件改为(node-3,node-4)节点

4.在node1上执行 sbin/start-all.sh,然后在 node-2 上启动第二个 Master(sbin/start-master.sh )

执行第一个spark程序

$SPARK_HOME/bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://master-ip:7077 --executor-memory 1G --total-executor-cores 2 $SPARK_HOME/examples/jars/spark-examples_2.11-2.3.3.jar 100

spark Shell

spark-shell是Spark自带的交互式Shell程序,方便用户进行交互式编程,用户可以在该命令行下用scala编写spark程序。

$SPARK_HOME/bin/spark-shell --master spark://node-1:7077 --executor-memory 2g --total-executor-cores 2

参数说明:

# 指定Master的地址
--master spark://node-1:7077

# 指定每个worker可用内存为2G
--executor-memory 2g

# 指定整个集群使用的cup核数为2个
--total-executor-cores 2

注意

如果启动spark shell时没有指定master地址,但是也可以正常启动spark shell和执行spark

shell中的程序,其实是启动了spark的local模式,该模式仅在本机启动一个进程,没有与集群建立联系。

Spark Shell中已经默认将SparkContext类初始化为对象sc。用户代码如果需要用到,则直接应用sc即可

spark shell中编写WordCount

在spark shell中用scala语言编写spark程序

# sc是SparkContext对象,该对象时提交spark程序的入口
sc.textFile("file:///root/data/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("file:///root/data/output1")

# 从本地文件系统中读取数据
textFile("file:///root/data/words.txt")

# 读取每一行数据并切分
flatMap(_.split(" "))

# 将数据切分映射将单词和1构成元组
map((_,1))

# 按照key进行reduce,并将value累加
reduceByKey(_+_)

# 将结果写入到指定位置
saveAsTextFile("file:///root/data/output1")

以上所述就是小编给大家介绍的《Spark 快速入门》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

HTML5

HTML5

Matthew David / Focal Press / 2010-07-29 / USD 39.95

Implement the powerful new multimedia and interactive capabilities offered by HTML5, including style control tools, illustration tools, video, audio, and rich media solutions. Understand how HTML5 is ......一起来看看 《HTML5》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具