hadoop.fs.FileSystem.get导致OOM的原因和解决方案

news2024/11/24 2:46:37

问题描述

在调用HDFS获取文件系统的get接口时,指定用户可能会导致OOM问题,示例代码如下:

FileSystem fileSystem = FileSystem.get(uri, conf, "hadoopuser");

问题溯源

该方法源码:
在这里插入图片描述
在有缓存的情况下将从Cache中取,一路取下去最后会从map中根据key取内容
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
但如果指定了user,此处根据key只能取到空值,
原因:
如下图所示,Cache的map的Key中包括了UserGroupInformation ugi,上述拿值时候会以此类型作为Key在这里插入图片描述回到指定用户名时最初调用的get方法,源码如下:

  public static FileSystem get(final URI uri, final Configuration conf,
        final String user) throws IOException, InterruptedException {
    String ticketCachePath =
      conf.get(CommonConfigurationKeys.KERBEROS_TICKET_CACHE_PATH);
    //进入getBestUGI查看一下源码
    UserGroupInformation ugi =
        UserGroupInformation.getBestUGI(ticketCachePath, user);
    return ugi.doAs(new PrivilegedExceptionAction<FileSystem>() {
      @Override
      public FileSystem run() throws IOException {
        return get(uri, conf);
      }
    });
  }

getBestUGI查看源码:

  public static UserGroupInformation getBestUGI(
      String ticketCachePath, String user) throws IOException {
    if (ticketCachePath != null) {
      return getUGIFromTicketCache(ticketCachePath, user);
    } else if (user == null) {
      return getCurrentUser();
    } else {
    //注意这一句,查看一下源码
      return createRemoteUser(user);
    }    
  }

createRemoteUser源码

@InterfaceAudience.Public
  @InterfaceStability.Evolving
  public static UserGroupInformation createRemoteUser(String user, AuthMethod authMethod) {
    if (user == null || user.isEmpty()) {
      throw new IllegalArgumentException("Null user");
    }
    //此处subject一直是新的
    Subject subject = new Subject();
    subject.getPrincipals().add(new User(user));
    UserGroupInformation result = new UserGroupInformation(subject);
    result.setAuthenticationMethod(authMethod);
    return result;
  }

可以看出,在指定了用户名的情况下一直会新建subject,那么如何判断两个key是否相等呢?查看一下Cache重写的hashCode方法:

 public int hashCode() {
        return (scheme + authority).hashCode() + ugi.hashCode() + (int)unique;
      }

可以看出在判断两个Key值是否一致时,会判断ugi的hashCode是否一致,其中ugi.hashCode代码如下,又能够看出判断ugi的hashCode是否一致会去判断subject的hashCode是否一致,而上面说过的,调用createRemoteUser每次都会新建一个subject,这也就导致了这两个Key值永远是不同的,用这个Key值取也一定是取不到值的:

public int hashCode() {
    return System.identityHashCode(subject);
  }

在取不到值的情况下,getInternal中的下列语句就会一直被执行到

 map.put(key, fs);

最终导致OOM

解决方法

自己定义一个map缓存,调用FileSystem.newInstance,不使用FileSystem的cache

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193458.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 11 SystemUI(状态/导航栏)-状态栏下拉时图标的隐藏与通知面板的半透黑色背景

概述 本文续自:Android 11 的状态栏的隐藏 PS 本文虽然同属于SystemUI, 但目前并 没有 打算整理成专橍或撰写一个系列的想法. 仅仅为了记录一些过程, 留下那些容易被遗忘的点滴. 开始下拉时状态栏图标被隐藏 状态橍的图标在用户开始触摸(ACTION_DOWN)后, 会开始展开, 显示扩展…

答题小程序题目批量导入模板以及题库文本格式规范

近期又接到了一个知识竞赛的需求&#xff0c;在开发答题小程序的过程中&#xff0c;遇到了不少难题&#xff0c;但是都一一克服了。凭借多年的答题小程序开发经验&#xff0c;我总结了一下题目批量导入题库文本格式规范。一、答题小程序题目批量导入模板小程序【答题小博士】二…

《数字经济全景白皮书》后疫情时代数字化驱动增长洞察之赛道篇

易观分析&#xff1a;《数字经济全景白皮书》浓缩了易观分析对于数字经济各行业经验和数据的积累&#xff0c;并结合数字时代企业的实际业务和未来面临的挑战&#xff0c;以及数字技术的创新突破等因素&#xff0c;最终从数字经济发展大势以及各领域案例入手&#xff0c;帮助企…

面试之 Python 框架 Flask、Django、DRF

Django、flask、tornado 框架的比较 ★★★★★ Django&#xff1a;大而全的框架。它的内部组件比较多&#xff0c;如 ORM、Admin、中间件、Form、ModelForm、Session、缓存、信号、CSRF等&#xff0c;功能也都很完善。 flask&#xff1a;微型框架&#xff0c;内部组件就比较少…

JavaScript中的事件对象、事件对象的属性

一、什么是事件对象​ 1&#xff09;、 事件对象 就是保存着事件相关信息的对象。当事件发生时&#xff0c;会自动产生事件对象&#xff08;不需要new&#xff09;&#xff0c;事件对象中包含着&#xff1a;事件源&#xff08;发生事件的dom元素&#xff09;&#xff0c;点击是…

全网最详细的mybatis plus 条件构造器queryWrapper学习,比如and(),eq(),or(),like()等方法以及分页操作

文章目录1. 引言2. 结构关系3. 环境配置3.1 引入jar包3.2 创建数据源3.2 创建User实体类3.4 创建UserMapper类3.5 创建UserService类4. 操作演示5. 注意事项1. 引言 mybatis大家都有使用过&#xff0c;既面向对象又灵活可配。不友好的地方是&#xff0c;会随着使用出现大量xml…

