hive与数据仓库篇

本文探讨了Hive在数据仓库中的常见问题,包括小文件合并、存储格式与压缩、ETL工具选择、数据质量保障、数据仓库分层设计、优化经验等。此外,还涉及到了Hive的建模方式、数据同步工具、UDF函数使用、数据倾斜处理和ACID特性的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题1、在hive中如何处理小文件合并问题

  • 有时候为了避免小文件合并,我们会设置小文件合并
set mapred.max.split.size=112345600;
set mapred.min.split.size.per.node=112345600;
set mapred.min.split.size.per.rack=112345600;
set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
  • 这个参数表示执行前进行小文件合并,前面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的),进行合并

问题2、hive的存储格式,以及压缩算法

  • hive的数据存储格式主要有:TEXTFILE(行式存储)、SEQUENCEFILE(行式存储)、ORC(列式存储)、PARQUET(列式存储)
  • 列式存储相对行式存储来说,它的数据压缩效率更高
  • ORC存储指定压缩方式有one of NONE(无压缩)、ZLIB、SNAPPY
  • hive表的数据存储格式一般选择:orc或parquet。压缩方式一般选择snappy

问题3、是用什么ETL工具进行hive中数据的ETL

问题4、如何保证hive中数据的质量

1.从技术层面上:构建一套高效、健壮的ETL程序去保证数据清洗、装换后数据的正确性和一致性;
2.从流程层面上:整个ETL是多个任务的,按步骤顺序执行的一个过程,后置任务依赖前置任务,定期执行,整个流程需要自动化,并且那个环节出现了问题,给予预警,通知相关维护人员及时处理;
3.从管理层面上:数据仓库构建在公司各个业务系统之上,它是一面镜子,很多时候它能反映出业务系统的问题,所以需要管理层的支持和约束。
https://blog.youkuaiyun.com/LwpHelloWorld/article/details/100146696

问题5、hive数据仓库的设计,项目中分了几层,每层有什么意义

  • 分三层:源数据层、数据仓库层、数据应用层
  • 源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。
  • 数据仓库层(DW):也称为细节层,DW层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。
  • 数据应用层(DA或APP):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。
    在这里插入图片描述

问题6、hive优化经验

Hadoop参数调优

一、 hdfs-site.xml 配置文件

1、 dfs.blocksize

参数:hadoop文件块大小

描述:新文件的默认块大小,以字节为单位,默认 134217728 字节。

可以使用以下后缀(大小写不敏感):k(kilo)、m(mega)、g(giga)、t(tera)、p(peta)、e(exa)来指定大小(如128k、512m、1g等),

或者以字节为单位提供完整的大小。

2、 dfs.namenode.handler.count

参数:namenode的服务器线程数

描述:NameNode有一个工作线程池用来处理客户端的远程过程调用及集群守护进程的调用。处理程序数量越多意味着要更大的池来处理来自不同DataNode的并发心跳以及客户端并发的元数据操作。对于大集群或者有大量客户端的集群来说,通常需要增大参数dfs.namenode.handler.count的默认值10。设置该值的一般原则是将其设置为集群大小的自然对数乘以20,即20logN,N为集群大小。

3、 dfs.datanode.balance.bandwidthPerSec

参数: datanode 平衡带宽

描述:指定每个datanode可以利用每秒字节数来平衡目标的最大带宽。

4、 dfs.replication

参数:块副本数

描述:默认的块复制。可以在创建文件时指定复制的实际数量。如果在create time中没有指定复制,则使用默认值3。

5、dfs.datanode.max.transfer.threads

参数:datanode 最大传输线程数

描述:指定用于传输数据进出DN的最大线程数。集群中如果不一致,会造成数据分布不均。

二、 core-site.xml 配置文件

1、 io.file.buffer.size

参数:文件的缓冲区大小

描述:用于顺序文件的缓冲区大小。这个缓冲区的大小应该是硬件页面大小的倍数(在Intel x86上是4096),它决定了在读写操作中缓冲了多少数据。SequenceFiles 读取和写入操作的缓存区大小,还有map的输出都用到了这个缓冲区容量, 可减少 I/O 次数。建议设定为 64KB 到 128KB

三、 yarn-site.xml 配置文件

1、 yarn.nodemanager.resource.memory-mb

参数:该节点 nodemanager 资源池内存

描述:NodeManager节点上可使用的物理内存总量,默认是8192(MB),根据节点所能分配的最大的内存进行分配即可,注意为操作系统与其他服务预留资源。

2、yarn.nodemanager.resource.cpu-vcores

参数:该节点 有多少cpu加入资源池 , 默认值为8

描述:表示该节点上YARN可使用的虚拟CPU个数,默认是8,注意,目前推荐将该值设值为与物理CPU核数数目相同。如果你的节点CPU核数不够8个,则需要调减小这个值,而YARN不会智能的探测节点的物理CPU总数。

·

1.Jvm重用

