当前位置: 首页 > news >正文

为啥集群小文件治理那么重要,你真的懂吗?

        小文件是 Hadoop 集群运维中的常见挑战,尤其对于大规模运行的集群来说可谓至关重要。如果处理不好,可能会导致许多并发症。Hadoop集群本质是为了TB,PB规模的数据存储和计算因运而生的。为啥大数据开发都说小文件的治理重要,说HDFS 存储小文件效率低下,比如增加namenode负载等,降低访问效率等?究竟本质上为什么重要?以及如何从本质上剖析小文件,治理小文件呢?今天就带你走进小文件的世界。

 1.什么是小文件?

       日常生产中HDFS上小文件产生是一个很正常的事情,有些甚至是不可避免,比如jar,xml配置文件,tmp临时文件,流式任务等都是小文件的组成部分。当然更多的是因为集群设置不合理,造成一些意料之外的小文件产生。实际公司生产中对于小文件的大小没有一个统一的定义。一般公司集群的blocksize的大小在128/256两者居多。首先小文件大小肯定是要远小于blocksize的文件。一般公司小文件的大小定义如1Mb,8Mb,甚至16Mb,32Mb更大。根据公司实际集群状态定义,因为有些情况合并小文件需要消耗额外的资源。

      既然剖析小文件,那么不可避免的要先剖析hdfs的存储原理。众多周知了,HDFS上文件的数据存储分为namenode元数据管理和实际数据文件。hdfs上的数据文件被拆分成块block,这些块block在整个集群中的datanode的本地文件系统上存储和复制,每个块也维护者自己的blockmeta信息。namenode主要维护这些文件的元数据信息,具体namenode的解析参考我的其他博客。

如下一个某个文件的某个block在data上存储的情况。

2.小文件的产生

1.流式数据,如flume,kafak,sparkstreaming,storm,flink等,流式增量文件,小窗口文件,如几分钟一次等。

2.MapReduce引擎任务:如果纯map任务,大量的map;如果mapreduce任务,大量的reduce;两者都会造成大量的文件。出现这种情况的原因很多,果分布表的过度分区,输入大量的小文件,参数设置的不合理等,输出没有文件合并等。

3.spark任务过度并行化,Spark 分区越多,写入的文件就越多。

4.文件的压缩与存储格式不合理;一般生产公司很少使用textfile这种低效的文件格式了。

使用压缩,降低文件的大小,同时也会降低文件的总块数。注意文件存储格式和压缩不合理只是加剧小文件问题,不是产生小文件的本质。

3.小文件的危害

3.1小文件对namenod的影响

如下图1,一个文件192Mb,默认blocksize=128Mb,副本个数为3,存储为2个block。

 如下图2,同样一个文件192Mb,默认blocksize=128Mb,副本个数为3,存储为192个block

      namenode的namespace中主要占存储对象是文件的目录个数,文件(文件名长度)以及文件block数根据namenode实际使用经验来看,一个存储对象大概占用150字节的空间。HDFS上存储文件占用的namenode内存计算公式如下:

       Memory=150bytes*(1个文件inode+(文件的块数*副本个数))

     如上图1 ,一个文件192Mb,默认blocksize=128Mb,副本个数为3,存储为2个block,需要namenode内存=150*(1+2*3)=1050  Bytes

     同理,图2 一个文件192Mb,默认blocksize=128Mb,副本个数为3,存储为192个block,需要namenode内存=150 x (192 + (192 x 3)) = 115200 Bytes

尖叫总结:

1 .从上面可以看出,同样的一个文件,大小不同形态的存储占用namenode的内存之比相差了109倍之多。所以如果对于单namenode的集群来说,大量的小文件的会占用大量的namenode堆内存空间,给集群的存储造成瓶颈。有些人可能会说我们联邦,多组namenode不就没有这个问题了,其实不然,且往下看

