当前位置: 首页 > news >正文

Hive效率优化记录

Hive是工作中常用的数据仓库工具,提供存储在HDFS文件系统,将结构化数据映射为一张张表以及提供查询和分析功能。
Hive可以存储大规模数据,但是在运行效率上不如传统数据库,这时需要懂得常见场景下提升存储或查询效率的方法,本文记录工作中常见的情形。

map阶段优化

map阶段主要是把文件拆分成一个个文件块。正常情况下,一个map任务的启动和初始化时间远远大于逻辑处理时间,所以可以增大max参数值减少map数;但在计算逻辑较为复杂(字段少记录过多)时可以减少max参数值增大map数,控制map数来协调启动和逻辑处理时间。

-- 减少map数
set hive.hadoop.supports.splittable.combineinputformat=true;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; -- 执行前进行小文件合并,进而减少map数目
-- 文件小于1M的会单独产生一个map,文件在1M-256M之间大小的会合并,文件大于256M的拆分为多个
set mapred.min.split.size=1000000;
set mapred.max.split.size=256000000;
set mapred.min.split.size.per.node=256000000;
set mapred.min.split.size.per.rack=256000000;
-- set hive.exec.reducers.bytes.per.reducer=1073741824; -- 控制reduce个数,超过文件大小会产生多个reduce任务-- 增大map数
-- 一般使用情况是文件不是特别大,但是计算逻辑复杂,计算比较耗时,那么可以强制指定一个map任务个数提高执行效率
set mapred.reduce.tasks=10;
reduce阶段优化

reduce个数决定了最终输出文件的个数。增大reduce的个数会增加输出文件数量,减小reduce个数会减少输出文件数量。reduce个数过多会产生很多小文件影响以后计算效率,reduce个数过少会造成单个reduce处理数据量过大影响效率。

-- 1、Hive自动计算reduce个数
set hive.exec.reducers.bytes.per.reducer=500000000; -- 每个reduce任务最多处理500M的数据
set hive.exec.reducers.max=1009; -- 每个任务的最大reduce个数-- 2、认为指定reduce个数
set mapred.reduce.tasks=10; -- 人为指定10个reduce,会产生10个文件

注意,会产生只有一个reduce的情况:

  1. 查询时使用了order by 全局排序
  2. 表关联join时产生笛卡尔积情况
源头建表优化

建表时可以指定文件压缩格式,不要使用textfile,一般可以使用parquet+snappy格式

-- 为了提高计算和存储效率
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
TBLPROPERTIES('parquet.compression'='SNAPPY')
http://www.lryc.cn/news/234033.html

相关文章:

  • ⑩③【MySQL】详解SQL优化
  • SQL 的 AND、OR 和 NOT 运算符:条件筛选的高级用法
  • 11.5MyBatis(进阶)
  • CentOS挂载:解锁文件系统的力量
  • 修身养性 - 阿纳托利: 健身指导
  • pip anaconda 设置 国内镜像源
  • 三江城115m²3室2厅2卫,现代简约不单是居所更是对生活的向往。福州中宅装饰,福州装修
  • Hangfire.Pro 3.0 Crack
  • axios的使用,cancelToken取消请求
  • Rockdb简介
  • 【MyBatis】写了 10 年的代码,我最怕写 MyBatis 这些配置,现在有详解了
  • 全球地表水数据集JRC Global Surface Water Mapping Layers v1.4
  • Spring过滤器和拦截器的区别
  • HIS医疗项目
  • eclipse启动无法找到类(自定义监听器)
  • Ubuntu openssh-server 离线安装
  • servlet页面以及控制台输出中文乱码
  • 《向量数据库指南》——TruLens + Milvus Cloud构建RAG深入了解性能
  • vscode代码上传到gitlab
  • Spring Boot 项目的常用注解与依赖
  • 【C++11】多线程库 {thread线程库,mutex互斥锁库,condition_variable条件变量库,atomic原子操作库}
  • 智能导诊系统:基于机器学习和自然语言处理技术,可快速推荐合适的科室和医生
  • 如何防止图片抖动
  • 依赖注入方式
  • HTML 超链接 a 标签
  • 【cpolar】Ubuntu本地快速搭建web小游戏网站,公网用户远程访问
  • 数字化企业需要什么样的数据中心
  • el-table固定表头(设置height)出现内容过多时不能滚动问题
  • 从流程优化到经营提效,法大大电子签全面助力智慧零售升级
  • Jquery 通过class名称属性,匹配元素