简介
Spark是基于内存计算的大数据分布式计算框架。Spark基于内存计算,提供可交互查询方式,提供近实时处理方式,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量廉价硬件之上,形成集群。
Spark使用Scala语言进行实现,它是一种面向对象、函数式编程语言,能够像操作本地集合对象一样轻松地操作分布式数据集(Scala提供一个称为Actor的并行模型,其中Actor通过它的收件箱来发送和接收非同步信息而不是共享数据,该方式被称为:Shared Nothing模型)。
特点
-
运行速度快
数据从内存中读取,理论上速度可以高达HadoopMapReduce的100多倍。 -
适用性强
- 支持3种语⾔言的API:scala、java、python,特别是Scala是一种高效、可拓展的语言,能够用简洁的代码处理较为复杂的处理工作。
- 能够读取HDFS、Cassandra和HBase等离线数据。
- 能够读取Kafka、Flume和Kinesis等实时数据。
- 能够以Mesos、YARN或Standalone作为资源管理器调度JOB,进行集群资源的合理分配和容错,来完成Spark应用程序的计算。
-
通用性强
Spark生态圈即BDAS(伯克利数据分析栈)包含了Spark Core、Spark SQL、MLLib、GraphX、Spark Streaming和Structured Streaming等组件,提供离线计算、实时计算、图形化处理和机器学习等能力,能够无缝的集成并提供一站式解决方案。
-
Spark Core:包含Spark的基本功能。尤其是定义RDD的API、操作以及这两者上的动作。其他Spark的库都是构建在RDD和Spark Core之上的。
-
Spark SQL:提供Hive查询语言(HiveQL)以及SQL查询语言(如Mysql)与Spark进行交互的API。每个数据库表被当做一个RDD,Spark SQL查询被转换为Spark Core操作。
-
Spark Streaming:对实时数据流进行处理和控制。Spark Streaming允许程序能够像普通RDD一样处理实时数据。
-
Structured Streaming:以结构化的方式操作流式数据,能够像使用Spark SQL处理批处理一样,处理流数据。基于Event-Time,相比于SparkStreaming的Receive-Time更精确。
-
GraphX:控制图、并行图操作和计算的一组算法和工具的集合。GraphX扩展了RDD API,包含控制图、创建子图、访问路径上所有顶点的操作。
-
MLlib:一个常用机器学习算法库,算法被实现为对RDD的Spark操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。
-
Spark和Hadoop的区别
-
Hadoop有两个核心模块,分布式存储模块HDFS和分布式计算模块MapReduce。
-
Spark本身并没有提供分布式存储能力,因此Spark的数据存储大多依赖于Hadoop的分布式文件系统HDFS。
-
Hadoop的MapReduce与Spark都可以进行数据计算,而相比于MapReduce,Spark拥有DAG执行引擎,支持在内存中对数据进行迭代计算。官方提供的数据表明,如果数据由磁盘读取,速度是MapReduce的10倍以上,如果数据从内存中读取,速度可以高达100多倍。
-
Spark的容错性高,通用性好。
Spark的适用场景
- Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小
- 由于RDD的特性,Spark不适用那种异步细粒度更新状态的应用,例如web服务的存储或者是增量的web爬虫和索引。就是对于那种增量修改的应用模型不适合
- 数据量不是特别大,但是要求实时统计分析需求
Spark项目的pom.xml文件
环境:intellij idea 2017.3.4 + maven 3.5.0
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>spark</groupId>
<artifactId>spark</artifactId>
<version>1.0-SNAPSHOT</version>
<!--<properties>-->
<!--<scala.version>2.11.8</scala.version>-->
<!--</properties>-->
<!--引入依赖的jar包-->
<dependencies>
<!--spark-core在资源库的坐标信息-->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.3.2</version>
</dependency>
<!--spark-sql在资源库的坐标信息-->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>com.databricks</groupId>
<artifactId>spark-avro_2.11</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>