hive--小文件问题

小文件如何产生

  • hive的底层存储是HDFS,默认的块大小是128M,通常小于默认块大小,HDFS默认也算一个block, 所以产生小文件主要有以下几种:
    • 1、数据源本身就包含有大量的小文件。
    • 2、使用spark/flink实时写hive时,根据业务的时间窗口(10s,20s)落地hive表,产生很多小文件。
    • 3、采用动态分区也会产生很多小文件。
    • 4、reduce的个数输出。默认reduce个数和落地hive文件个数一样。

小文件带来的影响

  • 1、从Hive的角度看,小文件会开很多map,一个map开一个JVM去执行,所以这些任务的初始化,启动,执行会浪费大量的资源,严重影响性能。
  • 2、HDFS存储太多小文件, 会导致namenode元数据特别大, 占用太多内存, 查询效率降低。
    • HDFS的文件元信息,包括位置、大小、分块信息等,都是保存在NameNode的内存中的。每个对象大约占用150个字节,因此一千万个文件及分块就会占用约3G的内存空间,一旦接近这个量级,NameNode的性能就会开始下降了。

解决方案

已有的小文件

  • 1.使用hadoop archive命令把小文件进行归档。
#用来控制归档是否可用
set hive.archive.enabled=true;
#通知Hive在创建归档时是否可以设置父目录
set hive.archive.har.parentdir.settable=true;
#控制需要归档文件的大小
set har.partfile.size=1099511627776;

#使用以下命令进行归档
ALTER TABLE srcpart ARCHIVE PARTITION(ds='2021-09-08', hr='12');

#对已归档的分区恢复为原文件
ALTER TABLE srcpart UNARCHIVE PARTITION(ds='2021-09-08', hr='12');

#::注意,归档的分区不能够INSERT OVERWRITE,必须先unarchive

  • 2.重建表,建表时减少reduce数量。
set mapred.reduce.tasks=100; -- 设置reduce数量

小文件的产生途径

  • 参数设置
-- 每个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 = 134217728;
 
-- 当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge。
set hive.merge.smallfiles.avgsize=16000000;
  • 少用动态分区,使用distribute by分区
--设置作业优先级(VERY_HIGH,HIGH,NORMAL,LOW)
set mapred.job.priority = NORMAL;
--开启中间压缩(map输出结果压缩)
set hive.exec.compress.intermediate = true;
--在Map-Reduce的任务结束时合并小文件
set hive.merge.mapfiles=true;
set hive.merge.mapredfiles = true;
--合并文件的大小,设置为块大小的两倍256M
set hive.merge.size.per.task = 134217728;
--当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
set hive.merge.smallfiles.avgsize=134217728;
-- orc的表同时需要下面两个,其它文件可以去掉
set hive.exec.orc.default.block.size=134217728;
set hive.merge.orcfile.stripe.level=false;
-- 设置读写并发
set hive.support.concurrency=false;
set hive.support.quoted.identifiers=none;
 
 
insert overwrite table ${hivevar:item_table} partition (dt='${hivevar:item_date}')
select `(dt)?+.+`
from ${hivevar:item_table}
where dt='${hivevar:item_date}'
distribute by rand();
 
--程序解读: 使用distribute by rand() 自动产生shuffle, 将数据随机分配给reduce,避免出现较大文件。
  • 使用sequencefile作为表存储形式,不要使用textfile,在一定程度上可以减少小文件

参考

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果没有hive-site.xml文件,那么可能需要手动创建该文件并配置Hive的相关参数。可以参考Hive官方文档或者其他相关资料来了解如何配置hive-site.xml文件。另外,也可以尝试重新安装Hive,以确保所有必要的文件都被正确安装。 ### 回答2: Hive是一个数据仓库工具,它使得分布式数据访问变得更加容易。hive-site.xml文件包含了Hive的配置信息,是Hive的一个必要文件。如果Hive没有hive-site.xml文件,那么将无法正确地运行和配置。 如果你在安装Hive时发现没有hive-site.xml文件,这可能是因为安装不完整或文件已经被删除。解决这个问题的方法是重新安装Hive或手动创建hive-site.xml文件。 首先,你可以尝试重新安装Hive。在安装时,确保选择正确的选项以安装所有必要的文件,包括hive-site。如果重新安装无法解决问题,你可以手动创建hive-site.xml文件。 创建hive-site.xml文件的方法很简单,只需要按照下面的步骤: 1. 在本地计算机上创建一个空白文本文件。 2. 将文件名更改为hive-site.xml。 3. 打开文本编辑器,并将以下文本复制粘贴到文件中: <configuration> <property><name>hive.metastore.uris</name><value>thrift://localhost:9083</value></property> <property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true</value></property> <property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value></property> <property><name>javax.jdo.option.ConnectionUserName</name><value>hiveuser</value></property> <property><name>javax.jdo.option.ConnectionPassword</name><value>hivepassword</value></property> </configuration> 4. 保存文件并将其放置在Hive的配置目录中。你可以通过查看Hive的文档来了解配置目录的位置。 5. 重启Hive以确保配置文件生效。 总之,缺少hive-site.xml文件可能会导致Hive无法配置和运行。如果重新安装无法解决问题,则可以尝试手动创建一个文件。在手动创建文件时,确保按照Hive的文档将文件放置在正确的位置,并重新启动Hive以使配置生效。 ### 回答3: Hive是一种基于Hadoop平台的数据仓库工具,是Hadoop生态系统中的一个重要组成部分。在使用Hive的过程中,可能会出现没有hive-site.xml文件的情况。那么,这种情况下该如何处理呢? 首先,我们需要知道hive-site.xml文件是什么。该文件Hive的配置文件,用于存放Hive的各种配置参数,如Hive元数据存储路径、HDFS存储地址、Hive执行引擎等参数。因此,没有hive-site.xml文件会导致Hive无法正常运行。为了解决这个问题,我们需要按照以下步骤进行操作: 1. 查找Hive的安装目录,一般情况下,该目录在$HIVE_HOME下。 2. 然后进入conf目录,在该目录下寻找hive-site.xml文件。 3. 如果该文件不存在,可以手动创建该文件,即新建一个名为hive-site.xml的文件。 4. 将需要配置的参数按照XML格式写入文件中。可以参考其他已有的hive-site.xml文件,或者查找相关文档获取参数列表及其含义。 5. 最后,保存该文件,并重新启动Hive服务。 当然,在某些情况下,即使没有hive-site.xml文件也不会影响Hive的正常运行。例如,如果使用集成开发环境(IDE)来编写Hive脚本,该IDE已经为Hive提供了默认的配置参数,因此不需要手动配置。 总之,没有hive-site.xml文件可能是由于Hive的不同版本、不同安装方式等原因导致的。解决该问题的关键在于了解Hive的配置参数及其含义,并进行正确的配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值