JVM重用不是指同一Job的两个或两个以上的Task同时运行于同一JVM上,而是 N个Task按顺序在同一个Jvm上运行,即省去了Jvm关闭和再重启的时间。N值可以在Hadoop的mapre-site.xml文件mapreduce.job.jvm.numtasks(默认1)属性进行设置。也可在hive的执行设置:set mapred.job.reuse.jvm.num.tasks=10;(默认1)

一个TT最多可以同时运行的task数目由mapred-site.xml中mapreduce.tasktracker.map.tasks.maximum 和 mapreduce.tasktracker.reduce.tasks.maximum设置。其他方法,如在JobClient端通过命令行:-D mapred.tasktracker.map.tasks.maximum=number 或者 conf.set(“mapred.tasktracker.map.tasks.maximum”,“number”)设置都是【无效的】。

2.哪些因素影响作业的运行效率?

mapper的数量:尽量将输入数据切分成数据块的整数倍。如有太多小文件,则考虑CombineFileInputFormat

reducer的数量:为了达到最高性能,集群中reducer数应该略小于reducer的任务槽数

combiner使用: 充分使用合并函数减少map和reduce之间传递的数据量,combiner在map后运行

中间值的压缩:对map输出值进行压缩减少到reduce前的传递量conf.setCompressMapOutput(true)和setMapOutputCompressorClass(GzipCodec.class)

自定义Writable:如果使用自定义的Writable对象或自定义的comparator,则必须确保已实现RawComparator

调整shuffle参数:MapReduce的shuffle过程可以对一些内存管理的参数进行调整,以弥补性能不足

3.避免context.write(new Text(),new Text())

提倡key.set(); value.set(); output.collect(key,value);

前者会产生大量的Text对象,使用完后Java垃圾回收器会花费大量的时间去收集这些对象

4.使用DistributedCache加载文件

比如配置文件,词典,共享文件,避免使用static变量

5.充分使用Combiner + Parttitioner + Comparator

Combiner: 对map任务进行本地聚合

Parttitioner:合适的Parttitioner避免reduce端负载不均

Comparator:二次排序

6.Uber模式

是Hadoop2.0中实现的一种针对MR小作业的优化机制。即如果作业足够小,则所有task在一个jvm(mrappmaster)中完成要比为每个task启动一个container更划算。下面是该机制的相关参数,这些参数均为客户端配置。

总开关

•mapreduce.job.ubertask.enable 默认值:false

•mapreduce.job.ubertask.maxmaps 最大map数,默认值:9

•mapreduce.job.ubertask.maxreduces 最大reduce数,默认值:1 (社区2.2.0只支持0或1个reduce)

•mapreduce.job.ubertask.maxbytes 最大输入字节数,默认值:默认的blocksize,即64MB

map或reduce的内存需求不大于appmaster的内存需求

•mapreduce.map.memory.mb (默认值:0) <= yarn.app.mapreduce.am.resource.mb (默认值:1536)

•mapreduce.reduce.memory.mb (默认值:0) <= yarn.app.mapreduce.am.resource.mb (默认值:1536)

map或reduce的CPU需求不大于appmaster的CPU需求

•mapreduce.map.cpu.vcores (默认值:1) <= yarn.app.mapreduce.am.resource.cpu-vcores (默认值:1)

•mapreduce.reduce.cpu.vcores (默认值:1) <= yarn.app.mapreduce.am.resource.cpu-vcores (默认值:1)

•mapreduce.job.map.class 不继承于 org.apache.hadoop.mapreduce.lib.chain.ChainMapper

•mapreduce.job.reduce.class 不继承于 org.apache.hadoop.mapreduce.lib.chain.ChainReducer

问题7、hive数据仓库中的建模方式,为什么选择这种建模方式

https://blog.youkuaiyun.com/czp11210/article/details/51655046

问题8、分布式数据仓库的整体组织结构

问题9、数据仓库如何同步,使用什么工具,根据什么进行实时同步

问题10、使用了哪些UDF函数?实现什么功能

  • 行转列
    • CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;
    • CONCAT_WS(separator, str1, str2,…):它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;
    • COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。
  • 列转行
    • EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行
    • LATERAL VIEW
      用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
      解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
  • 用于分区排序
    • 窗口函数

问题11、根据什么对hive表进行分桶分区,为什么

问题12、如何确定起始来源数据?是否有做过元数据管理

  • 元数据(Meta Date),主要记录数据仓库中模型的定义、各层级间的映射关系、监控数据仓库的数据状态及ETL的任务运行状态。一般会通过元数据资料库(Metadata Repository)来统一地存储和管理元数据

