热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hive建模和优化,impala刷新元数据和表

如果涉及到表的schema改变,使用invalidatemetadata[table_name]如果只是涉及到表的数据改变,使用refresh[tabl

如果涉及到表的schema改变,使用invalidate metadata [table_name]
如果只是涉及到表的数据改变,使用refresh [table_name]
如果只是涉及到表的某一个分区数据改变,使用refresh [table_name] partition [partition]
impala-shell -i node_name -q ‘refresh table_name;’

hive客户端显示数据库,查询显示列名称
一次配置,永久生效,在当前用户的HOME目录下,新建.hiverc文件,把属性设置命令放置到该文件中,每次打开cli时,都会先执行该文件。
– 打印表头
set hive.cli.print.header=true;
set hive.cli.print.row.to.vertical=true;
set hive.cli.print.row.to.vertical.num=1;

– 显示当前数据库
set hive.cli.print.current.db=true;

hive的几种格式:
在这里插入图片描述

数据仓库的开发是逐步完善的原型法的开发方法,它要求:要尽快地让系统运行起来,尽早产生效益;要在系统运行或使用中,不断地理解需求,改善系统;不断地考虑新的需求,完善系统。

维护数据仓库的工作主要是管理日常数据装入的工作,包括刷新数据仓库的当前详细数据,将过时的数据转化成历史数据.清除不再使用的数据,管理元数据,等等;另外,如何利用接口定期从操作型环境向数据仓库追加数据,确定数据仓库的数据刷新频率,等等。

建模

1、介绍
Hive作为数据仓库,同关系型数据库开发过程类似,都需要先进行建模,所谓建模,就是对表之间指定关系方式。建模在hive中大致分为星型、雪花型和星座型。要对建模深入理解,首先需要对hive数仓中的集中表概念进行界定。hive中的表从形态上分内部表、外部表、桶表、分区表。在数据逻辑上划分为维度表和事实表。维度表等价于我们常说的字典表。事实表就是字典表之外的数据表。

1.1 星型
多张维度表,一张事实表,维度表之间没有关系。查询性能要好些,存储有冗余的。星型模型使用的比较多。

1.2 雪花型
雪花型是星型建模的扩展,维度表之间有关系。存储减少冗余,查询性能有损失,需要多级连接。和星型模型的共性就是只有一张是事实表。

1.3 星座型
星座型也是星型模型的扩展,存在多张事实表。

数据仓库分层:
ODS层:原始同步数据(或者清洗后的数据)
DW层:数据汇总层,宽表
DM层:数据集市层(各种维度表)
应用层:从集市层拿出需要的数据同步到数据库(Mongodb/Oracle)

事实表是数据仓库结构中的中央表,它包含联系事实与维度表的数字度量值和键。事实数据表包含描述业务(例如产品销售)内特定事件的数据。

维度表是维度属性的集合。是分析问题的一个窗口。是人们观察数据的特定角度,是考虑问题时的一类属性,属性的集合构成一个维。数据库结构中的星型结构,该结构在位于结构中心的单个事实数据表中维护数据,其它维度数据存储在维度表中。每个维度表与事实数据表直接相关,且通常通过一个键联接到事实数据表中。星型架构是数据仓库比较流向的一种架构。

1)、事实表就是你要关注的内容;

2)、维度表就是你观察该事务的角度,是从哪个角度去观察这个内容的。

例如,某地区商品的销量,是从地区这个角度观察商品销量的。事实表就是销量表,维度表就是地区表

4、主题表:主题(Subject)是在较高层次上将企业信息系统中的数据进行综合、归类和分析利用的一个抽象概念,每一个主题基本对应一个宏观的分析领域。在逻辑意义上,它是对应企业中某一宏观分析领域所涉及的分析对象。例如“销售分析”就是一个分析领域,因此这个数据仓库应用的主题就是“销售分析”。

