History Server
Spark的UI界面端口默认4040,只能在Application运行的时候维持。
修改参数使得spark保存运行日志和UI界面,端口改为18080
位置
改完之后的UI界面
序列化
序列化的作用:Shuffle的时候需要进行网络传输时,需要将数据序列化进行传输;节省内存的使用
序列化的类型:
- Java serialization:默认,能够运行实现了 java.io.Serializable 的任何类,灵活但是速度慢。
- Kryo serialization:比 Java 要快10倍左右,但是不支持所有的Serializable ,需要在代码中事先注册类;如果不注册,也能够工作,但是需要在每个项目中存储完整的类名,造成浪费。
内存管理
内存管理的三个方面:
1. 项目使用的内存
2. 访问这些项目所用的内存
3. 回收垃圾所用的内存
(重点!)内存的管理分为两大类:
- 执行
- 存储
两者共用一块内存,如果执行没有用内存,那么存储可以使用全部的内存,反之一样。但是执行能够在必要的时候踢出存储,但是可以设置阈值留给存储一定的阈值内存
在总的Worker node 的内存-300M的基础上,乘以0.6分配给spark进行执行和存储。
然后执行和存储在这个基础上,各占50%。
判断RDD占用了多少内存,创建之后cache一下,在UI界面查看占用了多少内存
RDD太大时可以考虑序列化,缺点就是稍微费时
广播变量
广播变量能够使得开发人员可以在每个机器上缓存一个只读的变量而不是不断地用task对他的副本进行移动。
能够大幅度的降低每一个序列化任务的大小,同时减小在集群上部署任务的开销。一般一个task大于20KB,就值得去优化了
数据本地性
最好的情况是数据和计算都在一个节点,如果不在,一个必须向另一个移动。最好是移动计算,因为序列化的代码比数据要小很多。
数据本地性就是数据和处理它的代码有多近。