Spark:spark只是一个计算框架,它的能力是在现有数据的基础上提供一个高性能的计算引擎,然后提供一些上层的处理工具比如做数据查询的Spark SQL、做机器学习的MLlib等;而hadoop的功能则更加全面,它是包括了数据存储(HDFS)、任务计划和集群资源管理(YARN)以及离线并行计算(MapReduce)的一整套技术栈。
Spark架构示意图
Spark的核心库是spark core。还有其他的是个库分别为Spark SQL、Spark Streaming、MLlib、Graphx。
只要掌握Spark一门编程语言就可以编写不同应用场景的应用程序(批处理,流计算,图计算等)。Spark主要用来代替Hadoop的MapReduce部分。
为什么要用spark来代替hadoop?
Hadoop MapReduce缺点:
表达能力有限
磁盘IO开销大,任务之间的衔接涉及IO开销
延迟高,Map任务要全部结束,reduce任务才能开始。
Spark借鉴Hadoop MapReduce优点的同时,解决了MapReuce所面临的问题,Spark所采用的Executor有如下优点:
Spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作,还提供多种数据集操作类型,编程模型比Hadoop MapReduce更灵活。Spark提供了内存计算,可将中间结果放到内存中,对于迭代运算效率更高。
spark可以利用多线程来执行具体的任务减少任务的启动开销;
Executor中有一个BlockManager存储模块,会将内存和磁盘共同作为存储设备,有效减少IO开销;
当执行一个Application时,Driver会向集群管理器申请资源,启动Executor,并向Executor发送应用程序代码和文件,然后在Executor上执行Task,运行结束后,执行结果会返回给Driver,或者写到HDFS或者其它数据库中。
Spark详细运行过程
Spark运行架构特点:
宽依赖与窄依赖
宽依赖:表现为存在一个父RDD的一个分区对应一个子RDD的多个分区。
窄依赖:表现为一个父RDD的分区对应于一个子RDD的分区或者多个父RDD的分区对应于一个子RDD的分区。
前面介绍了Spark的基本组成架构及运行原理,接下来让我们一起编写一个Spark程序吧。
工作准备
1.搭建Spark开发环境使用eclipse软件开发
2.java的jdk版本要求1.8以上,没有的可以去下载1.8版本的进行安装
3.安装Scala,不会安装可以自行百度。或者点击下方下载eclipse。已经安装好Scala,解压即可使用。只需要自己在本机安装jdk1.8及以上的版本。
eclipse资源:
链接:https://pan.baidu.com/s/1T_SA81mO115CMdl0uZn16A
提取码:x9yi
新建好后,窗体左边就会出现下图项目文件列表,我们需要修改一下Scala的依赖jar包的版本,修改为2.11的版本,鼠标右键单机,点击Properties.
选择最后一个2.11.11版本的。
然后导入需要的Spark的jar包,找到你的jar文件夹,将所有jar包导入进去。点击下方链接下载需要的jar包
jar下载链接:https://pan.baidu.com/s/1bqf15nZmGLtlSbFqfiDrMw
提取码:a6fw
做完以上步骤以后我们就可以开始编写我的的Spark程序了。
word count单词统计程序代码如下:
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
object word_Count {
def main(args: Array[String]): Unit = {
//1.sc
//System.setProperty("hadoop.home.dir", "C:\\Users\\Administrator\\Desktop\\Spark\\spark-2.0.2-bin-hadoop2.7")
var conf = new SparkConf();
conf.setMaster("local[*]").setAppName("spark"); //本机 运行
var sc = new SparkContext(conf); //创建spark的运行环境
//sc.setLogLevel("WARN");
//2.sc.textFile->RDD
var path="src/data/data"; //数据存放路径,
var filedtad_rdd = sc.textFile(path,2);
//3.rdd.map word->(w,1)
//数据清洗
var word_rdd = filedtad_rdd.flatMap(_.split("\\W+")).map(x=>(x,1)).reduceByKey(_+_).map(_.swap).sortByKey(false);
println(word_rdd.count());
//rdd.reduce->w->sum
//数据清洗后输出
word_rdd.foreach{line =>
println("word="+line._2+",sum="+line._1)
}
print(filedtad_rdd.count())
print("end..............................................");
}
}
介绍及图片来自博客:https://blog.csdn.net/zxc123e/article/details/79912343
https://blog.csdn.net/weixin_42418774/article/details/90677860