面向主题的数据组织方式,就是在较高层次上对分析对象数据的一个完整并且一致的描述,能刻画各个分析对象所涉及的企业各项数据,以及数据之间的联系。所谓较高层次是相对面向应用的数据组织方式而言的,是指按照主题进行数据组织的方式具有更高的数据抽象级别。与传统数据库面向应用进行数据组织的特点相对应,数据仓库中的数据是面向主题进行组织的。例如,一个生产企业的数据仓库所组织的主题可能有产品订货分析和货物发运分析等。而按应用来组织则可能为财务子系统、销售子系统、供应子系统、人力资源子系统和生产调度子系统。

5、汇总数据层:聚合原子粒度事实表及维度表,为满足固定分析需求,以提高查询性能为目的,形成的高粒度表,如周报、月报、季报、年报等。

6、应用层:

为应用层,这层数据是完全为了满足具体的分析需求而构建的数据,也是星形结构的数据。应用层为前端应用的展现提现数据,可以为关系型数据库组成

hive优化

1、设置合理的map reduce的task数量 可以使用默认的
map阶段优化
mapred.min.split.size: 指的是数据的最小分割单元大小;min的默认值是1B
mapred.max.split.size: 指的是数据的最大分割单元大小;max的默认值是256MB
通过调整max可以起到调整map数的作用,减小max可以增加map数,增大max可以减少map数。
需要提醒的是,直接调整mapred.map.tasks这个参数是没有效果的。
reduce阶段优化
hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G)
hive.exec.reducers.max(每个任务最大的reduce数,默认为999)

2、小文件合并优化
用于设置合并的参数有:
是否合并Map输出文件:hive.merge.mapfiles=true(默认值为true)
是否合并Reduce端输出文件:hive.merge.mapredfiles=false(默认值为false)
合并文件的大小:hive.merge.size.per.task=25610001000(默认值为256000000)

3、Hive优化之小文件问题及其解决方案:
小文件是如何产生的:
动态分区插入数据,产生大量的小文件,从而导致map数量剧增;
reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的);
数据源本身就包含大量的小文件。

小文件问题的影响:
从Hive的角度看,小文件会开很多map,一个map开一个JVM去执行,所以这些任务的初始化,启动,执行会浪费大量的资源,严重影响性能。
在HDFS中,每个小文件对象约占150byte,如果小文件过多会占用大量内存。这样NameNode内存容量严重制约了集群的扩展。
  
小文件问题的解决方案:
    从小文件产生的途径就可以从源头上控制小文件数量,方法如下:
使用Sequencefile作为表存储格式,不要用textfile,在一定程度上可以减少小文件;
减少reduce的数量(可以使用参数进行控制);
少用动态分区,用时记得按distribute by分区;

对于已有的小文件,我们可以通过以下几种方案解决:
使用hadoop archive命令把小文件进行归档;
重建表,建表时减少reduce数量;
通过参数进行调节,设置map/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 = 25610001000
//当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge。
set hive.merge.smallfiles.avgsize=16000000
4、SQL优化
1 列裁剪
  Hive在读数据的时候,可以只读取查询中所需要用到的列,而忽略其他列
SELECT a,b FROM q WHERE e<10;
2 分区裁剪
可以在查询的过程中减少不必要的分区。

yarn资源调优的几个参数:

准备知识
每个job提交到yarn执行的时候&#xff0c;都会分配container容器去运行&#xff0c;而这个容器需要资源才能运行&#xff0c;那这个资源就是cpu和内存&#xff0c;也就是每个任务container都需要CPU和内存&#xff0c;那么下面我们从CPU和内存去分析

CPU资源调度
目前的CPU被划分为虚拟CPU(CPU virtual Core)&#xff0c;这里的虚拟CPU是yarn自己引入的概念&#xff0c;因为每个服务器的CPU计算能力不一样&#xff0c;有的机器可能是其他机器计算能力的两倍&#xff0c;然后可以通过多配置几个虚拟CPU弥补差异。在yarn中&#xff0c;CPU的相关配置如下&#xff1a;

