SparkCore 基础知识(MapReduceVSSpark Spark应用 安装模式 wordcount详解{local模式 yarn-cluster模式})

前面几篇博文我们简述了Hadoop,包括HDFS MapReducede的知识,中间根据案例场景编写几个MR程序的代码实现。因为博主在学习实践的时候,暂时在yarn(资源调度)上应用的不多。这方面的知识 ,南国根据网上的资料和自己的理解写了一篇总结Yarn架构详细剖析

1.MapReduce VS Spark

以下通过我们之前对MapReduce的实践 以及后续Spark的实战,这里做一个小小的对比。
1.MapReduce能够完成的各种离线批处理功能,以及常见算法(比如二次排序、topn等),基于Spark RDD的核心编程,都可以实现,并且可以更好地、更容易地实现。而且基于Spark RDD编写的离线批处理程序,运行速度是MapReduce的数倍,速度上有非常明显的优势。
Spark相较于MapReduce速度快的最主要原因就在于,MapReduce的计算模型太死板,必须是map-reduce模式,有时候即使完成一些诸如过滤之类的操作,也必须经过map-reduce过程,这样就必须经过shuffle过程。而MapReduce的shuffle过程是最消耗性能的,因为shuffle中间的过程必须基于磁盘来读写。而Spark的shuffle虽然也要基于磁盘,但是其大量transformation操作,比如单纯的map或者filter等操作,可以直接基于内存进行pipeline操作,速度性能自然大大提升。
但是Spark也有其劣势。由于Spark基于内存进行计算,虽然开发容易,但是真正面对大数据的时候(比如一次操作针对10亿以上级别),在没有进行调优的情况下,可能会出现各种各样的问题,比如OOM内存溢出等等。导致Spark程序可能都无法完全运行起来,就报错挂掉了,而MapReduce即使是运行缓慢,但是至少可以慢慢运行完。
2.Hadoop的共享数据慢: (原因:需要额外的复制,Hadoop默认的文件副本是3个,分布在两个不同的机架上(机架式抽象概念),而且还需要序列化(简单理解为是压缩) 反序列化(解压缩),磁盘IO开销)

这里补充一下Writable序列化(Hadoop序列化)与java序列化的区别

  • 1.java序列化的时候会保存类的相关和依赖关系等类的基本信息,但是hadoop序列化的时候不会保存类的信息只会保存字段值。
  • 2.java反序列化相当于每次重新创建一个对象,而Hadoop反序列化的时候是重用对象的,会降低创建对象的资源消耗。
  • 3.Hadoop序列化中定制序列化格式很容易,java比较困难。
  • 4.Hadoop序列化后的数据量小,java序列化后的数据量大。
  • 5.序列化/反序列化方式不同。

Spark的共享数据快:(原因:Spark是内存计算,还有DAG(有向无环图)优化)
3.MapReduce编程主要以Java实现。
Spark支持多种语言,java Scala Python都可以。因为Spark的源码是scala,博主在后面关于spark的更新中也主要以scala为主导。
通过后面的学习,我们也会看到Spark对比MR巨大的优势,无论是执行的速度,还是scala编程相对于Java的简单快捷。之前的博客里,对于scala的使用,我也写过一些学习笔记的总结归纳。不熟悉scala的读者可以点击快速入门学习scala学习笔记

注意Spark是一个实时计算框架(内存计算),他需要配置额外的文件存储系统(例如HDFS),所以Spark严格意义上来说只能替代Hadoop中的一部分,也就是Hadoop中自带的离线计算框架MapReduce,注意Spark本身是不提供大数据的存储的。
Spark与MapReduce最大的不同在于,迭代式计算模型:
MapReduce开发,我们主要分为两个阶段,map和reduce,大体上两个阶段完了就结束了。所以我们在一个job里能做的处理很有限,只能在map和reduce里处理。
Spark,计算模型,可以分为n个阶段,因为它是内存迭代式的。我们在处理完一个阶段以后,可以继续往下处理很多个阶段,而不只是两个阶段。所以,Spark相较于MapReduce来说,计算模型可以提供更强大的功能。

2.Spark的应用

