美文网首页大数据
spark--基础简介

spark--基础简介

作者: 5a713e32ab76 | 来源:发表于2018-09-12 13:41 被阅读21次

    因为工作需要,再整理spark基础的相关知识,所以在这里进行部分自己想法的整理,大家一起讨论、交流

    首先是对于spark API的介绍,在saprk的官方网站的定义里面,对于spark的API的解释是可以支持Java、scala、python以及R语言四种在当今程序员世界中排名相当靠前的语言,那么,这四种语言有什么区别呢?因为spark是使用scala和java联合编写的,所以基于JVM编程的java和scala语言是最适合编写spark程序的,但是在这两者之前,编写更加突出的是Scala,同样的一个程序的编写,scala使用的代码行要远远小于Java的,而且因为scala的程序编写也相对来说比较简单,spark实现了大量的算子来进行程序的处理,所以在编写的时候scala更加的有优势,节省了编写的时间。而相对于Python和R语言,虽然spark提供了对应的接口对这两种语言进行实现,但是他们在运行效率上要比JVM的编程语言有一定的差距。

    在对于spark的编程语言有一定的了解之后,编写完之后就要提交到集群中进行处理,关于application的提交,主要分为client和cluster两种方式,通过spark-submit命令进行提交,对于提交的详细讲解我在之前的博客之中进行了相应的讲解,有兴趣的朋友可以去查看,现在我要说的是命令提交之后是如何在集群中运行的,在spark官方网站上对于spark的运行模式有四种解释,分别为本地模式、Standalone模式、Spark on Yarn模式、Spark on Mesos模式,

    [if !supportLists]1、[endif]本地模式,运行模式中最简单的一种,不依赖集群,可以单机运行,一般应用于开发测试场景,命令:

    ./spark-submit --class org.apache.spark.examples.SparkPi --master local  ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 10

    [if !supportLists]2、[endif]Standalone模式:需要构建一个spark集群,application运行在集群中

    命令:./spark-submit --master spark://192.168.79.111:7077

    [if !supportLists]3、[endif]Spark on Yarn模式

    Spark客户端直接连接Yarn。不需要额外构建Spark集群,但是需要在spark-env中配置hadoop的文件路径。仅支持粗粒度模式

    ./spark-submit --master  yarn

    ./spark-submit --master yarn-client

    ./spark-submit --master yarn --deploy-mode client

    [if !supportLists]4、[endif]Spark on Mesos模式

    Spark客户端直接连接Mesos。不需要额外构建Spark集群,相比在Yarn上运行更加灵活,分为粗粒度模式和细粒度模式两种,因为在spark研发的时候就考虑到要与mesos进行相应的链接,所以相对于yarn来说,mesos的运行效率更加的优化,毕竟自己家的,总归是更亲近一些

    命令:

    ./spark-shell --master mesos://host:port

    ./spark-shell --master mesos://host:port --deploy-mode client

    ./spark-shell --master mesos://host:port --deploy-mode cluster

    根据实际的生产环境,我我们可以按照实际的需求选择最适合的运行模式,而且在spark-submit的时候可以进行提交资源申请等,保证集群运行的最大的性能和效率

    相信大家都知道,大数据的计算遵循计算找数据的原则,可是分布式存储以及备份机制等原因造成了数据位置的不统一,那么对于这样的数据存放位置的问题是怎么处理的呢?这就是数据本地化的概念,在spark中数据本地化一共有5个等级

    PROCESS_LOCAL:进程本地化

    我们都知道,数据进入集群之后,会在executor中进行执行,最佳的数据存放位置就是在executor中,就像饭就在嘴边一样,可以张口就直接吃,不浪费力气,同样的,代码和数据在同一个进程中,也就是在同一个executor中,计算数据的task由executor执行,数据在executor的BlockManager中;当计算开始的时候可以直接用数据,不需要到处找,性能最好。

    NODE_LOCAL:节点本地化,除了那种恨得懒到极点的人,稍微勤快一点的人觉得饭在床边上也是可以的,伸伸手就能够得到,所以代码和数据在同一个节点中称为第二种级别;比如说,数据作为一个HDFS block块,就在节点上,而task在节点上某个executor中运行;数据和计算在同一个节点中,稍微的伸伸手就可以得到

    RACK_LOCAL:机架本地化,这是最保守的也是相对安全的做法,数据和task在一个机架的两个节点上;数据需要通过网络在节点之间进行传输,因为不在同一个节点上,所以,当计算节点挂掉之后不会造成数据的丢失。

    NO_PREF:对于task来说,数据从哪里获取都一样,没有好坏之分,比如从数据库中获取数据

    ANY: 数据可能在任何地方,比如其他网络环境内,或者其他机架上。

    同样的,不同的计算环境需要不同的运行模式,在进行命令提交的时候可以对集群的运行模式进行相应的设定

    spark.locality.wait: 在放弃并在较低本地节点上启动数据本地任务之前需要等待多长时间才能启动数据本地任务。 

    spark.locality.wait.node: 自定义局部节点等待节点局部性。 

    spark.locality.wait.process 定制本地等待进程本地化。这会影响尝试访问特定执行程序进程中的缓存数据的任务。spark.locality.wait.rack 

    以上为我暂时想到的关于spark基础运行的相关知识,欢迎大家建议、交流

    交流QQ群:859121793

    微信公众号:刚哥人工智能1000集

    相关文章

      网友评论

        本文标题:spark--基础简介

        本文链接:https://www.haomeiwen.com/subject/hqevgftx.html