1.yarn.nodemanager.resource.cpu-vcores
表示该节点服务器上yarn可以使用的虚拟CPU个数&#xff0c;默认是8&#xff0c;推荐将值配置与物理核心个数相同&#xff0c;如果节点CPU核心不足8个&#xff0c;要调小这个值&#xff0c;yarn不会智能的去检测物理核心数

2.yarn.scheduler.minimum-allocation-vcores
单个任务最小可申请的虚拟核心数&#xff0c;默认为1

3.yarn.scheduler.maximum-allocation-vcores
单个任务最大可申请的虚拟核心水&#xff0c;默认为4&#xff0c;如果申请资源时&#xff0c;超过这个配置&#xff0c;会抛出InvalidResourceRequestException

Memory资源调度
yarn一般允许用户配置每个节点上可用的物理资源&#xff0c;注意&#xff0c;这里是"可用的"&#xff0c;不是物理内存多少&#xff0c;就设置多少&#xff0c;因为一个服务器节点上会有若干的内存&#xff0c;一部分给yarn&#xff0c;一部分给hdfs&#xff0c;一部分给hbase&#xff1b;Member相关的配置如下&#xff1a;

1.yarn.nodemanager.resource.memory-mb
设置该节点上yarn可使用的内存&#xff0c;默认为8G&#xff0c;如果节点内存资源不足8G&#xff0c;要减少这个值&#xff0c;yarn不会智能的去检测内存资源&#xff0c;一般这个设置yarn的可用内存资源

2.yarn.scheduler.minimum-allocation-mb
单个任务可申请的最少物理内存量&#xff0c;默认是1024&#xff08;MB&#xff09;&#xff0c;如果一个任务申请的物理内存量少于该值&#xff0c;则该对应的值改为这个数

3.yarn.scheduler.maximum-allocation-mb
单个任务最大申请物理内存量&#xff0c;默认为8291MB

4.yarn.nodemanager.vmem-pmem-ratio
任务每使用1MB物理内存&#xff0c;最多可使用虚拟内存量&#xff0c;默认是2.1。

5.yarn.nodemanager.pmem-check-enabled
是否启动一个线程检查每个任务正使用的物理内存量&#xff0c;如果任务超出分配值&#xff0c;则直接将其杀掉&#xff0c;默认是true。

6.yarn.nodemanager.vmem-check-enabled
是否启动一个线程检查每个任务正使用的虚拟内存量&#xff0c;如果任务超出分配值&#xff0c;则直接将其杀掉&#xff0c;默认是true。

案例
如果有一个服务器16核&#xff0c;64G内存&#xff0c;我们应该如何配置上面的6个参数呢&#xff08;一句话&#xff1a;资源最大化利用&#xff09;

yarn.nodemanager.resource.cpu-vcores 虚拟core
这个参数根据自己生产服务器决定&#xff0c;比如公司服务器很富裕&#xff0c;那就直接1:1&#xff0c;设置成16&#xff0c;如果公司服务器不是很富裕&#xff0c;
那就直接成1:2,设置成32&#xff0c;我们生产设置的是32

yarn.nodemanager.resource.memory-mb 单个服务器内存
生产上我们一般要预留15-20%的内存&#xff0c;那么可用内存就是64*0.8&#61;51.2G&#xff0c;我们设置成50G就可以了&#xff08;固定经验值&#xff09;

yarn.scheduler.minimum-allocation-mb 单任务最小内存
如果设置成2G&#xff0c;那50/2 &#61; 25&#xff0c;就是最多可以跑25个container
如果设置成3G&#xff0c;那50/3 &#61; 16&#xff0c;就是最多可以跑16个container

yarn.scheduler.minimum-allocation-mb 单任务最少vcore
如果设置vcore &#61; 1&#xff0c;那么32/1 &#61; 32&#xff0c;就是最多可以跑32个container&#xff0c;如果设置成这个&#xff0c;根据上面内存分配的情况&#xff0c;最多只能跑25个container&#xff0c;vcore有点浪费
如果设置vcore &#61; 2&#xff0c;那么32/2 &#61; 16&#xff0c;就是最多可以跑16个container

