• Hive如何处理小文件问题?


    一、小文件是如何产生的

    1.动态分区插入数据,产生大量的小文件,从而导致map数量剧增。

    2.reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的)。

    3.数据源本身就包含大量的小文件。

    二、小文件问题的影响

    1.从Hive的角度看,小文件会开很多map,一个map开一个JVM去执行,所以这些任务的初始化,启动,执行会浪费大量的资源,严重影响性能。

    2.在HDFS中,每个小文件对象约占150byte,如果小文件过多会占用大量内存。这样NameNode内存容量严重制约了集群的扩展。

    三、小文件问题的解决方案

    从小文件产生的途经就可以从源头上控制小文件数量,方法如下:

    1.使用Sequencefile作为表存储格式,不要用textfile,在一定程度上可以减少小文件。

    2.减少reduce的数量(可以使用参数进行控制)。

    3.少用动态分区,用时记得按distribute by分区。

    四、对于已有的小文件,我们可以通过以下几种方案解决:

    1.使用hadoop archive命令把小文件进行归档。

    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

    欢迎留言联系,上海尚学堂大数据培训李同学笔记原创,转载请先联系。

  • 相关阅读:
    tf导出pb文件,以及如何使用pb文件
    word2vec入门理解的博客整理
    简单的RNN和BP多层网络之间的区别
    图像中用到的信息论中的一些概念公式
    raw文件转mha文件
    mha格式的CT体数据转为jpg切片
    在MySQL的表中增加一列
    ES7学习笔记(二)ES的集群原理
    MySQL中的幻读,你真的理解吗?
    ES7学习笔记(一)Elasticsearch的安装与启动
  • 原文地址:https://www.cnblogs.com/shsxt/p/9837346.html
Copyright © 2020-2023  润新知