• 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
  • 相关阅读:
    梦断代码阅读笔记02---Agenda之魂
    学习进度条(第十一周)
    冲刺第五天
    冲刺第四天
    典型用户和用户场景分析
    冲刺第三天
    冲刺第二天
    冲刺第一天
    2016huasacm暑假集训训练三 D
    2016huasacm暑假集训训练三 C
  • 原文地址:https://www.cnblogs.com/30go/p/11062848.html
Copyright © 2020-2023  润新知