Spark入门
Posted _TIM_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark入门相关的知识,希望对你有一定的参考价值。
spark的特性:
响应速度快、易用性、通用性、兼容性(可以运行在各种模式下: stadnAlone,yarn,mesos和local模式)
spark的主要架构模块:
- sparkCore:核心模块,最底层的支持,支持上层的各种其他的模块稳定运行。可以用于做数据清洗,格式的转换等等,可以替代掉mr
- sparkSQL:处理结构化的数据的模块,用于结构化的数据分析,可以替代掉hive
- sparkStreaming:用于实时处理的模块,可以替代掉storm
- graphx:图计算 ,主要用于分析一些用户的关系图
- MLib:机器学习模块
- 任务资源调度平台:spark可以自身做任务调度,也可以将任务调度交给第三方平台去做,例如yarn或mesos
Hadoop就剩下唯一的作用:数据存储,还有一个功能就是yarn
spark的主要架构:
- master:主节点,主要用于集群的管理,任务资源的分配,以及接受客户端提交的任务
- worker:从节点,主要是负责执行任务
- executor:进程,启动一些进程来准备执行任务,是资源分配的工具
- task:线程,任务执行的最小粒度单位
- application:运行一个main方法,就是一个application
- job:一个application里面可能包含多个job
- client:客户端,主要用于提交任务。
- Driver:驱动程序,主要是负责DAG划分,stage划分,以及task的分解等等
standAlone模式
spark集群运行。由多台服务器组成spark的集群,需要启动master以及worker进程
slaves文件:主要是用于配置从节点在哪些服务器上面
spark on yarn两种模式
clinet模式:适用于测试环境,显示最终执行的结果。Driver运行在client客户端
cluster模式:适用于生产环境,不会显示最终执行的结果。Driver运行在applicationMaster里面
Spark的Shell
运行spark-shell进入local模式,实现单词计数统计
scala> sc.textFile("file:///export/servers/sparkdatas/wordcount.txt").flatMap(x => x.split(" ")).map(x => (x,1)).reduceByKey((x:Int,y:Int) => x + y).collect
sc.textFile("file:///export/servers/sparkdatas/wordcount.txt").flatMap(x => x.split(" ")).map(x => (x,1)).reduceByKey((x:Int,y:Int) => x + y).collect
使用下划线代替简写
sc.textFile("file:///export/servers/sparkdatas/wordcount.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_ + _).collect
RDD的基本概念
弹性:数据优先装在内存当中进行处理,如果内存不够用了,就将数据放到磁盘上面去处理
分布式:一个完整的文件,分布在不同的服务器上面
数据集:可以简单的理解为就是一个集合
特点:rdd不可变,可分区,里面的元素可以被并行的计算
为什么会产生RDD
第一代计算引擎:MR,使用代码来实现数据分析处理等等。缺点,需要使用大量代码,复杂性太高
第二代计算引擎:hive,使用hql来实现数据分析,摆脱了mr的繁琐的代码。缺点:执行效率慢
第三代计算引擎:以spark,impala,等等为首的内存计算框架。将数据尽量都放到内存当中进行计算
RDD的五大属性
- 分区列表
- 作用在每一个文件切片上面的函数
- RDDs 依赖于其他的一些RDD
- 可选项:对于key,value对的rdd,有分区函数
- 可选项:数据的位置优先性来进行计算。移动计算比移动数据便宜
如果文件在哪一台服务器上面,就在哪一台服务器上面启动task进行运算,尽量避免数据的拷贝
RDD的弹性:
- 自动进行内存以及磁盘文件切换
- 基于血统lineage的高效容错性。lineage记录了rdd之间的依赖关系
- task执行失败自动进行重试
- stage失败自动进行重试
- checkpoint实现数据的持久化保存
RDD的特点:
- 分区
- 只读:rdd当中的数据是只读的,不能更改
- 依赖:rdd之间的依赖关系
- 缓存:常用的rdd我们可以给缓存起来
- checkpoint:持久化,对于一些常用的rdd我们也可以试下持久化
RDD的创建三种方式
- 从文件当中创建
- 从一个集合当中创建
- 从其他的rdd转化而来
对RDD的操作各种算子介绍:
flatMap,map,reduceByKey,saveAsTextFile . collect 等等这些都是spark当中常用的算子,算子又分为两大类:
transfermation:转换的算子,对数据做进一步的转换
action:动作算子,触发整个任务去执行
transfermation的算子全部都是懒执行的,如果在代码当中调用了transfermation算子,不会马上去执行,只是记录了血统关系。等到真正的调用action的时候,才会触发整个任务去执行
transfermation算子介绍:
- map:将分区里面每一条数据取出来,进行处理
- mapPartitions :一次性将一个分区里面的数据全部取出来。效率更高
- partitionBy:重新分区,注意:有可能会产生shuffle过程
- rdd.partitionBy(new HashPartitioner(2)) ==> 重新分区,分区数我们自己手动指定的。分区可能变多也可能变少,而且partitionBy还会产生shuffle过程
- coalesce:缩减分区数到指定的值,分区的个数只能减少,不能变多。不会产生shuffle过程,适用于一些大的数据集filter过滤之后,进行缩减分区,提高效率
- repartition:数据重新随记分发,会产生shuffle过程
重新分区总结:
partitionBy:重新分区,按照我们指定的规则进行重新分区,分区数有可能变多,也有可能变少。会产生shuffle过程
coalesce:只能缩减分区,不会产生shuffle过程
repartition:重新分区。随机洗牌冲洗分区,没有任何规则,可以将分区数变大,或者变小,会产生shuffle的过程
reduceByKey:效率更高,会对数据提前进行部分的聚合,减少数据的key的shuffle
groupByKey:效率低下,尽量不要用
以上是关于Spark入门的主要内容,如果未能解决你的问题,请参考以下文章