一篇文章带你读懂AVL树

目录 AVL树节点的定义 AVL树的插入 AVL树的旋转 1. 新节点插入较高左子树的左侧---左左&#xff1a;右单旋 2.新节点插入较高右子树的右侧---右右&#xff1a;左单旋 3. 新节点插入较高左子树的右侧---左右&#xff1a;先左单旋再右单旋 4. 新节点插入较高右子树的左侧-…

人工智能自然语言处理—PageRank算法和TextRank算法详解

人工智能自然语言处理—PageRank算法和TextRank算法详解 一、PageRank算法 PageRank算法最初被用作互联网页面重要性的计算方法。它由佩奇和布林于1996年提出&#xff0c;并被用于谷歌搜索引擎的页面排名。事实上&#xff0c;PageRank可以在任何有向图上定义&#xff0c;然后…

公司企业如何设计微信小程序?

​很多公司企业在制作小程序的时候都会考虑一个事情&#xff0c;就是如何设计微信小程序。有些公司企业希望把小程序设计得非常炫酷、抓人眼球。那么问题是&#xff1a;公司企业微信小程序的设计是否做得越酷炫、越抓人眼球就越好呢&#xff1f; 答案&#xff1a;非也&#xf…

基于SIFT的图像Matlab拼接教程

前言图像拼接技术&#xff0c;将普通图像或视频图像进行无缝拼接&#xff0c;得到超宽视角甚至360度的全景图&#xff0c;这样就可以用普通数码相机实现场面宏大的景物拍摄。利用计算机进行匹配&#xff0c;将多幅具有重叠关系的图像拼合成为一幅具有更大视野范围的图像&#x…

(一)Spring源码解析:容器的基本实现

一、Spring的整体架构 Spring的整体架构图如下所示&#xff1a; 二、容器的基本实现 2.1> 核心类介绍 2.1.1> DefaultListableBeanFactory DefaultListableBeanFactory是整个bean加载的核心部分&#xff0c;是Spring注册及加载bean的默认实现。 XmlBeanFactory集成自…

【FLASH存储器系列十四】固态硬盘结构和FTL初探

固态硬盘是一种典型的nand flash产品应用。与传统硬盘相化&#xff0c;固态硬盘内部没有移动的机械磁头&#xff0c;而是由固态电子存储芯片&#xff08;闪存芯片&#xff09;阵列级联组成&#xff0c;下图给出了固态硬盘的内部组成。现阶段&#xff0c;几乎所有基于闪存的固态…

ASP.NET Core+Element+SQL Server开发校园图书管理系统(三)

随着技术的进步&#xff0c;跨平台开发已经成为了标配&#xff0c;在此大背景下&#xff0c;ASP.NET Core也应运而生。本文主要基于ASP.NET CoreElementSql Server开发一个校园图书管理系统为例&#xff0c;简述基于MVC三层架构开发的常见知识点&#xff0c;前两篇文章简单介绍…

Nvidia深度学习环境安装

深度学习大型模型训练和部署&#xff0c;需要使用GPU&#xff0c;使用Pytorch、Tensorflow等深度学习框架之前需要安装驱动环境,本文系统环境&#xff1a;ubuntu22.04系统&#xff0c;四张3090显卡安装显卡驱动下载&#xff1a;选择显卡类型&#xff0c;下载驱动驱动下载路径&a…

Wireshark解析协议不匹配

Wireshark解析协议不匹配 1、问题 现有TLS/SSL over TCP的客户端、服务端相互通信&#xff0c;其中&#xff0c;服务端监听TCP端口6000。 使用tcpdump抓包6000端口&#xff0c;生成pcap文件6000.pcap&#xff1a; 使用Wireshark打开6000.pcap&#xff0c;显示如下&#xff1…

Hive(番外):Hive可视化工具IntelliJ IDEA

1 Hive CLI、Beeline CLI Hive自带的命令行客户端 优点&#xff1a;不需要额外安装 缺点&#xff1a;编写SQL环境恶劣&#xff0c;无有效提示&#xff0c;无语法高亮&#xff0c;误操作几率高 2 文本编辑器 Sublime、Emacs 、EditPlus、UltraEdit、Visual Studio Code等 有…

基于Seam Carving实现图像的重定位 附完整代码

相比于算法目标的复杂&#xff0c;算法步骤却异常的简单&#xff0c;下面具体介绍利用 SeamCarving 算法进行图像剪裁的步骤&#xff1a;1.计算图像中每个像素的“重要程度”&#xff08;能量&#xff09;&#xff0c;生成能量图。在绝大多数情况下&#xff0c;我们可以做出如下…

【string 类的使用方法(总结)】

1. 为什么学习string类&#xff1f; C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要…

采用NVIDIA Jetson Orin NX 系统的视觉边缘计算机

边缘计算机采用NVIDIA Jetson Orin NX模块化系统和高带宽图像采集卡&#xff0c;用于实时图像采集计算和人工智能处理。虹科的合作伙伴Gidel是一家专注于高速图像采集和处理的以色列科技公司&#xff0c;今天宣布新的NVIDIA Jetson Orin NX™ 16GB模块化系统(SoM)将被添加到Gid…

SpringSecurity配置及使用

Spring Security 是针对Spring项目的安全框架&#xff0c;也是Spring Boot底层安全模块默认的技术选型&#xff0c;他可以实现强大的Web安全控制&#xff0c;对于安全控制&#xff0c;我们仅需要引入spring-boot-starter-security 模块&#xff0c;进行少量的配置&#xff0c;即…