2.当 NameNode 重新启动时(虽然生产上这种情况很少),它必须将文件系统元数据fsimage从本地磁盘加载到内存中。这意味着如果 namenode 元数据很大,重启会更慢(以我们公司3亿block,5万多个文件对象来说,重启一次1.5小时,期间应用不可用)其次,datanode 还通过网络向 NameNode 报告块更改;更多的块意味着要通过网络报告更多的变化,等待时间更长。

3.更多的文件,更多的block,意味着更多的读取请求需要由 NameNode 提供服务,这将增加 RPC 队列和处理延迟,进而导致namenode性能和响应能力下降。官方介绍说接近 40K~50K RPCs/s 人为是极高的负载。实际使用来看比这低时对于namenode来说性能都会打很大的折扣。

3.2 小文件对datanode影响

      文件的block存储是存储在datanode本地系统上,底层的磁盘上,甚至不同的挂载目录,不同的磁盘上。大量的小文件,意味着数据着寻址需要花费很多时间,尤其对于高负载的集群来说,磁盘使用率50%以上的集群,花费在寻址的时间比文件读取写入的时间更多。这种就违背了blocksize大小设计的初衷(实践显示最佳效果是:寻址时间仅占传输时间的1%)。这样会造成磁盘的读写会很慢,拥有大量小文件会导致更多的磁盘搜索。如下磁盘延迟:

3.3小文件对计算的影响

        基于HDFS文件系统的计算,blokc块是最小粒度的数据处理单元。块的多少往往影响应用程序的吞吐量。更多的文件,意味着更多的块,以及更多的节点分布。

        比如以MapReduce任务为例(hive等),在 MapReduce 中,会为每个读取的块生成一个单独的 Map 任务,如果大量小文件,大量的块,意味着着更多任务调度,任务创建开销,以及更多的任务管理开销(MapReduce 作业的 application master 是一个 Java 应用,它的主类是 MRAppMaster。它通过创建一定数量的bookkeeping object跟踪作业进度来初始化作业该对象接受任务报告的进度和完成情况)。虽然可以开启map前文件合并,但是这也需要不停地从不同节点建立连接,数据读取,网络传输,然后进行合并,同样会增加消耗资源和增加计算时间,成本也很高。

      同样,如果是spark计算引擎,executor的一次读取和处理一个分区,默认情况下,每个分区是一个 HDFS 块,如果大量的小文件,每个文件都在不同的分区中读取,这将导致大量的任务调度开销,同时每个 CPU 内核的吞吐量降低。

     简单总结一下:小文件对于计算的影响就是需要大量节点之间频繁建立联系,数据传输等,浪费资源,消耗时间长。其次小文件相关大量的任务初始化时间甚至比计算时间还长,造成计算资源的使用浪费,降低集群的吞吐量。

     后续请见小文件多维度治理....................

 

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

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

Flink大数据实时计算系列-第一个程序JAVA版本-分组统计

Flink大数据实时计算系列-第一个程序JAVA版本-分组 在基线版本上增加了分组统计的代码 #Flink代码 package com.flinkniu.flink.operator;import org.apache.flink.api.common.typeinfo.Types; import org.apache.flink...

Ant Design Vue实现a-table表格单元格合并

Ant Design Vue实现a-table表格单元格合并 参考Ant design Vue官网关于行和列合并api https://antdv.com/components/table-cn/ 下面官网对表格合并这块的描述 !!!注意注意注意重要事情说三遍:很多同学都习惯性的将columns写在d…...

css中id和class的区别

css中id和class的区别ID是唯一的类不是唯一的语法区别ID是唯一的 每个元素仅可以有一个ID每个页面仅可以有一个元素拥有这个ID 类不是唯一的 你可以在多个元素中使用相同的类你可以使用多个类在一个元素中 语法区别 id对应css是用样式选择符“#”(井号&#xff…...

力扣刷题:动态规划篇

