zoukankan      html  css  js  c++  java
  • Hive小文件处理

    小文件是如何产生的:

    1. 动态分区插入数据的时候,会产生大量的小文件,从而导致map数量的暴增
    2. 数据源本身就包含有大量的小文件
    3. reduce个数越多,生成的小文件也越多

    小文件的危害:

    1. 从HIVE角度来看的话呢,小文件越多,map的个数也会越多,每一个map都会开启一个JVM虚拟机,每个虚拟机都要创建任务,执行任务,这些流程都会造成大量的资源浪费,严重影响性能
    2. 在HDFS中,每个小文件约占150byte,如果小文件过多则会占用大量的内存。这样namenode内存容量严重制约了集群的发展

    小文件的解决方案

    从小文件的产生途径解决:

    1. 使用sequencefile作为表存储形式,不要使用textfile,在一定程度上可以减少小文件
    2. 减少reduce的个数(减少生成分区数量)
    3. 少用动态分区,使用distribute by分区

    对已经存在的小文件做出的解决方案:

    1. 使用Hadoop achieve把小文件进行归档

    2. 重建表,建表时减少reduce的数量

    3. 通过参数调节,设置map/reduce的数量

    设置map输入合并小文件的相关参数:

    //每个Map最大输入大小(这个值决定了合并后文件的数量)
    set mapred.max.split.size=256000000;  
    //一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)
    set mapred.min.split.size.per.node=100000000;
    //一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并)  
    set mapred.min.split.size.per.rack=100000000;
    //执行Map前进行小文件合并
    set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
      • 设置map输出和reduce输出进行合并的相关参数:

    //设置map端输出进行合并,默认为true
    set hive.merge.mapfiles = true
    //设置reduce端输出进行合并,默认为false
    set hive.merge.mapredfiles = true
    //设置合并文件的大小
    set hive.merge.size.per.task = 256*1000*1000
    //当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge。
    set hive.merge.smallfiles.avgsize=16000000
  • 相关阅读:
    [BZOJ]2132: 圈地计划 最小割
    从最近MySQL的优化工作想到的
    Linux基本操作 9----- 认识与学习bash
    多路径配置vlome group共享存储,VG的更新。
    两位数乘法的速算方法(一)
    请对他有足够的重视——设计!
    ASP.NET中配置应用程序
    flex开发小技巧集锦
    刚制作完的SAP Sybase ASE15.7 [Sybase Central] 客户端
    Static 关键字的 5 种用法,你会几种?
  • 原文地址:https://www.cnblogs.com/30go/p/11062848.html
Copyright © 2011-2022 走看看