闭包其实是一个函数,函数的返回值依赖于声明在函数外部变量。
在同一个scala源文件中,class与object有同样的名字。
object称为伴生对象,class称为伴生类。它们之间可以相互访问private属性。
在伴生对象中定义apply方法,直接用对象名object就可以调用apply方法,也可以实现构造伴生类的功能。
var可以多次赋值
将原来接受两个参数的函数变成接受一个参数的函数过程。
新函数返回一个原来以第二个参数作为参数的函数。
在object定义隐式转换方法前加implicit def,在用到隐式转化地方用import引入类.方法,自动调用转化后的方法。
match { case1 case2 }
1)申明变量不同。
2)返回值,scala不用return。
3)通配符,scala_ ,java*。
4)接口,scala为trait继承使用extends,多继承使用with。java为interface继承使用implements多继承用逗号。
1)单节点运行。
2)集群模式。
3)运行在yarn上面。
1)都可以进行聚合操作,reducebykey更快适合大数据集。
宽依赖:一个父RDD分区对应多个子RDD分区。
窄依赖:一个父RDD分区对一个子RDD分区,多个父RDD分区对一个子RDD分区。
1)spark处理任务输出结果放入内存中。hadoop处理任务结果放入磁盘中,需要大量IO操作。
2)hadoop中MR在groupby前对分区key排序。
1)计算数据时数据的分散度不够,导致大量的数据集中到集群一台或几台机器上,而集群其它节点空闲会导致整个计算过程慢。
数据倾斜只会发生在shuffle过程中。
2)解决办法?
2.1)提高shuffle操作的并行度。增加shuffle read task的数量,可以让原本分配给一个task的多个key分配给多个task,从而让每个task处理比原来更少的数据。
2.2)使用随机key进行双重聚合。将原本相同的key通过附加随机前缀的方式,变成多个不同的key,就可以让原本被一个task处理的数据分散到多个task上去做局部聚合,进而解 决单个task处理数据量过多的问题。接着去除掉随机前缀,再次进行全局聚合,就可以得到最终的结果
2.3)过滤少数导致倾斜的key。判断少数几个数据量特别多的key对计算结果不是特别重要,那么可以直接过滤掉那少数的几个key。
当rdd依赖中出现宽依赖的时候就会触发shuffle操作,Shuffle 过程本质上都是将 Map 端获得的数据使用分区器进行划分,并将数据发送给对应的 Reducer 的过程。
Shuffle描述着数据从map task输出到reduce task输入的这段过程。shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环节,shuffle的性能高低直接影响了整个程序的性能和吞吐量。因为在分布式情况下,reduce task需要跨节点去拉取其它节点上的map task结果。这一过程将会产生网络资源消耗和内存,磁盘IO的消耗。通常shuffle分为两部分:Map阶段的数据准备和Reduce阶段的数据拷贝处理。一般将在map端的Shuffle称之为Shuffle Write,在Reduce端的Shuffle称之为Shuffle Read.
https://www.cnblogs.com/itboys/p/9226479.html
(1)构建Spark Application的运行环境(启动SparkContext),SparkContext向资源管理器(可以是Standalone、Mesos或YARN)注册并申请运行Executor资源;
(2)资源管理器分配Executor资源并启动StandaloneExecutorBackend,Executor运行情况将随着心跳发送到资源管理器上;
(3)SparkContext构建成DAG图,将DAG图分解成Stage,并把Taskset发送给Task Scheduler。Executor向SparkContext申请Task
(4)Task Scheduler将Task发放给Executor运行同时SparkContext将应用程序代码发放给Executor。
(5)Task在Executor上运行,运行完毕释放所有资源。
原文:https://www.cnblogs.com/chong-zuo3322/p/12781603.html