Spark学习总结

一、spark自定义类在Driver端和Executor的传输问题

  1. 在一个map算子中 new class。每来一条数据将新建一个对象,每一个对象都要进行序列化,将大量消耗内存和网络带宽
  2. 在Driver端new class发送到Executor。对象将会被发送到每个task上,如果每个Executor有多个task,将占用过多内存和网络带宽(补充:可以在map端实例化对象,只实例化一次。就会减少内存的占用
  3. 自定义一个object对象,在Driver实例化后发送到Executor。object对象相当于java中的单例对象,只初始化一次。这样每个executor上的task共享同一个对象,将消耗网络带宽。
  4. 自定义一个object对象,在Executor端实例化对象。这样每个Executor共享同一个对象,不需要消耗网络带宽。

二、spark广播变量

broadcast用来保存一个不变的数据集,并将该数据集发送给每个executor。广播变量从Driver端将需要广播的对象序列化,在Executor上反序列化。因此在Executor上对广播变量修改,只是修改Executor本地的副本,其他Executor的副本不会受影响。

注意:(1)broadcast广播的变量在每个节点上只加载一次,不可被修改;

           (2)broadcast可以保存2G左右的数据,约21.5亿条;

           (3)累加器则是Driver只读,Executor只写的对象。

三、spark序列化问题

  1. TCP连接不可以序列化,可以通过Driver加载数据发送给Executor,也可以通过Executor端自己加载;可以通过static关键字进行修饰
  2. spark有两种序列化机制:                                                                                                                                                                 (1)java的序列化机制,JavaSerializer;                                                                                                                                 (2)Kryo序列化,速度快、占用资源少、需要进行注册。
  3. 不需要序列化的: 直接在函数中调用类的实例对象或者 object不需要序列化,该对象是在executor端实例化的                             

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值