yarn.scheduler.maximum-allocation-vcores 单任务最多vcore
一般就设置成4个&#xff0c;cloudera公司做过性能测试&#xff0c;如果cpu大于等于5之后&#xff0c;cpu利用率反而不是很好&#xff08;固定经验值&#xff09;

yarn.scheduler.maximum-allocation-mb 单任务最大内存
这个要根据自己公司业务设定&#xff0c;如果有大任务&#xff0c;需要5-6G内存&#xff0c;那就设置为8G

yarn性能调优

1.1 RM的内存资源配置, 配置的是资源调度相关
RM1&#xff1a;yarn.scheduler.minimum-allocation-mb 分配给AM单个容器可申请的最小内存
RM2&#xff1a;yarn.scheduler.maximum-allocation-mb 分配给AM单个容器可申请的最大内存
注&#xff1a;

最小值可以计算一个节点最大Container数量
一旦设置&#xff0c;不可动态改变

1.2 NM的内存资源配置&#xff0c;配置的是硬件资源相关
NM1&#xff1a;yarn.nodemanager.resource.memory-mb 节点最大可用内存
NM2&#xff1a;yarn.nodemanager.vmem-pmem-ratio 虚拟内存率&#xff0c;默认2.1
注&#xff1a;

RM1、RM2的值均不能大于NM1的值
NM1可以计算节点最大最大Container数量&#xff0c;max(Container)&#61;NM1/RM1
一旦设置&#xff0c;不可动态改变

1.3 AM内存配置相关参数&#xff0c;配置的是任务相关
AM1&#xff1a;mapreduce.map.memory.mb 分配给map Container的内存大小
AM2&#xff1a;mapreduce.reduce.memory.mb 分配给reduce Container的内存大小

这两个值应该在RM1和RM2这两个值之间
AM2的值最好为AM1的两倍
这两个值可以在启动时改变
AM3&#xff1a;mapreduce.map.java.opts 运行map任务的jvm参数&#xff0c;如-Xmx&#xff0c;-Xms等选项
AM4&#xff1a;mapreduce.reduce.java.opts 运行reduce任务的jvm参数&#xff0c;如-Xmx&#xff0c;-Xms等选项
注&#xff1a;

这两个值应该在AM1和AM2之间

新建可以读取json格式的表
CREATE TABLE json_nested_test (
country string,
languages array,
religions map)
ROW FORMAT SERDE ‘org.openx.data.jsonserde.JsonSerDe’
STORED AS TEXTFILE;


推荐阅读
  • 本文介绍了一个误删Oracle数据文件导致数据库无法打开的问题,并提供了解决方式。解决方式包括切换到mount状态、离线删除报错的数据文件等。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • soatest新建db工具,执行sql语句的步骤和注意事项
    本文介绍了在soatest中新建db工具并执行sql语句的步骤和注意事项,包括设置数据库连接参数、使用配置文件的方法编写sql查询语句、增加oracle驱动连接jar包、运行测试用例以及查看查询结果。详细说明了每个步骤的操作和相关注意事项。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • OCI连接MySQL_PLSQL Developer连接远程数据库OCI客户端安装方法
    本文介绍了使用OCI客户端连接MySQL和PLSQL Developer连接远程数据库的安装方法,避免了在本地安装Oracle数据库或类似的开发套件的麻烦,同时解决了PLSQL Dev连接远程Oracle时的配置问题。 ... [详细]
  • JAVA调用存储过程CallableStatement对象的方法及使用示例
    本文介绍了使用JAVA调用存储过程CallableStatement对象的方法,包括创建CallableStatement对象、传入IN参数、注册OUT参数、传入INOUT参数、检索结果和OUT参数、处理NULL值等。通过示例代码演示了具体的调用过程。 ... [详细]
  • 我有一个带有H2数据库的springboot应用程序。该应用程序会在启动时引导数据库,为此,我在 ... [详细]
author-avatar
夜色的静逸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有