目录322. 零钱兑换题目介绍题目实现5. 最长回文子串题目介绍题目实现518. 零钱兑换 II题目介绍题目实现53. 最大子序和题目介绍题目实现63. 不同路径 II题目介绍[62. 不同路径](https://leetcode-cn.com/problems/unique-paths/)题目实现70. 爬楼梯题目介绍题目实现72. 编辑距离…...

Java面试list 和 set 区别

List和Set的区别 List::有序,按对象进入的的序保存对象,可可允许多个Null元素对象,可以使用lterator迭取出所有元素。在逐一便历,也可以使用get(int index)获取指定下标的元素 Set:无序,不可重复…...

诚意分享:这里有份超全Java体系化进阶学习图谱

摘要 Apache Kafka是一个分布式消息发布订阅系统。它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),之后成为Apache项目的一部分。 成千上万的企业都在使用Kafka,三分之一的世界500强公司也在其中&…...

Twitter教程:如何下载Twitter数据副本?

Twitterrific Mac破解版是一款非常现代化优秀的桌面Twitter客户端,这款软件不仅看起来惊人,它的表现也是非常棒的,本文给大家的带来了如何下载Twitter数据副本的教程。 教程如下 在 iPhone 或 iPad 上打开“Twitter”。(您也可以使用 Twitter.com 网站&#xff09…...

【内网学习笔记】8、powercat 的使用

1、下载安装 powercat powercat 可以视为 nc 的 powershell 版本,因此也可以和 nc 进行连接。 powercat 可在 github 进行下载,项目地址为:https://github.com/besimorhino/powercat 下载下来 powercat.ps1 文件后,直接导入即可…...

栈和队列(二) : 用栈实现队列

leetcode232.用栈实现队列 https://leetcode-cn.com/problems/implement-queue-using-stacks/ 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。…...

测试技巧:弱网测试

弱网测试场景 当前APP网络环境比较复杂,网络制式有2G、3G、4G网络,还有越来越多的公共Wi-Fi。不同的网络环境和网络制式的差异,都会对用户使用app造成一定影响。另外,当前app使用场景多变,如进地铁、上公交、进电梯等…...

PMP哪里报名

首先了解下PMP考试时间,一年四次,正常情况是每年3、6、9、12月份考试; 其次了解PMP考试需要两次报名,分别是英文报名和中文报名;且两次报名通过后,才能正常考试。 下面分别介绍PMP英文报名和PMP考试中文报…...

Thread类的常用方法

Thread类的常用方法 void start(): 启动线程,并执行对象的run()方法run(): 线程在被调度时执行的操作static Thread currentThread(): 返回当前线程。在Thread子类中就 是this,通常用于主线程和Runnable实现类String getName(): 返回线程的名…...

浅谈设计模式(三)

前言 之前详细介绍了几种常用的设计模式,最后总结一下附上所有设计模式的类图以及六大设计原则 一、创建型 1.Factory Method(工厂方法) 定义:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法…...

AR增强现实让科技贴近生活

AR也叫增强现实,它是在1990年被正式提出的,在时间上要比VR虚拟现实技术晚一些,它的实现主要通过三维空间、场景交融、现实视频等技术相互作用、融合实现的。 AR增强现实技术在工业领域中,有着超强的适用性,假设某件工…...

c++程序设计中虚基类,多继承知识点

一.前言 如上 二.题目 分别声明Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派 生出新类Teacher_Cadre(教师兼干部)类。要求: (1)在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。 (2&a…...

FFmpeg:avcodec_encode_video()

本文简单分析FFmpeg的avcodec_encode_video2()函数。该函数用于编码一帧视频数据。avcodec_encode_video2()函数的声明位于libavcodec\avcodec.h,如下所示。 /*** Encode a frame of video.** Takes input raw video data from frame and writes the next output p…...

SpringBoot中必须掌握的45个注解

1.SpringBoot/spring SpringBootApplication: 包含Configuration、EnableAutoConfiguration、ComponentScan通常用在主类上; Repository: 用于标注数据访问组件,即DAO组件; Service: 用于标注业务层组件; RestController: …...

侯捷CPP---面向对象(上)

侯捷CPP---面向对象(上)前言头文件防卫式声明class 分类不带指针的class(complex)成员变量私有化inline function(内联函数)构造函数常量成员函数参数传递返回值传递友元函数操作符重载临时对象带指针的cla…...

使用注解开发

1; 2.mapper 2.测试...

苏宁易购启动六一宝宝节,首提“共情消费”

5月26日晚8点,苏宁易购六一宝宝节掰头大会在多个平台播出。六一宝宝节全面启动。 六一宝宝节定位于打破营销套路,打破传统电商促销节奏。它是大促,更是一场成年人释放压力、共情消费的盛典。 掰头大会灵魂辩题 开启宝宝节 六一宝宝节的启…...

09.流程控制

09.流程控制 1.引子 流程控制即控制流程,具体指控制程序的执行流程,而程序的执行流程分为三种结构:顺序结构(之前我们写的代码都是顺序结构)、分支结构(用到if判断)、循环结构(用到…...

Trace

TRACE:在命令行上捕获系统跟踪记录https://developer.android.google.cn/topic/performance/tracing/command-line?hlzh-cn perfetto https://developer.android.google.cn/studio/command-line/perfetto?hlzh-cn 开发这模式的系统trace使用PerfettoUI打开https://develope…...

HTML列表标签和表格标签

目录 一、列表标签与表格标签要点 二、列表 LIST (一)有序列表: (二)无序列表: (三)自定义(相互嵌套使用) 三、表格标签 TABLE (一)表格标签 (二&…...

webrtc之SVC实现(十)

一、概念 SVC(可适性视频编码或可分级视频编码)是传统H.264/MPEG-4 AVC编码的延伸,可提升更大的编码弹性,并具有时间可适性(Temporal Scalability)、空间可适性(Spatial Scalability&#xff09…...

delphi JSON 数字0.00没有引号解析问题

Delphi中利用SuperObject解析JSON 0.00数字有问题 原因是superObject 的版本问题: 网址:https://www.haolizi.net/example/key_superobject_1.html 下载版本...

oracle数据库:select基本语法【条件查询】

当我们进行数据查询的时候,往往需要根据一些条件来筛选出我们需要的数据,这时候可以用到条件查询 1,条件查询 语法: select 字段1,字段2... from 表名 where 条件1,条件2...其中关键字where后面接我们查…...

CSS内联样式的使用,赶紧收藏备战金三银四!

近几年,随着技术和政策的变化,国内对技术人才的需求也是翻天覆地的变化。 为什么转行前端呢? 对于很多毕业学生来说,前端开发工程师行业需求大、待遇好、不限门槛、政策优,成为了很多大学生的就业发展选择。 学习路线 HTML基础…...

终于有人把华为认证讲明白了!

响应大家的需求,你要的华为认证科普来啦~ 华为认证 华为认证是华为技术有限公司(简称“华为”)基于“ 平台生态 ”战略,围绕 “云-管-端 ” 协同的新ICT技术架构,打造的业界覆盖ICT领域最广的认证体系,根据…...

一些小知识及git 使用方法

取消全局的log打印 在开发的时候,我们经常会log输出调试程序,在将程序打包的时候可能会忘记删除,导致在正式上线的时候,控制台会输出一些东西 // 设置 开发/生产 环境变量 。在入口程序中对其判断,并重写 console.log…...

Reids之三种特殊数据类型Bitmaps,HyperLogLog,Geospatial

Bitmaps 简介 现代计算机用二进制(位)作为信息的基础单位,1个字节等于8位,例如“abc”字符串是由3个字节组成,但实际在计算机存储时将其用二进制表示,“abc” 分别对用的ASCLL码分别是97,98,99,…...

PHP - MAC下PhpStorm安装调试环境xdebug

今天下午一直在捣鼓如何用PhpStorm进行调试&#xff0c;查找了许多资料&#xff0c;零零碎碎的&#xff0c;所以自己弄篇文章记录一下步骤。 安装xdebug 使用brew安装xdebug&#xff0c;语法如下 brew install homebrew/php/php<version number>-xdebug 到https://xdebug…...

MacOS 升级自带PHP5.6 升级到 PHP7.1

mac自带的是php5.6版本&#xff0c;由于php7带来了不少新特性和性能的提升&#xff0c;所以决定升级php7 输入下面命令&#xff0c;安装php7.1安装包&#xff0c;安装过程需要输入系统的密码 curl -s http://php-osx.liip.ch/install.sh | bash -s 7.1 打开终端输入php -v&…...

macOS 系统下的安装 PHP

macOS 系统下的安装 PHP 使用软件包使用 macOS Monterey 之前内置的 PHP使用软件包 macOS 下有几个预编译和打包的 PHP 版本。可以通过它使用标准的配置的 PHP,但是若需要不同的功能集(比如一个安全服务器,或者一个不同的数据库驱动程序),可能需要自己编译 PHP 和/或 we…...

osx snow leopard下用homebrew 安装php5.3 + php-fpm

最近要给客户定制一个php的论坛&#xff0c; 我本来是python控&#xff0c; 所以机器上就没有php的运行环境&#xff0c; 于是开始折腾&#xff0c; 本来在centos上配置nginx php-fpm挺简单的&#xff0c; 直接一路yum install就可以了&#xff0c; 这下到mac上就有点麻烦&…...

Unexpected Exception caught setting 异常解决记录

一&#xff0c;Unexpected Exception caught setting 异常 今天在做crm项目时&#xff0c;想要实现一个客户列表的分页查询&#xff0c;但在action总是不能成功把分页数据带回给jsp&#xff0c;初次查询之后action应该返回当前页currentPage给jsp&#xff0c;但是下面的OGNL表…...

Base64加密与解密

Base64是jdk1.8新增的加密处理类,Base64处理,在这个类里面有两个内部类 Base64.Encoder :进行加密处理 public byte[] encode(byte[] src); Base64.Decoder :进行解密处理 public byte[] decode(Strinf src); import java.util.Base64;public class JavaAPIDemo {public s…...

记一次bash脚本报错原因

准备部署上次写的 爬虫的定时任务&#xff0c;发现sh脚本 写为最简单的cd &#xff0c;也报错 后来网上一波了解,原因竟是 &#xff1a; 额&#xff0c;格式问题&#xff0c;我为了图方便是在window里用notepad写的&#xff0c;然后我再linux 系统里面执行&#xff0c;由于编码…...

mac下更新自带的PHP版本到5.6或7.0

为什么80%的码农都做不了架构师&#xff1f;>>> OS X 10.11自带的PHP版本是PHP 5.5.x&#xff0c;如果我们想更新PHP的版本到5.6或者是7.0该怎么办呢&#xff1f; 下载和安装PHP 5.6 打开终端并且运行如下命令&#xff1a; curl -s http://php-osx.liip.ch/install…...

Mac 安装PHP

PHP 7.2 $ curl -s http://php-osx.liip.ch/install.sh | bash -s 7.2 PHP 7.1 $ curl -s http://php-osx.liip.ch/install.sh | bash -s 7.1 PHP 5.6 $ curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6 查看php已安装插件 $ php -m...

access-list vs ip access-list

The access-list command is used to define a numbered ACL, meaning that the ACL will be identified in the configuration by its number. This number also designates the type of this ACL, i.e. standard IP, extended IP, MAC, etc. See here: Router(config)#acces...

如何升级MacOS自带的PHP到指定版本(5.3-7.3)

参考链接&#xff1a;https://php-osx.liip.ch/ One Line Installation&#xff08;一行安装&#xff09; 你所需要做的&#xff0c;只是打开一个shell窗口&#xff08;terminal&#xff09;&#xff0c;然后根据版本输入以下命令&#xff1a; &#xff08;更新于2018-11-14&…...

Mac升级自带PHP版本(非Homebrew方式)

为什么我要强调 非Homebrew&#xff1f; 因为我的mac系统版本非常的低&#xff0c;低到不支持homebrew 这里使用到https://php-osx.liip.ch/#install 这个下载源 这里需要几个步骤: 我们要通过命令行 执行远程脚本&#xff0c;把服务器的php包下载到本地&#xff0c;然后添加…...

Mac 自带php升级(5.6,7.0,7.1)

下载和安装PHP 5.6 打开终端并且运行如下命令&#xff1a; ** curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6** 然后&#xff0c;PHP 5.6的版本会被安装到下面的路径中&#xff1a; /usr/local/php5/下载和安装PHP 7.0&#xff0f;7.1 打开终端并运行如下的命…...

mac php7.2,MAC下更新自带的PHP版本到7.2

OS X 10.11自带的PHP版本是PHP 5.5.x&#xff0c;如果我们想更新PHP的版本7.2该怎么办呢&#xff1f;下载和安装PHP 7.2打开终端并运行如下的命令&#xff1a;curl -s http://php-osx.liip.ch/install.sh | bash -s 7.2配置路径安装完毕如果在终端里运行PHP -v命令&#xff0c;…...

mac下快速安装php的各个版本

原文地址&#xff1a; mac下快速安装php的各个版本&#xff0c;博主&#xff1a;think2me mac下其实已经安装好了PHP&#xff0c;而且版本还蛮新的&#xff0c;平时搞一搞开发&#xff0c;还是可以的&#xff0c;也没啥大问题&#xff0c;但是今天偶然发现一个验证码图片加载不…...

os x php,OS X 安装php7.0

OS X 10.11自带的PHP版本是PHP 5.5.x&#xff0c;如果我们想更新PHP的版本到5.6或者是7.0该怎么办呢&#xff1f;下载和安装PHP 5.6打开终端并且运行如下命令&#xff1a;curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6然后&#xff0c;PHP 5.6的版本会被安装到下面…...

MacBook 重装 Apache 和 PHP 7.2

20190718 本来是要做一个 php 的验证码&#xff0c;结果发现在我的 macbook 上死活不出图片&#xff0c;但是在windows 上是可以的&#xff01;断定问题出在环境上&#xff01; macOS Mojave 10.14.5 WEB&#xff1a; 自带的 apache PHP&#xff1a;自带的 php 7.1经过一大圈…...

Ubuntu20.04安装graph-tool

目录step1&#xff1a;查看系统发行版本step2: 在 /etc/apt/sources.list文件中添加一行step3: 下载密钥step4: 更新apt-getstep5: 下载graph-toolstep6&#xff1a;移动graph-tool包到anaconda下step7: 测试是否安装成功链接: 官方安装教程注&#xff1a;如果下列过程中出现权…...

Liip-imagine-bundle 在 Nignx 无法生成缓存图的问题

为什么80%的码农都做不了架构师&#xff1f;>>> 原因图片是在访问cache时候生成的&#xff0c;但是用nginx默认的rewrite rule 会有问题&#xff0c;要额外加一条&#xff1a; location ~ ^/uploads/cache {try_files $uri rewriteapp; } In this blog post, I wil…...

php upload 缓存_php-使用vich_uploader的liip_imagine无法创建缓存

我正在从事一个由两个内部项目组成的Symfony项目.一个项目和MARKETPLACE项目.这是文件在网络中的结构.web/---one/ #this one is being called from subdomain one.domain.com------/app_dev.php---marketplace/ #this one is being called from the main domain domain.com---…...