• hive中合并小文件


    Hive小文件产生的原因

       一方面hive数据仓库中汇总表的数据量通常比源数据少的多,而且为了提升运算速度,我们会增加Reduce的数量,Hive本身也会做类似的优化----Reducer数量等于源数据的量除以hive.exec.reducers.bytes.per.reduce所配置的量(默认1G)。Reduce数量的增加也即意味着结果文件的增加,从而产生小文件的问题。

        解决小文件的问题可以从两个方向入手:

    • 输入合并。即在map前合并小文件。
    • 输出合并。即在输出结果的时候合并小文件。

      当Hive输入由很多个小文件组成,由于每个小文件都会启动一个map任务,如果文件过小,以至于map任务启动和初始化的时间大于逻辑处理的时间,会造成资源浪费,甚至OOM。
    为此,当我们启动一个任务,发现输入数据量小但任务数量多时,需要注意在Map前端进行输入合并

    1. Map输入合并小文件
    对应参数:
    set mapred.max.split.size=256000000;  #每个Map最大输入大小
    set mapred.min.split.size.per.node=100000000; #一个节点上split的至少的大小 
    set mapred.min.split.size.per.rack=100000000; #一个交换机下split的至少的大小
    set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  #执行Map前进行小文件合并

    在开启了org.apache.hadoop.hive.ql.io.CombineHiveInputFormat后,一个data node节点上多个小文件会进行合并,合并文件数由mapred.max.split.size限制的大小决定。
    mapred.min.split.size.per.node决定了多个data node上的文件是否需要合并~
    mapred.min.split.size.per.rack决定了多个交换机上的文件是否需要合并~



    2.输出合并
    set hive.merge.mapfiles = true #在Map-only的任务结束时合并小文件
    set hive.merge.mapredfiles = true #在Map-Reduce的任务结束时合并小文件
    set hive.merge.size.per.task = 256*1000*1000 #合并文件的大小
    set hive.merge.smallfiles.avgsize=16000000 #当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge


    Reference: 
    Hive AdminManual 

  • 相关阅读:
    Creative Cloud 无法连接问题
    HTTP_PROXY
    <video> controlsList
    Electron 问题
    含神经网络的离线AI翻译 APP

    (转载)移动Web开发技巧汇总
    2014年总结
    转载(web app变革之rem)
    火狐不支持backgroundPosition的js插件
  • 原文地址:https://www.cnblogs.com/yuanmingzhou/p/14329479.html
Copyright © 2020-2023  润新知