spark读取hdfs数据本地性问题

在分布式计算中,为了提高计算速度,数据本地性是其中重要的一环。
不过有时候它同样也会带来一些问题。

一.问题描述

在分布式计算中,大多数情况下要做到移动计算而非移动数据,所以数据本地性尤其重要,因此我们往往也是将hdfs和spark部署在相同的节点上,有些人可能会发现即使他已经这么做了,在spark的任务中的locality还是ANY,这说明所有的数据都是走的网络IO。

spark读取hdfs数据本地性问题_第1张图片

在没有没有shuffle的情况下,仅在数据读取阶段网络IO占用都很严重,可以看下ganglia的监控,最高峰出现在读取数据阶段
spark读取hdfs数据本地性问题_第2张图片

后来发现slave的标识都是ip

spark读取hdfs数据本地性问题_第3张图片

二.解决方案

而hdfs以hostname作为slave标示,所以改变启动slave的方式

start-slave.sh -h <hostname> <master>

启动后

spark读取hdfs数据本地性问题_第4张图片

再运行任务就变成了NODE_LOCAL,效率有了极大的提升

spark读取hdfs数据本地性问题_第5张图片

三.数据本地性的副作用

没错,大多数情况下,数据本地性可以减少网络的IO,提高程序整体的运行效率。不过在一些比较特殊的情况下,他反而会拖累整体运行速度。

假设在极端情况下,你需要的数据都存放在集群中的某一台节点上,即使你给任务提供了100个core,在任务的第一个阶段,会发现只有那台有数据的节点在运行,其他的节点并没有运行任务。

这是因为spark会根据数据存放的情况,把任务分成几个阶段,第一个阶段运行的本地的任务,然后才是同一机架内的节点,依此类推。
这种情况下,程序的整体运行速度则会受到那台节点的运行速度影响,再增加资源也无济于事。

这个时候我们需要做的是将数据在集群中进行balance,还可以通过spark.locality.xxx参数修改spark的任务执行策略。这会造成大量的网络IO,不过在一些特殊的场景中,你可以在网络IO和计算能力耗时之间做一个权衡。

你可能感兴趣的:(spark,locality)