pycharm配置spark
下载spark压缩包,解压到本地磁盘。
打开pycharm,配置Content Root和环境变量。
shuffle
hadoop:
- hdfs/hbase分布式存储
- yarn资源调度框架
- mapReduce用来计算
python里map和reduce函数的用法
- map:从一个集合到另一个集合
- reduce:从集合里计算出一个数
>>> mylist = [1,2,3,4]
>>> list(map(lambda x:x + 1,mylist))
[2, 3, 4, 5]
>>> from functools import reduce
>>> reduce(lambda a,b : a+b,mylist)
10
map task:从一个集合到另外一个集合,进来多少个元素,计算后生成多少个结果
reduce task:对一堆结果进行合并,对合并的结果再进行落地
mapredude是一个分分合合的过程:一副牌跟它分开打开,然后每张牌进行计算,看它应该放到那一摞里面去,最后再把相同的这一摞进行合并。然后再给他存起来,再分发到其他的地方去。
mapreduce慢,是因为要把数据落地。
saprk是基于内存的计算框架,迭代和迭代之间将中间结果存在内存中,一次迭代最终都会落地磁盘。
一个input split对应一个block块128M,128M是逻辑大小,数据只有10kb,10kb存到hfds,10kb也会创建一个block单元。
为什么要分区?
hello 对 3取模 等于1,未来hello还会跑到相同的reduce里来,方便统计。
第二个maptask里面有hello,也会被抓到第一个reduce里去。比如1G的数据,保证所有的都会抓到第一个reduce里。加快reduce计算的速度。
map阶段会有磁盘落地,reduce会去读磁盘。
RDD
RDD:弹性分布式数据集,在内存里,把一个block块抽象为rdd里的一个partion。RDD里面的元素可以是键值对,也可以不是。
- 每个RDD由多个partition组成
- 每个parition对应一个计算逻辑
- RDD会有依赖(宽依赖 窄依赖)
- RDD由key、value组成可以用partition重分区
- 最优的位置去计算,也就是数据的本地性
容错
RDD数据集通过所谓的血统关系(Lineage)记住了它是如何从其他RDD中演变过来的。相比其他系统的细颗粒度的内存数据更新级别的备份和LOG机制,RDD的Lineage记录是粗颗粒度的特定数据转换(Transformation)操作(filter,map,join etc)行为。当这个RDD的部分分区数据丢失时,它可以通过Lineage获取足够多的信息来重新运算和恢复丢失的数据分区。
缓存 、宽依赖、窄依赖
制定缓存策略可以存内存和磁盘。
算子操作有shuffle,则是宽依赖,否则就是窄依赖。
根据宽、窄依赖优化DAG。
DAG优化
一个Application有根据Actions划分多个jobs,一个jobs中碰到宽依赖可以切分为多个stages,一个stage有多个pipeline,每个stage会提交一个taskSet。
启动流程
- Shell中spark-submit脚本提交程序,创建Driver进程。
- 运行程序,SparkContext在初始化的时候,够着一个DAGScheduler和一个TaskSchedule.
- TaskSchedule实际上是负责通过它对应的一个后台进程,去连接Master向Master注册这个Application。
- Master接收到Application注册过来的请求之后,会用资源调度的算法,在Spark集群Worker上为这个App启动多个Executor。
- Executor启动之后会反向注册到TaskSchedule上面来。
- 所有Exector都反向注册到Driver上之后,Driver结束SparkContext初始化,会继续执行我们自己编写的代码。
- DAGSchedule根据代码切分Job,生成TaskSet。
- TaskSchedule会把TaskSet里面每一个Task提交到右边的Executor上去执行。
- 总结,最后整个这个Spark应用程序的执行就是Stage分批次的作为TaskSet提交到Executor里面执行,每个Task针对RDD的一个partition,执行我们的算子和函数,RDD可以有5亿或者10亿的数据,Task并行执行。