Hive知识点总结

hive与mysql的区别

回答思路:hive背景(原理、本质)–>两者操作、本质的差别–>读写差别–>其它差别。

Hive的诞生背景:学mysql的也想入门大数据,但又不会java,于是hive就诞生了。Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表。本质是将HQL语句转化为MR程序。

hive总体来说操作等方面和MySQL没有太大差别。但是本质却有差别,Hive注重联机分析的处理,mysql注重事务的处理。Hive注重的是分析,mysql注重的是处理。

MySQL在写的时候检查字段,hive在读的时候检查字段。所以在新增数据时,hive比较快,只需要直接load就行,而MySQL需要先检查字段。

hive与mysql的其它差别如下:

  1. 数据存储位置:Hive 的数据都是存储在 HDFS 中的。而数据库则可以将数据保存在块设备或者本地文件系统中。
  2. 执行:Hive 中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的。而数据库通常有自己的执行引擎。
  3. 执行延迟:hive高延迟,mysql低延迟。
  4. 可扩展性:hive的可扩展性高,而数据库由于ACID语义限制,扩展性有限。
  5. 数据规模:hive可以支持很大规模的数据,数据库可以支持的数据规模较小。

hive内部表和外部表

内部表和外部表的区别

未被external修饰的是内部表(managed table),被external修饰的为外部表(external table)。

区别:

  • 内部表数据由Hive自身管理,外部表数据由HDFS管理。
  • 删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除。
  • 对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)

内部表和外部表的转换

alter table t_newuser set TBLPROPERTIES(‘EXTERNAL’=‘TRUE’); ###true一定要大写
alter table t_newuser set TBLPROPERTIES(‘EXTERNAL’=‘false’); ###false大小写都没关系

hive分区的三种类型

  • 静态分区:加载数据的时候指定分区的值。
  • 动态分区:数据未知,根据分区的值确定创建分区。
  • 混合分区:静态加动态。

hive的存储格式

  • Textfile未经过压缩的。
  • Sequencefile:hive为用户提供的二进制存储,本身就压缩,不能使用load方式加载数据。
  • Rcfile:hive提供的行列混合存储,hive在该格式下,会尽量将附近的行和列的块存储到一起,仍然是压缩格式,查询效率比较高。
  • Orc是rcfile的升级版本。
  • Parquet列式存储。

    hive窗口函数

  • FIRST_VALUE:取分组内排序后,截止到当前行,第一个值 。

  • LAST_VALUE: 取分组内排序后,截止到当前行,最后一个值 。
  • LEAD(col,n,DEFAULT) :用于统计窗口内往下第n行值。第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL) 。
  • LAG(col,n,DEFAULT) :与lead相反,用于统计窗口内往上第n行值。第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)。

hive的4种排序方式

  1. order by全局排序。全部数据划分到一个reduce上。与sql中的order by类似,不同的是,hive中的order by在严格模式下,必须跟limit。
  2. sort by 每个mapreduce内部排序。
  3. distributed by分区排序,与sql中的group by类似,常与sort by组合使用,distributed by控制map的输出在reduce中如何划分,sort by控制reduce中的数据如何排序。hive要求distributed by语句出现在sort by语句之前。
  4. cluster by,当distributed by与sort by字段相同,可以用cluster by代替该组合,但cluster by 不能跟desc,asc。补充:可以这样书写select a.* from (select * from test cluster by id ) a order by a.id;

hive调优方式

  1. Fetch抓取:把不需要MR任务计算的查询语句设置成不执行MR任务。三个参数,none表示禁用Fetch,所有查询都执行MR任务;more在进行select/filter/limit查询时不会运行MR任务;minimal在select/limit的时候不会运行MR任务,但是filter会运行MR任务。
    hive.fetch.task.conversion

  2. 本地模式:让输入的数据量特别小的任务直接在本地节点上进行处理,而不提交到集群。本地模式通过判断文件的大小(默认128MB)和已输入文件的个数(默认4个)来判断是否在本地执行。
    set hive.exec.mode.local.auto=true; //开启本地 mr
    set hive.exec.mode.local.auto.inputbytes.max=50000000;
    set hive.exec.mode.local.auto.input.files.max=10;

  3. 表的优化:优化手段有join、行列过滤、分区、分桶、动态分区等等。

  4. 避免数据倾斜:通过合理设置map和reduce数、小文件合并等方式尽量保证负载均衡。或为了避免因为map或reduce任务卡死导致数据倾斜,通常也设置推测执行。

  5. 推测执行:为了避免因为程序的BUG/负载不均衡/资源分布不均等原因导致同一作业中某一任务运行速度过慢,设置推测执行,为该任务启动一个备份任务,同时执行,最先运行完成的计算结果作为最终结果。分为map端和reduce端的推测执行。
    set mapreduce.map.speculative=true
    set mapreduce.reduce.speculative=true

  6. 并行执行:把没有依赖关系的MR任务设置为并行执行,提高多任务运行时的效率。
    set hive.exec.parallel=true ; // 开启任务并行执行
    set hive.exec.parallel.thread.number=8; //默认值为8个任务可以同时运行

  7. 严格模式:为了防止一些不正常的查询语句的执行。
    hive.mapred.mode= strict

  8. JVM重用:当有很多小文件的时候,每次运行MR任务都会开启一个JVM进程,JVM频繁的开启关闭消耗大量的性能,所以在处理小文件的时候,可以设置JVM重用,让一个JVM处理多个任务后再关闭。
    mapreduce.job.jvm.numtasks

  9. 压缩:通过压缩对项目进行优化。例如开启 map 输出阶段压缩可以减少 job 中 map 和 Reduce task 间数据传输量。

  10. 执行计划:Hive中提供的可以查看Hql语句的执行计划,在执行计划中会生成抽象语法树,在语法树中会显示HQL语句之间的依赖关系以及执行过程。通过这些执行的过程和依赖可以对HQL语句进行优化。

------ 本文结束感谢您的阅读 ------
坚持原创技术分享,您的支持将鼓励我继续创作!