Just Do IT !

初识Spark

字数统计: 1.9k阅读时长: 7 min
2019/08/13 Share

Spark简介

Spark是什么

Spark是一个快读且通用的集群计算平台

Spark的特点

Spark应用程序可以使用R语言、Java、Scala和Python进行编写,极少使用R语言编写Spark程序,Java和Scala语言编写的Spark程序的执行效率是相同的,但Java语言写的代码量多,Scala简洁优雅,但可读性不如Java,Python语言编写的Spark程序的执行效率不如Java和Scala。

Spark是快速的

  • Spark扩充了流行的MapReduce计算模型
  • Spark是基于内存的计算

Spark是通用的

  • Spark的设计容纳了其他分布式系统拥有的功能
  • 批处理,迭代式计算,交互查询和流处理等
  • 优点:降低了维护成本

Spark是高度开放的

  • Spark提供了Python,Java,Scala,Sql的API和丰富的内置库。
  • Spark和其他的大数据工具整合的很好,包括hadoop,kafka等

Spark有4中运行模式

  • local模式,适用于测试
  • standalone,并非是单节点,而是使用spark自带的资源调度框架
  • yarn,最流行的方式,使用yarn集群调度资源
  • mesos,国外使用的多

Spark生态

Spark历史

Spark是美国加州大学伯克利分校的AMP实验室(主要创始人lester和Matei)开发的通用的大数据处理框架。

Spark的组件

Spark包括多个紧密集成的组件:

Spark Core:

包含Spark的基本功能,包含任务调度,内存管理,容错机制等。

内部定义了RDDs(弹性分布式数据集)。

提供了很多APIs来创建和操作这些RDDs。

应用场景:为其他组件提供底层的服务。

Spark SQL:

是Spark处理结构化数据的库,就像Hive SQL,MySQL一样。

应用场景:企业中用来做报表统计

Spark Streaming:

是实时数据流处理组件,类似Storm。

Spark Streaming提供了API来操作实时流数据。

应用场景:企业中用来从kafka接受数据做实时统计。

Milb:

一个包含通用机器学习功能的包,Machine learning lib

包含分类,聚类,回归等,还包括模型评估,和数据导入

MLlib提供的上面的这些方法,都支持集群上的横向扩展

平常我们做机器学习用Python较多,Python最大的缺点是在单机上的,它处理的数据是有限的,而Milb是基于集群的

应用场景,机器学习

Graphx:

是处理图的库(例如,社交网络图),并进行图的并行计算。

像Spark Streaming,Spark SQL一样,它也继承了RDD API。

它提供了各种图的操作,和常用的图算法,例如PageRank算法。

应用场景,图计算。

Cluster Managers:

就是集群管理,Spark自带一个集群管理是单独调度器。

常见集群管理包括Hadoop YARN,Apache Mesos

紧密继承的优点:

  • Spark底层优化了,基于Spark底层的组件,也得到了相应的优化。
  • 紧密集成,节省了各个组件结合使用时的部署,测试等时间。
  • 向Spark增加新的组件时,其他组件,可立即享用新组建的功能

Spark与Hadoop的比较

Hadoop的应用场景

离线处理

Hadoop在处理数据的时候它的中间数据会落到硬盘上,因此导致Hadoop处理大量数据时时效性不是很高。

Hadoop任务的执行时间是几分钟到几小时不等

对时效性要求不高

Spark应用场景

时效性要求高的场景

因为Spark是基于内存的,它的中间数据尽量不落在磁盘上,尽量落在内存中,这样就大大加快了Spark的运算速度

Spark的计算时间一般是几秒钟到几分钟

机器学习等领域

  • 这是一整个生态系统,每个组件都有其作用,各善其职即可
  • Spark不具有HDFS的存储能力,要借助HDFS等持久化数据
  • 大数据将会孕育出更多的新技术

RDDs介绍

Driver program:

包含程序的main()方法,RDDs的定义和操作。
它管理很多节点,我们称作executors

SparkContext:

Driver programs通过SparkContext对象访问Spark。

SparkContext对象代表和一个集群的连接。

在Shell中SparkContext自动创建好了,就是sc。

RDDs:

Resilient distributed datasets(弹性分布式数据集,简写RDDs)

这些RDDs,并行的分布在整个集群中

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")

Scala的基础知识

Scala的变量声明:

在Scala中创建变量的时候,必须使用val或者var

val,变量值不可修改,一旦分配不能重新指向别的值

