Spark

Spark是专为大规模数据处理而设计的快速通用的计算引擎。 诞生于2009年,是加州大学伯克利分校RAD实验室的一个研究项目,最初基于Hadoop Mapreduce。 但是,由于Mapreduce在迭代式计算和交互式上低效,因此引入内存存储。
Spark包括多个紧密集成的组件:
- name: “featured-image” src: “featured-image.png”
Spark的组件
Spark core
- 基本功能:任务调度,内存管理,容错机制
- 内部定义了RDDs(Resilient distributed datasets, 弹性分布式数据集)
- 提供API创建和操作RDDs
- 在应用场景中,为其他组件提供底层的服务
Spark SQL
- Spark处理结构化数据的库,类似Hive SQL,Mysql
- 应用场景,企业用来做报表统计
Spark Streaming
- 实时数据流处理组件,类似storm
- 提供API操作实时流数据
- 应用场景,企业用来从Kafka(等消息队列中)接收数据做实时统计
Mlib
- 一个包含通用机器学习功能的包,Machine learning lib,包括分类、聚类、回归、模型评估和数据导入等
- Mlib提供的方法都支持集群上的横向扩展(平时使用python是单机处理且有限的,而Mlib是集群的)
- 应用场景,机器学习
Graphx
- 处理图的库(如社交网络图),并进行图的并行计算
- 像Spark Steaming和Spark SQL一样,它也继承了RDDs API
- 提供了各种图操作和常用的图算法,例如PangeRank算法
- 应用场景,图计算
Cluster Managers
- 集群管理,Spark自带的一个集群管理是单独调度器
- 常见集群管理包括Hadoop YARN,Apache Mesos
紧密集成的优点
- Spark底层优化了,基于Spark底层的组件也得到了相应的优化
- 紧密集成,节省了各个组件组合使用时的部署,测试等时间
- 向Spark增加新的组件时,其它组件可立刻享用新组件的功能
Spark与Hadoop比较
- Spark应用场景:时效性要求高(因为基于内存)、机器学习领域
- Spark不具有HDFS(分布式文件系统)的存储能力,要借助HDFS等工具来持久化数据
- Hadoop应用场景:离线处理、对时效性要求不高
安装
Spark安装
1. Spark下载,安装
1.1 下载地址:http://spark.apache.org/downloads.html,
版本需匹配:Spark 1.6.2 - Scala 2.10 或 Spark 2.0.0 - Scala 2.11
1.2 解压
2. Spark Shell操作
2.1 目录:
bin包含用来和Spark交互的可执行文件,如Spark shell
core,steaming,python,…包含主要组件的源代码
examples包含一些单机Spark job,可以用来研究和运行的例子
2.2 Spark的Shell
能够处理分布在集群上的数据
Spark把数据加载到节点的内存中,因此分布式处理可在秒级完成
快速迭代式计算,实时查询、分析一般能够在shells中完成
Spark提供了Python shells和Scala shells
3. Spark开发环境搭建
3.1 IntelliJ IDEA的下载、安装:
下载地址:https://www.jetbrains.com/idea/
3.2 插件安装
在IntelliJ IDEA开发环境中安装即可
3.3 搭建开发环境常遇到的问题
网络问题
版本匹配问题:Scala2.10.5,Jdk1.8,Spark1.6.2,Sbt0.13.8
Scala安装
-
Spark下载,安装
下载地址:http://www.scala-lang.org/download/2.10.5.html
版本需匹配:Spark 1.6.2 - Scala 2.10 或 Spark 2.0.0 - Scala 2.11
-
Scala基础知识
在Scala创建变量时,必须使用val或var
val,变量值不可修改,一旦分配不能重新指向别的值
var,分配后,可以指向类型相同的值
RDDs介绍
通过SparkContext对象访问Spark, SparkContext对象代表和一个集群的连接, 在Shell中SparkContext自动创建好了,就是sc
-
RDDs并行的分布在整个集群中,如将500G的一个执行文件划分成5个100G的文件到不同的机器并行
-
RDDs是Spark分发数据和计算的基础抽象类
-
一个RDD是一个不可改变的分布式集合对象
-
Spark中,所有的计算都是通过RDDs的创建,转换,操作完成的
-
一个RDD内部由许多partitions(分片)组成,
分片:
每个分片包括一部分数据,partitions可在集群不同节点上计算
分片是Spark并行处理的单元,Spark顺序的,并行的处理分片
-
RDDs创建方法:
把一个存在的集合传给SparkContext的parallelize方法,测试用
val rdd = sc.parallelize(Array(1,2,2,4),4)
第一个参数:待并行化处理的集合,第二个参数:分区个数
加载外部数据集:
val = rddText = sc。textFile(“helloSpark.txt”)