Hive .hiverc、严格模式、分桶、Metastore连接方式、内部表外部表选择

1、.hiverc

该文件作为一个隐藏文件,位于 $HIVE_HOME/bin/ 目录下
Hive在启动之前会先执行 .hiverc文件,一些常用的配置参数可以写到这里,比如一些常用的UDF及优先尝试本地模式等。
set hive.exec.mode.local.auto=true;

一些常用的可以写在 .hiverc文件的内容

#让hive尽量尝试local模式查询而不是mapred方式
set hive.exec.mode.local.auto=true;
#在命令行中显示当前数据库名
set hive.cli.print.current.db=true; 
#查询出来的结果显示列的名称
set hive.cli.print.header=true;
#启用分桶表
set hive.enforce.bucketing=true;
#压缩hive的中间结果
set hive.exec.compress.intermediate=true;
#对map端输出的内容使用BZip2编码/解码器,BZip2压缩速度较慢,hadoop自带,支持分割
set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec;
#压缩hive的输出
set hive.exec.compress.output=true;
#对hive中的MR输出内容使用BZip2编码/解码器
set mapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec;

2、严格模式

严格模式下,如果表的分区很多,数据量很大的情况下,能够避免产生很大的一个MR任务。比如,设置了
hive.mapred.mode=strict
那么在查询的where条件中如果没加分区字段限制,则Hive限制该查询任务不能执行

对于依赖于HDFS的系统如Hive、Hbase,不适合文件数过多,因为这样增加namenode的负担。并且,如Hive查询是启动MR任务,每个任务作为一个独立的JVM启动,如果文件数过多,那么一个文件对应一个任务,资源压力显而易见。

3、分桶

Hive分桶是对表数据更细粒度的一种划分,具体表现在根据某一列进行分桶,方式是对值进行hash并对分桶个数取余。更进一步的用桶组织数据的好处有

1)、提高大数据集的查询处理效率,最直接的表现是在两个表进行join时,如果数据是按照连接键进行分桶过的,那么Hive就可以直接在map-side执行join操作
当然限制条件肯定有:桶个数相同或者是整数倍的关系,为什么?因为只有这样Hive才能知道要到哪些桶中找到需要进行与本桶进行join的数据,有倍数关系存在,取余之后的对应关系确定,否则相同数据在不同分桶数的桶中的分布规则是不确定的
2)、方便取样,具体表现在处理大规模数据集时,使用一小部分数据集来做测试,验证查询逻辑等。

分桶方式

CLUSTERED BY (`grid`,  `imsi` ) INTO 100 BUCKETS 

4、Metastore Server 和 HiveServer2 两种服务

首先Metastore的概念,可以理解为元数据仓储,所有对Hive元数据和分区的访问都需要通过Metastore。

Metastore分为三个部分
metastore database 区分Local和Remote
metastore server 区分Local和Remote
metastore client

metastore server区分 local 和 remote 的方式即可看 metastore 服务和 Hive service( 看成是Driver等一起组成的hive服务)是否在同一进程中,在同一进程中,便是local。如果metastore Server独立一个进程,便是remote。

连接Metastore的几种方式

1)、在安装好Hive之后,默认使用内嵌的Derby库存储元数据,这种方式适合测试使用,比如通过shell访问,每开启一个 bin/hive 服务会内嵌一个 metastore 服务,所以这种方式很浪费资源。
2)、使用 mysql 等数据库存储 Hive 元数据,客户端直连Mysql数据库,这是一种常用的直连方式,mysql存在于单独的进程中,直连也就是不通过 Metastore Server,可运行多用户并行操作,但是每个客户端必须知道连接mysql的用户名和密码。
3)、通过thrift server连接元数据库,在hive服务和客户端之间建立一个Metastore Server服务,之后客户端通过metastore server与元数据库(Mysql)交互,可运行多用户并行操作。这样一来,就无需每个客户端都配置连接到Mysql的用户名和密码。

HiveServer2
HiveServer2 就是一个服务端接口,供客户端连接Hive提交查询并返回结果。HiveServer2 通过Thrift RPC实现。本质上是实现了一整套的JDBC接口,这么一来客户端就可以通过JDBC、ODBC、beeline的方式并发访问Hive。

5、内部表和外部表如何选择

内部表和外部表通常在使用上没有太大差别,内部表主要在元数据和表内容数据关联性更强,如果数据只是在hive中流转,业务场景简单,或者需要对表的任意操作保持元数据和表内容同步,就选择内部表。

如果需要保持较高的安全性,元数据和表内容分离或者需要使用到Spark、Mapreduce进行复杂操作然后再有Hive进行后续操作的场景,使用外部表。

发布了95 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43878293/article/details/105308215
今日推荐