目录
介绍
Spark and Hadoop
Spark or Hadoop
核心模块
Spark Core
Spark SQL
Spark Streaming
Spark MLlib
Spark GraphX
快速上手
来源:
介绍
Spark
是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。
Spark and Hadoop
Hadoop
Hadoop
是由
java
语言编写的,在分布式服务器集群上存储海量数据并运行分布式
分析应用的开源框架
作为
Hadoop
分布式文件系统,
HDFS
处于
Hadoop
生态圈的最下层,存储着所有
的 数 据 , 支 持 着
Hadoop
的 所 有 服 务 。 它 的 理 论 基 础 源 于
Google
的
TheGoogleFileSystem
这篇论文,它是
GFS
的开源实现。
MapReduce
是一种编程模型,
Hadoop
根据
Google
的
MapReduce
论文将其实现,
作为
Hadoop
的分布式计算模型,是
Hadoop
的核心。基于这个框架,分布式并行
程序的编写变得异常简单。综合了
HDFS
的分布式存储和
MapReduce
的分布式计
算,
Hadoop
在处理海量数据时,性能横向扩展变得非常容易。
HBase
是对
Google
的
Bigtable
的开源实现,但又和
Bigtable
存在许多不同之处。
HBase
是一个基于
HDFS
的分布式数据库,擅长实时地随机读
/
写超大规模数据集。
它也是
Hadoop
非常重要的组件。
Spark
Spark
是一种由
Scala
语言开发的快速、通用、可扩展的
大数据分析引擎
Spark Core
中提供了
Spark
最基础与最核心的功能
Spark SQL
是
Spark
用来操作结构化数据的组件。通过
Spark SQL
,用户可以使用
SQL
或者
Apache Hive
版本的
SQL
方言(
HQL
)来查询数据。
Spark Streaming
是
Spark
平台上针对实时数据进行流式计算的组件,提供了丰富的
处理数据流的
API
。
Spark or Hadoop
Hadoop MapReduce
由于其设计初衷并不是为了满足循环迭代式数据流处理,因此在多
并行运行的数据可复用场景(如:机器学习、图挖掘算法、交互式数据挖掘算法)中存
在诸多计算效率等问题。所以
Spark
应运而生,
Spark
就是在传统的
MapReduce
计算框
架的基础上,利用其计算过程的优化,从而大大加快了数据分析、挖掘的运行和读写速
度,并将计算单元缩小到更适合并行计算和重复使用的
RDD
计算模型
机器学习中
ALS
、凸优化梯度下降等。这些都需要基于数据集或者数据集的衍生数据
反复查询反复操作。
MR
这种模式不太合适,即使多
MR
串行处理,性能和时间也是一
个问题。数据的共享依赖于磁盘。另外一种是交互式数据挖掘,
MR
显然不擅长。而
Spark
所基于的
scala
语言恰恰擅长函数的处理。
Spark
是一个分布式数据快速分析项目。它的核心技术是弹性分布式数据集(
Resilient
Distributed Datasets
),提供了比
MapReduce
丰富的模型,可以快速在内存中对数据集
进行多次迭代,来支持复杂的数据挖掘算法和图形计算算法。
Spark
和
Hadoop
的根本差异是多个作业之间的数据通信问题
: Spark
多个作业之间数据
通信是基于内存,而
Hadoop
是基于磁盘。
Spark Task
的启动时间快。
Spark
采用
fork
线程的方式,而
Hadoop
采用创建新的进程
的方式。
Spark
只有在
shuffle
的时候将数据写入磁盘,而
Hadoop
中多个
MR
作业之间的数据交
互都要依赖于磁盘交互
Spark
的缓存机制比
HDFS
的缓存机制高效
核心模块
Spark Core
Spark Core
中提供了
Spark
最基础与最核心的功能,
Spark
其他的功能如:
Spark SQL
,
Spark Streaming
,
GraphX, MLlib
都是在
Spark Core
的基础上进行扩展的
Spark SQL
Spark SQL
是
Spark
用来操作结构化数据的组件。通过
Spark SQL
,用户可以使用
SQL
或者
Apache Hive
版本的
SQL
方言(
HQL
)来查询数据。
Spark Streaming
Spark Streaming
是
Spark
平台上针对实时数据进行流式计算的组件,提供了丰富的处理
数据流的
API
。
Spark MLlib
MLlib
是
Spark
提供的一个机器学习算法库。
MLlib
不仅提供了模型评估、数据导入等
额外的功能,还提供了一些更底层的机器学习原语。
Spark GraphX
GraphX
是
Spark
面向图计算提供的框架与算法库。
快速上手
创建Maven项目,添加Scala插件
【Idea】建立Scale框架_岱宗夫如何、的博客-CSDN博客
POM.xml,添加Spark依赖环境和 scala插件
scala-maven-plugin 用于在 maven 中编译/测试/运行/记录 scala 代码。
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 该插件用于将 Scala 代码编译成 class 文件 -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<!-- 声明绑定到 maven 的 compile 阶段 -->
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
WordCount案例
package com.qihang.bigdata.spark.core.wc
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object WordCount {
def main(args: Array[String]): Unit = {
//Application
//Spark 框架
//TODO 建立和Spark框架连接
val sparConf = new SparkConf().setMaster("local").setAppName("WordCount")
val sc = new SparkContext(sparConf)
//TODO 执行业务逻辑
//读取文件,获取一行一行的数据
//Hello world
//Hello Spark
val lines = sc.textFile("datas")
//拆分成一个一个的单词 扁平化
//hello world hello,world,hello,world
val words = lines.flatMap(_.split(" "))
//按照word分组
//(hello, hello, hello)
val wordGroup: RDD[(String, Iterable[String])] = words.groupBy(word => word)
//转换
//(hello,3)
// val wordToCount: RDD[(String, Int)] = wordGroup.map(
// tuple => (tuple._1, tuple._2.size)
// )
val wordToCount: RDD[(String, Int)] = wordGroup.map{
case ( word, list ) => {
(word, list.size)
}
}
//打印
val array = wordToCount.collect()
array.foreach(println(_))
//TODO 关闭连接
sc.stop()
}
}
执行过程中,会产生大量的执行日志,如果为了能够更好的查看程序的执行结果,可以在项
目的
resources
目录中创建
log4j.properties
文件,并添加日志配置信息:
log4j.rootCategory=ERROR, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd
HH:mm:ss} %p %c{1}: %m%n
# Set the default spark-shell log level to ERROR. When running the spark-shell,
the
# log level for this class is used to overwrite the root logger's log level, so
that
# the user can have different defaults for the shell and regular Spark apps.
log4j.logger.org.apache.spark.repl.Main=ERROR
# Settings to quiet third party logs that are too verbose
log4j.logger.org.spark_project.jetty=ERROR
log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=ERROR
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=ERROR
log4j.logger.org.apache.parquet=ERROR
log4j.logger.parquet=ERROR
# SPARK-9183: Settings to avoid annoying messages when looking up nonexistent
UDFs in SparkSQL with Hive support
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
来源:
尚硅谷
scala-maven-plugin – scala-maven-plugin (davidb.github.io)