var,分配后,可以指向类型相同的值

Scala的匿名函数和类型推断:

lines.filter(line=>line.contains("world"))

定义一个匿名函数,接受一个参数line,

使用line这个String类型变量上的contains方法,并且返回结果。

line的类型不需指定,能够推断出来。

RDD基本操作之Transformation

Transformation介绍:

Transformations(转换)

从之前的RDD构建一个新的RDD,像map()和filter().

map():

map()接受函数,把函数应用到RDD的每一个元素,返回新RDD。

filter():

filter()接受函数,返回只包含满足filter()函数的元素的新RDD。

flatMap():

对每个输入元素,输出多个输出元素。

flat压扁的意思,将RDD中元素压扁后返回一个新的RDD.

RDD基本操作之Action

Action介绍:

在RDD上计算出来一个结果。

把结果返回给driver program或保存在文件系统,count(),save

常用函数举例:

reduce()

接收一个函数,作用在RDD两个类型相同的元素上,返回新元素。
可以实现,RDD中元素的累加,计数,和其他类型的聚集操作。

Collect():

遍历整个RDD,向driver program返回RDD的内容

需要单机内存能够容纳下(因为数据要拷贝给driver,测试使用)

大数据的时候,使用savaAsTextFile() action等。

take(n):

返回RDD的n个元素(同时尝试访问最少的partitions)

返回结果是无序的,测试使用

top():

排序(根据RDD中数据的比较器)

foreach():

计算RDD中的每个元素,但不返回到本地。

可以配合println()友好的打印出数据。

RDDs的特性

RDDs的血统关系图:

Spark维护者RDDs之间的依赖关系和创建关系,叫做血统关系图

Spark使用血统关系图来计算每个RDD的需求和恢复丢失的数据

延迟计算(Lazy Evaluation):

Spark对RDDs的计算是,他们第一次使用action操作的时候

这种方式在处理大数据的时候特别有用,可以减少数据的传输

Spark内部记录metadata表名transformations操作已经被响应了

加载数据也是延迟计算,数据只有在必要的时候,才会被加载进去

RDD.persist():

默认每次在RDDs上面进行action操作时,Spark都重新计算RDDs

如果想重复利用一个RDD,可以使用RDD.persist()

unpersist()方法从缓存中移除

例子-peisist()

CATALOG
  1. 1. Spark简介
    1. 1.1. Spark是什么
    2. 1.2. Spark的特点
      1. 1.2.1. Spark是快速的
      2. 1.2.2. Spark是通用的
      3. 1.2.3. Spark是高度开放的
      4. 1.2.4. Spark有4中运行模式
    3. 1.3. Spark生态
      1. 1.3.1. Spark历史
      2. 1.3.2. Spark的组件
        1. 1.3.2.1. Spark Core:
        2. 1.3.2.2. Spark SQL:
        3. 1.3.2.3. Spark Streaming:
        4. 1.3.2.4. Milb:
        5. 1.3.2.5. Graphx:
        6. 1.3.2.6. Cluster Managers:
    4. 1.4. Spark与Hadoop的比较
      1. 1.4.1. Hadoop的应用场景
        1. 1.4.1.1. 离线处理
        2. 1.4.1.2. Spark应用场景
      2. 1.4.2. RDDs介绍
        1. 1.4.2.1. Driver program:
        2. 1.4.2.2. SparkContext:
        3. 1.4.2.3. RDDs:
          1. 1.4.2.3.1. 分片:
          2. 1.4.2.3.2. RDDs的创建方法:
    5. 1.5. Scala的基础知识
      1. 1.5.1. Scala的变量声明:
      2. 1.5.2. Scala的匿名函数和类型推断:
    6. 1.6. RDD基本操作之Transformation
      1. 1.6.1. Transformation介绍:
        1. 1.6.1.1. Transformations(转换)
        2. 1.6.1.2. map():
        3. 1.6.1.3. filter():
        4. 1.6.1.4. flatMap():
    7. 1.7. RDD基本操作之Action
      1. 1.7.1. Action介绍:
      2. 1.7.2. 常用函数举例:
        1. 1.7.2.1. reduce()
        2. 1.7.2.2. Collect():
        3. 1.7.2.3. take(n):
        4. 1.7.2.4. top():
        5. 1.7.2.5. foreach():
    8. 1.8. RDDs的特性
      1. 1.8.1. 延迟计算(Lazy Evaluation):
      2. 1.8.2. RDD.persist():