Spark Core学习笔记(一)

本文介绍了Spark的核心组件及其在大数据计算中的角色,包括Spark Core、Spark SQL、Spark Streaming与MapReduce的对比,强调了Spark在速度和内存计算上的优势。同时,对比了Spark SQL与Hive、Spark Streaming与Storm的异同,指出Spark SQL在速度上的提升以及在实时计算中根据需求选择的重要性。
摘要由CSDN通过智能技术生成
一、Spark介绍
Spark 是一种通用的大数据计算框架, 正如传统大数据技术Hadoop的MapReduce、Hive引擎, 以及Storm流式实时计算引擎等。
Spark包含了大数据领域常见的各种计算框架, 比如:
1、Spark Core用于离线计算 2、Spark SQL用于交互式查询
3、Spark Streaming用于实时流式计算 4、Spark MLlib用于机器学习
5、Spark GraphX用于图计算
Spark主要用于大数据的计算, 而Hadoop以后主要用于大数据的存储( 比如HDFS、 Hive、HBase等) , 以及资源调度( Yarn)
Spark+Hadoop的组合,应该是未来大数据领域最热门的组合, 也是最有前景的组合
二、Spark VS MapReduce
1、MapReduce能够完成的各种离线批处理功能, 以及常见算法( 比如二次排序、 topn等) , 基于SparkRDD的核心编程, 都可以实现, 并且可以更好地、 更容易地实现。 而且基于Spark RDD编写的离线批处理程序,运行速度是MapReduce的数倍, 速度上有非常明显的优势。
2、Spark相较于MapReduce速度快的最主要原因就在于, MapReduce的计算模型太死板, 必须是mapreduce模式, 有时候即使完成一些诸如过滤之类的操作, 也必须经过map-reduce过程, 这样就必须经过shuffle过程。 而MapReduce的shuffle过程是最消耗性能的, 因为shuffle中间的过程必须基于磁盘来读写。 而Spark的shuffle虽然也要基于磁盘, 但是其大量transformation操作, 比如单纯的map或者filter等操作, 可以直接基于内存进行pipeline操作, 速度性能自然大大提升。
3、但是Spark也有其劣势。 由于Spark基于内存进行计算, 虽然开发容易, 但是真正面对大数据的时候( 比如一次操作针对10亿以上级别) , 在没有进行调优的情况下, 可能会出现各种各样的问题, 比如OOM内存溢出等等。 导致Spark程序可能都无法完全运行起来, 就报错挂掉了, 而MapReduce即使是运行缓慢, 但是至少可以慢慢运行完。
三、Spark SQL VS Hive
1、Spark SQL实际上并不能完全替代Hive, 因为Hive是一种基于HDFS的数据仓库, 并且提供了基于SQL模型的, 针对存储了大数据的数据仓库, 进行分布式交互查询的查询引擎。
2、严格的来说, Spark SQL能够替代的, 是Hive的查询引擎, 而不是Hive本身, 实际上即使在生产环境下, Spark SQL也是针对Hive数据仓库中的数据进行查询, Spark本身自己是不提供存储的, 自然也不可能替代Hive作为数据仓库的这个功能。
3、Spark SQL的一个优点, 相较于Hive查询引擎来说, 就是速度快, 同样的SQL语句, 可能使用Hive的查询引擎, 由于其底层基于MapReduce, 必须经过shuffle过程走磁盘, 因此速度是非常缓慢的。 很多复杂的SQL语句, 在hive中执行都需要一个小时以上的时间。 而Spark SQL由于其底层基于Spark自身的基于内存的特点, 因此速度达到了Hive查询引擎的数倍以上。
4、但是Spark SQL由于与Spark一样, 是大数据领域的新起的新秀, 因此还不够完善, 有少量的Hive支持的高级特性,Spark SQL还不支持, 导致Spark SQL暂时还不能完全替代Hive的查询引擎。 而只能在部分Spark SQL功能特性可以满足需求的场景下, 进行使用。
5、而Spark SQL相较于Hive的另外一个优点, 就是支持大量不同的数据源, 包括hive、 json、 parquet、jdbc等等。 此外, Spark SQL由于身处Spark技术堆栈内, 也是基于RDD来工作, 因此可以与Spark的其他组件无缝整合使用, 配合起来实现许多复杂的功能。 比如Spark SQL支持可以直接针对hdfs文件执行sql语句!
四、Spark Streaming VS Storm
1、Spark Streaming与Storm都可以用于进行实时流计算。 但是他们两者的区别是非常大的。 其中区别之一, 就是, SparkStreaming和Storm的计算模型完全不一样, Spark Streaming是基于RDD的, 因此需要将一小段时间内的, 比如1秒内的数据,收集起来, 作为一个RDD, 然后再针对这个batch的数据进行处理。 而Storm却可以做到每来一条数据, 都可以立即进行处理和计算。 因此, Spark Streaming实际上严格意义上来说, 只能称作准实时的流计算框架; 而Storm是真正意义上的实时计算框架。
2、此外, Storm支持的一项高级特性, 是Spark Streaming暂时不具备的, 即Storm支持在分布式流式计算程序( Topology)在运行过程中, 可以动态地调整并行度, 从而动态提高并发处理能力。 而Spark Streaming是无法动态调整并行度的。
3、但是Spark Streaming也有其优点, 首先Spark Streaming由于是基于batch进行处理的, 因此相较于Storm基于单条数据进行处理, 具有数倍甚至数十倍的吞吐量。
4、此外, Spark Streaming由于也身处于Spark生态圈内, 因此Spark Streaming可以与Spark Core、 Spark SQL, 甚至是Spark MLlib、 Spark GraphX进行无缝整合。 流式处理完的数据, 可以立即进行各种map、 reduce转换操作, 可以立即使用sql进行查询, 甚至可以立即使用machine learning或者图计算算法进行处理。 这种一站式的大数据处理功能和优势, 是Storm无法匹敌的。
5、因此, 综合上述来看, 通常在对实时性要求特别高, 而且实时数据量不稳定, 比如在白天有高峰期的情况下, 可以选择使用Storm。 但是如果是对实时性要求一般, 允许1秒的准实时处理, 而且不要求动态调整并行度的话, 选择SparkStreaming是更好的选择。
注:面试常问的问题
1、Spark计算处理数据速度快的原因:
1)基于内存的计算方式 2)基于DAG有向无环图
2、Hive最终是怎么通过什么方式转为MapReduce运行的?
通过编译器、解释器、优化器、执行器转为MR运行。
五、使用三种方式开发spark的程序
1、Spark Shell 的交互式工具
Spark-Shell提供了一种学习API的简单方式, 以及一个能够交互式分析数据的强大工具。
在Scala语言环境下或Python语言环境下均可使用。
a,启动 spark-shell:
./bin/spark-shell
./bin/spark-shell --master spark://hadoop05:7077
./bin/spark-shell --master local[2] 以两个线程(CPU的两个核数)去运行spark-shell
./bin/spark-shell --master local[2] --jar testcode.jar //指定Jar包路径
注:1》在spark-shell启动的过程中,会创建一个名为sc的SparkContext对象、
2》--master用来设置context将要连接并使用的资源主节点, master的值可以是Standalone模式
的Spark集群地址、 Mesos或Yarn集群的URL, 或者是一个local地址。
3》使用--jar可以添加Jar包的路径, 使用逗号分隔可以添加多个包。
4》park-Shell的本质是在后台调用了spark-submit脚本来启动应用程序。
b、收集到数据后,需要对数据进行各种处理,包括数据的抽取-转换-装载(Extract-Transform-Load, ETL) 、 数据统计、 数据挖掘, 以及为后续的数据呈现和为决策而提供的数据持久化。
c、本案例数据处理过程, 包含了对外部文件的加载, 对文件数据的转换、 过滤、 各种数据统计,
以及处理结果的存储。
1》加载文件 :val texthdfs=sc.textFile("hdfs://hadoop04:9000/spark/words.txt")
val textlocal=sc.textFile("file:///home/hadoop/spark.txt")
Spark创建sc之后, 可以加载本地文件创建RDD, 返回一个MapPartitionsRDD。
加载HDFS文件和本地(Linux)文件都是使用textFile( ), 区别是添加前缀进行标识, hdfs://或file:///
不同点:从本地读取的文件返回MapPartitionsRDD,而从HDFS读取的文件先转成HadoopRDD, 然后隐式转换成MapPartitonsRDD。
相同点:MapPartitionsRDD和HadoopRDD都是基于Spark的弹性分布式数据集RDD。
2》执行Transformation操作返回新RDD
texthdfs.first() //获取RDD文件的第一行
texthdfs.count() //获取RDD文件的行数
val textRDD=texthdfs.filter(line=>line.contains(“spark”)) //过滤出包含Spark的行, 并返回新RDD
texthdfs.filter(line=>line.contains(“spark”)).count() //链接多个Transformation和Action操作
texthdfs.filter(line=>line.contains("spark")).foreach(word=>println(word))
3》找出文本中每行最多的单词数
texthdfs.map(line=>line.split(“\t”).size).reduce((a,b)=>if(a>b) a else b)
首先将textFile的每一行文本使用split(“\t”)进行分词, 并统计分词后的单词数量, 然后执行reduce操作, 使用(a,b)=>if(a>b) a else b 进行比较, 返回最大值。
4》词频统计
val wordCount=texthdfs.flatMap(line=>line.split(“\t”)).map(word=>(word,1)).reduceByKey((x,y)=>x+y)
执行:wordCount.collect()
注:a、结合flatMap、 Map和reduceByKey来计算文件中每个单词的词频, 并返回(String,Int)类型的
键值对ShuffleRDD, 最后使用collect()聚合单词计数结果。
b、如果想让代码更简洁, 可以使用占位符”_”。
c、当每个参数在函数文本中最多出现一次的时候, 可以使用下划线_+_扩展成带两个参数的函
数文本。
d、多个下划线指代多个参数, 而不是单个参数的重复使用。 第一个下划线代表第一个参数, 第
二个下划线代表第二个参数 texthdfs.flatMap(_.split("\t")).map((_,1)).reduceByKey(_+_)
.foreach(m=>println(m._1+"appears~~"+ m._2+"~~times"))
e、Spark默认是不进行排序的,可以使用sortByKey按照Key进行排序,false为降序,true为升序
f、texthdfs.flatMap(_.split("\t")).map((_,1)).reduceByKey(_+_).map(m=>map(m=(m._2,m._1)).foreach(m=>println(m._1+"..."+m._2+"..times"))
其中, m=>(m._2,m._1)实现key和value互换
g、第一、val wordcount=texthdfs.flatMap(_.split("\t")).map((_,1)).reduceByKey(_+_).map(m=>(m._2,m._1)).sortByKey(false).map(m=>(m._2,m._1))
第二、val wordcount=texthdfs.flatMap(_.split("\t")).map((_,1)).reduceByKey(_+_).sortBy(_._2,false)
如下,将最终的单词统计结果保存到HDFS上:wordcount.saveAsTextFile(“hdfs://hadoop04:9000/spark/wordcountout”)
5》RDD缓存(内存持久化)
result.cache() //缓存到内存
result.persist() //同上
result.unpersist() //清除缓存
Spark支持将数据集存进内存缓存中, 当数据被反复访问时, 是非常有用的。
texthdfs.cache() //通过cache缓存数据可用于非常大的数据集, 支持跨越几十或几百个节点。
注:collect 将计算结果从集群中获取到本地内存来显示,容易发生OOM(内存溢出),所以collect只适合结果数据量较小的情况,如果计算结果数据量很大,此时要用foreach()输出
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值