问题13、什么是数据仓库,数据集市、事实表、维度表、OLAP

  • 数据仓库是面向主题的(Subject-Oriented )、集成的(Integrated)、非易失的(Non-Volatile)和时变的(Time-Variant )数据集合,用以支持管理决策。
  • OLAP:分析型处理,叫联机分析处理 OLAP(On-Line Analytical Processing)一般针对某些主题的历史数据进行分析,支持 管理决策
  • 事实表:是指存储有事实记录的表,如系统日志、销售记录等;事实表的记录时不断地动态增长
  • 维度表:是与事实表相对应的一种表;它保存了维度的属性值,可以跟事实表做关联;相当于将事实表上经常重复出现的属性抽取、规范出来用一张表进行管理。常见的维度表有:日期表,地点表(包含国家、省、州、城市等属性)等。
  • 数据集市:数据集市不同于数据仓库,一般是服务于某几个部门。数据仓库向各个数据集市提供数据,且一般来讲,数据仓库的表设计符合规范化设计,而数据集市一般使用维度建模。
  • https://blog.youkuaiyun.com/weixin_43132433/article/details/82466624

问题14、hive和mysql的区别

  • 两者的查询语句不同,hive是用HQL,mysql用sql
  • 两者的数据存储位置不同,hive存储在hdfs,mysql存储在磁盘上
  • 查询执行底层不同,hive的底层是MapReduce
  • 执行延迟不同:hive延时高,mysql延时低
  • 处理数据规模不同:hive处理大数据量,mysql处理数据一般只能达到G,数据相对来说很少

问题15、有没有用过开窗函数,例如 row number, partition by

ROW_NUMBER(): 从1开始,按照顺序,生成分组内记录的序列
RANK() : 生成数据项在分组中的排名,排名相等会在名次中留下空位
DENSE_RANK(): 生成数据项在分组中的排名,排名相等会在名次中不会留下空位
cume_dist : 返回小于等于当前值的行数/分组内总行数

问题16、自定义函数写过哪些,UDF,UDAF, UDTF

用UDF函数解析公共字段;用UDTF函数解析事件字段。
解析json,时间格式转换
自定义UDF:继承UDF,重写evaluate方法
自定义UDTF:继承自GenericUDTF,重写3个方法:
initialize(自定义输出的列名和类型),process(将结果返回forward(result)),close

问题17、Hive调优

  • Map前小文件合并
  • Join优化
    • 多个join时,把大表放后面
    • 原子化操作,使用中间表完成复杂逻辑
    • 使用相同的连接键(on ??=?? ,问号内容就是连接键)
  • 并行执行
    • 多个互不依赖的过程,并行执行
  • 严格模式
    • 没有limit的order by 语句不执行
    • 禁用笛卡尔积查询
  • Jvm重用
  • 推测执行
    • 所谓的推测执行,就是当所有task都开始运行之后,Job Tracker会统计所有任务的平均进度,如果某个task所在的task node机器配置比较低或者CPU load很高(原因很多),导致任务执行比总体任务的平均执行要慢,此时Job Tracker会启动一个新的任务(duplicate task),原有任务和新任务哪个先执行完就把另外一个kill掉

问题18、Hive发生数据倾斜,怎么处理

  • 发生数据倾斜主要的原因有:
    • Key分布不均匀
    • 业务数据本身的特性
    • SQL语句导致的数据倾斜
  • 解决办法
    • Key分布不均匀
      • hive设置hive.map.aggr=true, 设置在map端聚合
      • hive.groupby.skewindata=true 生成的查询计划会有两个MRjob ,第一个MRjob会把Map的输出结果随机的分布到Reduce中,每个reduce端做聚合操作,是达到负载均衡的目的; 第二个MRjob在根据经过预处理的数据进行GroupbyKey 分布到Reduce中 完成最终的聚合操作
    • SQL语句调整
      • 选用join key 分布最均匀的表作为驱动表。做好列裁剪和filter操作,以达到两表join的时候,数据量相对变小的效果。
      • 大小表Join:使用map join让小的维度表(1000条以下的记录条数)先进内存。在Map端完成Reduce。
      • 大表Join大表:把空值的Key变成一个字符串加上一个随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终的结果。
      • count distinct大量相同特殊值:count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在做后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union.

问题19、Hive数仓,如何实现 update delete 数据

i.如果一个表要实现update和delete功能,该表就必须支持ACID,而支持ACID,就必须满足以下条件:
ii.表的存储格式必须是ORC(STORED AS ORC);
iii.表必须进行分桶(CLUSTERED BY (col_name, col_name, …) INTO num_buckets BUCKETS);
iv.Table property中参数transactional必须设定为True(tblproperties(‘transactional’=‘true’));

问题20、Sort by , Order by, Cluster By, distribute By 各代表什么

i.Sort by :在数据进入reduce前排序 故只能保证每个reduce输出有序
ii.Order by : 会对输入做全局排序,因此只有一个reducer
iii.Cluster by (file…):除了具有 Distribute by 的功能,还会对字段进行排序 只能正序
iv.Distribute by(file…) :根据指定字段将数据分发到不同的reducer, 按照hash散列分发

问题21、用hive_sql编写计算7日留存的算法

问题22、Count(distinct) 和先 groupby 后 count 有什么区别?

i.count(distinct)吃内存,查询快;
ii.group by空间复杂度小,在时间复杂度允许的情况下,可以发挥他的空间复杂度优势。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值