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

一.问题描述

在分布式计算中,大多数情况下要做到移动计算而非移动数据,所以数据本地性尤其重要,因此我们往往也是将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。

转载于:https://www.cnblogs.com/xiaomaohai/p/6158037.html

spark读取hdfs数据本地性异常相关推荐

  1. Spark中的数据本地性

    分布式数据并行环境下,保持数据的本地性是非常重要的内容,事关分布式系统性能高下. 概念: block : HDFS的物理空间概念,固定大小,最小是64M,可以是128,256 ..也就是说单个文件大于 ...

  2. Spark数据本地性

    分布式计算系统的精粹在于移动计算而非移动数据,但是在实际的计算过程中,总存在着移动数据的情况,除非是在集群的所有节点上都保存数据的副本.移动数据,将数据从一个节点移动到另一个节点进行计算,不但消耗了网 ...

  3. spark数据本地性级别划分

    1.数据本地性级别划分 PROCESS_LOCAL: 要处理的数据在同一个本地进程, 即数据和Task在同一个Excutor JVM中. 这种情况是RDD的数据经过缓存,此时不需要网络传输,是最优lo ...

  4. Spark读取Hive数据的两种方式与保存数据到HDFS

    Spark读取Hive数据的两种方式与保存数据到HDFS Spark读取Hive数据的方式主要有两种 1. 通过访问hive metastore的方式,这种方式通过访问hive的metastore元数 ...

  5. java spark读写hdfs_Spark读取HDFS数据输出到不同的文件

    最近有一个需求是这样的:原来的数据是存储在MySQL,然后通过Sqoop将MySQL的数据抽取到了HDFS集群上,抽取到HDFS上的数据都是纯数据,字段值之间以\t分隔,现在需要将这部分数据还原为js ...

  6. Spark读取HDFS上的Snappy压缩文件所导致的内存溢出问题 java.lang.OutOfMemoryError: GC overhead limit exceeded

    报错java.lang.OutOfMemoryError: GC overhead limit exceeded HDFS上有一些每天增长的文件,使用Snappy压缩,突然某天OOM了 1.原因: 因 ...

  7. java读avro的流_0016-Avro序列化反序列化和Spark读取Avro数据

    1.简介 本篇文章主要讲如何使用java生成Avro格式数据以及如何通过spark将Avro数据文件转换成DataSet和DataFrame进行操作. 1.1Apache Arvo是什么? Apach ...

  8. 0016-Avro序列化反序列化和Spark读取Avro数据

    温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看. 1.简介 本篇文章主要讲如何使用java生成Avro格式数据以及如何通过spark将Avro数据文件转换成DataSet和DataFra ...

  9. spark读取hdfs路径下的数据_到底什么是数据湖

    随着移动互联网,物联网技术的发展,数据的应用逐渐从 BI 报表可视化往机器学习.预测分析等方向发展,即 BI 到 AI 的转变. 数据的使用者也从传统的业务分析人员转为数据科学家,算法工程师. 此外对 ...

  10. spark读取hdfs路径下的数据_Spark读取HDFS数据分区参考

    本文以读取 parquet 文件 / parquet hive table 为例: hive metastore 和 parquet 转化的方式通过 spark.sql.hive.convertMet ...

最新文章

  1. 使用 Nginx 和 Memcached 对 WordPress 的整页做缓存
  2. JavaScript的基础
  3. HTTP协议的头信息详解
  4. 绿色数据中心建设刻不容缓
  5. python动态映射_Python Django框架url反向解析实现动态生成对应的url链接示例
  6. 小汤学编程之JavaScript学习day01——认识JS、JS基础语法
  7. Discuz X1.5 X2.5 X3 UC_KEY Getshell Write PHPCODE into config/config_ucenter.php Via /api/uc.php Vul
  8. python基本代码教程-python基础教程
  9. QT之交叉编译qmake的ARM版本套件(三)
  10. Gym - 102163M
  11. python写文件flush_python读写文件write和flush
  12. qmessagebox 设置显示屏幕中间_windows7屏幕分辨率设置
  13. Cesium加载GeoJson数据
  14. bp神经网络预测模型python,bp神经网络预测模型
  15. Intel VT学习笔记(一)—— 基础知识支持检测
  16. mini QQ(项目一)
  17. 网络常见状态码大全。收藏这一篇就够了(HTTP Status Code)
  18. 汉画轩区块链技术应用智慧酒店提升舒适度节能成本
  19. python中strip() 函数和 split() 函数的理解
  20. 【转】unity 的 MonoDevelop 在Windows下显示中文不出现乱码

热门文章

  1. regsvr32.exe是什么东西
  2. 最短路径Dijkstra算法实现和Floyd算法实现
  3. js原生设计模式——8单例模式之简约版属性样式方法库
  4. 15.MongoDB的一致性(读关注与写关注)
  5. mysql+cls()_MySQL性能优化之show processlist(一)
  6. Unity的序列化机制探索
  7. Mac外接2k显示器遇到的问题
  8. Redis内存相关知识
  9. 能做多大的单片机项目程序开发,就代表了你的敲代码的水平
  10. 面试题--------9、mysql的drop delete truncate 分别在什么场景下使用