Spark追妻系列(Spark初了解)

感觉每天又有了希望,又有动力,感觉学习尽头十足

Spark是什么

        Spark是一个用来实现快速而通用的集群计算的平台。

        在之前,学习了MR,学习了hadoop,用mapreduce来对数据进行处理,但是hadoop是用批处理的,而且还有延迟,况且,出来了Hive,Hive将sql转化为mr算子。可以不用去写mr代码就可以对数据进行分析。

        Spark是集群计算,是在hadoop集群中进行的,Spark的一个主要特点就是能够在内存中进行计算,在内存中计算比在磁盘上运算要快很多,同时现在学习Spark的代价也很小了,大数据相关的软件都在慢慢实现SQL化,SPark,Flink 都支持SQL进行处理。

 

        Spark是一个软件的大集合,从上面的图中可以看到,在以Spark Core为基础和重点的基础上,增加了SQL,实时计算,机器学习,图计算。

Spark Core是什么

        spark core实现了spark的基本功能,包括任务调度,内存管理,错误恢复和存储系统交互等模块。

Spark SQL是什么

        SPark SQL是用Spark来操作结构化数据的程序包,通过Spark SQL可以使用Hive SQL来查询数据,同时Hive的默认引擎是mr,也可以换成Spark。

        同时呢,只介绍这两个,因为这两个将会在后面的博客出现几个月甚至一年。等实力够了再去学习其它的。

初识Spark

        在博客中讲解的Spark都是基于windows本地的,不是在命令行上面sbt。

        关于spark的本地安装,可以去b站看看尚硅谷的Spark视频。

命令行和本地运行的差别

  1. 在本地运行时,可以在idea上写代码,但是需要自行初始化SparkContext
  2. 命令行提交之后就会出结果,本地运行直接在Idea中出结果

初始化SparkContext

        想要在本地编写Spark Core代码,需要本地的Hadoop 和 Spark环境。

        导入Spark的包,创建SparkContext。

        先创建一个SparkConf对象来配置你的应用,然后基于这个SparkConf来创建SparkContext对象。

        val cf =new SparkConf().setMaster("local").setAppName("") val sc = new SparkContext(cf)

为什么要这样做呢?

  1. 集群url,告诉Spark如何连接集群,因为是本地集群,所以SetMaster的时候是local
  2. 为此次程序命名

        初始化Spark Context后,就可以创建RDD来进行代码了。

        关闭的时候 通过 sc.stop()就可以推出应用

        通过RDD来实现W C

首先看一下数据源

        在MapReduce中,word count就是第一个入门案例,在Spark里面,WordCount也是第一个入门案例。

代码实现

val wordCount = new SparkConf().setMaster("local").setAppName("WordCount") 
val sparkContext = new SparkContext(wordCount) 
val value = sparkContext.textFile("date/1.txt") 
val value1 = value.flatMap(_.split(" ")) 
val value2 = value1.groupBy(value1 => value1) 
val value3 = value2.map { case (word, list) => (word, list.size) } value3.collect().foreach(println(_)) s
parkContext.stop()

        上面就是用Scala代码来实现的WordCount。

首先进行层层分析

  1. 创建SparkConf对象,对集群进行配置,创建SparkContext对象
val wordCount = new SparkConf().setMaster("local").setAppName("WordCount") 
val sparkContext = new SparkContext(wordCount)

2.通过textFile来获取数据源

val value = sparkContext.textFile("date/1.txt")

3.逻辑代码

//flatMap函数,将数据根据空格分开
val value1 = value.flatMap(_.split(" ")) 
//groupBy分组,对每个单词进行分组 
val value2 = value1.groupBy(value1 => value1) 
//map + match进行匹配 value2的类型是(String,Iterable) 
val value3 = value2.map { case (word, list) => (word, list.size) } 
//如果匹配到老了,就转换类型 
(String,Iterable) => (String,Int)

RDD是什么

        RDD是弹性 分布式 数据集。

        在Spark中,对数据的所有操作就是创建RDD,转化已有的RDD,调用RDD进行求值

如何创建RDD

两种方法创建RDD

  1. 读取一个外部数据集
  2. 在驱动程序里分发驱动程序中的对象集合

        上面的例子中,通过读取外部文件来创建RDD

        创建RDD过后,RDD支持两种操作,转换和动作。

        转错操作就是各种算子,由一个RDD变成另外一个新的RDD。行动算子会对RDD计算出结果,并将结果返回控制台。

        上面的例子中,flatMap,map,groupBy都是转换算子,foreach,collect等都是动作算子

        虽然一个程序会有多个算子,但是Spark是惰性运算RDD的,只有在第一次用到的时候,这个RDD算子才会运作,还有一点先说一下,RDD算子并不存储数据,只是一个工具,数据都是在各个节点根据RDD进行运算的。

        默认情况下,Spark中的RDD会在每次行动算子运算的时候会重新运算,如果想多个行动操作用一个RDD,那么可以RDD.persist()让Spark对RDD进行缓存。也就是持久化。

总结:

        先写一篇简短的文章,明天会输出篇幅比较大的文章。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值