spark读取hdfs数据本地性异常
2015-09-24 15:05
369 查看
在分布式计算中,为了提高计算速度,数据本地性是其中重要的一环。
不过有时候它同样也会带来一些问题。
一.问题描述
在分布式计算中,大多数情况下要做到移动计算而非移动数据,所以数据本地性尤其重要,因此我们往往也是将hdfs和spark部署在相同的节点上,有些人可能会发现即使他已经这么做了,在spark的任务中的locality还是ANY,这说明所有的数据都是走的网络IO。在没有没有shuffle的情况下,仅在数据读取阶段网络IO占用都很严重,可以看下ganglia的监控,最高峰出现在读取数据阶段
后来发现slave的标识都是ip
二.解决方案
而hdfs以hostname作为slave标示,所以改变启动slave的方式start-slave.sh -h <hostname> <master>
启动后
再运行任务就变成了NODE_LOCAL,效率有了极大的提升
三.数据本地性的副作用
大多数情况下,数据本地性可以减少网络的IO,提高程序整体的运行效率。不过在一些比较特殊的情况下(Spark的延时调度),他反而会拖累整体运行速度。taskSetManager在分发任务之前会先计算数据本地性,优先级依次是:
process(同一个executor) -> node_local(同一个节点) -> rack_local(同一个机架) -> any(任何节点)
Spark会优先执行高优先级的任务,如果一个task运行的时间很短(小于设置的spark.locality.wait时间),则数据本地性下一级别的任务则一直不会启动,这就是Spark的延时调度机制。
举个极端例子:运行一个count任务,如果数据全都堆积在某一台节点上,那将只会有这台机器在长期执行任务,集群中的其他机器则会处于等待状态(等待本地性降级)而不执行任务,造成了大量的资源浪费。
判断的公式为:
curTime – lastLaunchTime >= localityWaits(currentLocalityIndex)
其中
curTime为系统当前时间,
lastLaunchTime为在某优先级下最后一次启动task的时间
如果满足这个条件则会进入下一个优先级的时间判断,直到
any,不满足则分配当前优先级的任务。
数据本地性任务分配的源码在
taskSetManager.scala。
如果存在大量executor处于等待状态,可以降低以下参数的值(也可以设置为0),默认都是3s。
spark.locality.wait spark.locality.wait.process spark.locality.wait.node spark.locality.wait.rack
当你数据本地性很差,可适当提高上述值,当然也可以直接在集群中对数据进行balance。
相关文章推荐
- spark读取hdfs数据本地性问题
- flume1.4.0 保存文件到hdfs错误调试
- flume1.4.0 保存文件到hdfs错误调试
- 实现一个工具类,可以把HBase任意表的任意多的列导出到任意指定的HDFS中
- HDFS的基本概念(一)
- hdfs 上面block有异常处理流程
- Cloudera的CDH和Apache的Hadoop的区别
- HDFS文件写入
- tachyon与hdfs,以及spark整合
- HDFs数据读取过程
- hdfs文件读写bug2
- 关于 HDFS 的 file size 和 block size
- hdfs rack机架感知配置
- HDFS的快照原理和Hbase基于快照的表修复
- Hadoop 2.2.0编译安装
- HDFS读写文件BUG
- ubuntu从头开始搭建hadoop伪分布式环境
- hadoop Secondary NameNode作用
- HDFS 官方文档 中文
- hadoop完全分布式搭建