Spark性能优化第五季-数据本地性调优

一:性能优化之数据本地性
1、数据本地性对分布式系统的性能而言是一件最为重要的情况之一,程序运行本身饮食代码和数据两部分,单机版本一般情况下很少考虑数据本地性的问题(因为数据在本地),但是对于单机版本的程序,由于数据本性有PROCESS_LOCAL和NODE_LOCAL之分, 所以,尽量让数据处于PROCESS_LOCAL级别。Spark作为分布式系统,更加注重数据本地性,在Spark中数据本地性分为PROCESS_LOCAL、NODE_LOCAL、NO_PREF、RACK_LOCAL、ANY(数据可能在任何地方,包括在其它网络环境中,例如百度云,数据和计算集群不在同一集群中,此时就是ANY的一种表现)等;
2、对于ANY的情况,默认状态下性能会非常低,此时强烈建议使用Tachyon。例如在百度云上,为了确保计算速度,就在计算集群和存储集群之间加入Tachyon,通过Tachyon来从远程抓取数据,而Spark基于Tachyon来进行计算,这就更好的满足了数据本地性。
3、如果数据是PROCESS_LOCAL,但是此时并没有空闲的Core来运行Task,此时Task就要等待,例如等待3000ms,如果在该时间内获取core则直接运行,如果超过3000ms,此时数据本地性就退而采用NODE_LOCAL级别的数据。同样,NODE_LOCAL数据也会有等待超时时间,以此类推。。。
4、如何配置Locality
统一采用spark.locality.wait参数来设置(例如设置为5000ms),也可以分别设置spark.locality.wait.process、spark.locality.wait.node、spark.locality.wait.rack等。一般的具体设置是Locality优先级越高,则设置越长的等待超时时间。


二:RDD的自定义(以Spark on HBase为例)
第一步,定义RDD.getPartitions的实现
1)createRelation具体确定HBase的链接方式和具体访问的表;
2)通过HBase的API来获取Region的List;
3)过滤出有效的数据;
4)返回Region的Array[Partition],也就是说一个Partition处理一个Region的数据,为更佳的数据本地性打下基础。
第二步,RDD.getPreferredLocations
1)根据split饮食的Region信息来确定Region具体在什么节点上,这样Task在调度时就可以优先被 调度到Region所在的机器上,最大化的提高数据本地性;
第三步,RDD.compute(split: Partition, context: TaskContext)
1)根据split中的Region等信息调用HBase的API来进行操作(主要是查询)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值