Spark包含了大数据领域常见的各种计算框架:
1.Spark Core用于离线计算;
2.Spark SQL用于交互式查询
3.Spark Streaming用于实时流式计算
4.Spark MLlib用于机器学习
5.Spark GraphX用于图计算(图计算现在用的比较少)。
一般而言,Spark主要用于大数据的计算,而Hadoop以后主要用于大数据的存储(比如HDFS、Hive、HBase等),以及资源调度(Yarn)。

3.Spar的几种安装形式(作业提交模式)

Spark的安装形式主要分为三种:

1.local单机模式,这种是我们初学者用的最多的,可直接再windows上代码编写后运行调试。也是我现阶段用的最多的。后面的学习中,我们会经常见到setMaster(“local”)表示的就是单机运行
2,standalone集群模式:spark原生的集群搭建模式。我们再安装配置spark时需要在其== spark-env.sh==文件中配置,例如下图:

export JAVA_HOME=/usr/soft/jdk1.7.0_71
export SPARK_MASTER_IP=xjh
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_CORES=1
export SPARK_WORKER_INSTANCES=1
export SPARK_WORKER_MEMORY=1g

在spark集群(最好是至少三个节点,有Master Slaver)配置成功之后,启动spark集群:sbin/start-all.sh
我们可以通过访问Master节点的8080端口界面查看已成功运行的spark集群。
3.YARN集群模式
这种模式主要是配合数据平台已有的Hadoop集群,多个大数据框架进行有效结合,也是方便YARN进行资源调度。
关于YARN集群的配置安装只需要在standalone集群安装后的基础上,在spark-env.sh中添加Hadoop的安装路径 即可。
注意:我们在安装Hadoop之后 再安装Spark时 一定注意spark和Hadoo的版本进行匹配对应。后续大数据开发,安装Hive HBase 也同样如此

Spark作业提交模式:

1.local单机模式。(代码中会有setMaster(“local”))
2.stnadalone集群模式。也就是基于Spark自己的Master-Worker集群。(代码中会有setMaster(“spark:****:7077”))
3.基于YARN的yarn-cluster模式。
4.基于YARN的yarn-client模式。
关于第三种和第四种模式,将我们之前用于提交spark应用程序的spark-submit脚本,加上–master参数,设置为yarn-cluster,或yarn-client,即可。如果你没设置,那么,就是standalone模式。
基于YARN提交的两种模式深度剖析,这里我学习的时候看到这张图分享出来 进行学习
在这里插入图片描述
结合YARN中的RM NM进行学习。

4.入门案例-wordcount详解(local模式)

object WordCount {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("WordCountCluster").setMaster("local") //local表示单机运行
    val sc = new SparkContext(conf)
        val inputFile="hdfs://m1:9000/input/spark.txt"
    val lines = sc.textFile(inputFile)  //lines RDD
    val words=lines.flatMap(_.split(" "))
    val pairs=words.map((_,1))
    val wordCount=pairs.reduceByKey(_+_)
    wordCount.foreach(println)   
  }
}

scala实现的单词计数,对比之前MapReduce实现的MR实现单词计数看上去是不是代码十分简洁了?
这里是我们第一次编写spark(更为具体的说这里是spark core)代码,这里我对上述代码做一个详解:
1.val conf=new SparkConf*** 通过英文名我们也能看出来是进行相关配置
2.val sc=new SparkContext() 这是spark.core运行的基础。Spark中只要有一个SparkContext就是一个application。后面我们会详细介绍spark中的一些专业名词代表的意思和内部架构
3.val inputFile="****"表示输入文件路径 这里的文件可以是本地磁盘中的文件 也可以是HDFS上的文件
4.val lines = sc.textFile(inputFile) //这里是spark程序真正开始 spark加载输入文件 这里同时也是创建一个RDD(弹性分布式数据集,spark的基础 后面也会讲到)
5.val words=lines.flatMap(.split(" ")) //对文本中的元素进行空格分割
6.val pairs=words.map((
,1)) //将一个个单词元素用key value表示(也就是pairRDD)
7.val wordCount=pairs.reduceByKey(+) 将相同单词的次数累加
8.wordCount.foreach(println) 逐行输出
上述的这个例子wordcount十分基础,也比较重要。和MR一样,后面的博客会根据这个例子进行有关内容的优化和进一步描述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值