前言:数据时代,大数据可能会成为每个rd的基本功,甚至ai也会是基本功。hive的使用作为入门大数据乃至ai第一步还是不错的。hive涉及内容较多,不能保证大家一听就会,就全面掌握,但尽量做到大家听了后会对一些概念有一定了解,或者说当某种情境下用到hive的某个方面的时候,你知道有这么个相关概念或知识点或需要注意的地方。
一、绕不开的hadoop简介
狭义上说,Hadoop指是一个开发和运行处理大规模数据的软件平台,它的核心组件有:
HDFS(分布式文件系统):解决海量数据存储
YARN(作业调度和集群资源管理的框架):解决资源任务调度
MAPREDUCE(分布式运算编程框架):解决海量数据计算
广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈。
例如:
HBASE:基于HADOOP的分布式海量数据库
ZOOKEEPER:分布式协调服务基础组件,负载均衡,ha(高可用,选举机制)
Mahout:基于mapreduce/spark/flink等分布式运算框架的机器学习算法库
OOZIE:工作流调度框架
Sqoop:数据导入导出工具(比如用于mysql和HDFS之间)
FLUME:日志数据采集框架
IMPALA:基于hive的实时sql查询分析
druid:大数据量olap神器,时序性数据库,预聚合,空间换时间, 用到hdfs等
kylin:大数据量olap神器,时序性数据库,预聚合,用到hdfs、hbase等
二、hive简介
Hive是一个数据仓库基础工具,在Hadoop中用来处理结构化数据。它架构在Hadoop之上,总归为大数据,并使得查询和分析方便,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
Hive 构建在基于静态批处理的Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 并不能够在大规模数据集上实现低延迟快速的查询,例如,Hive 在几百MB 的数据集上执行查询一般有分钟级的时间延迟。因此,Hive 并不适合那些需要低延迟的应用,例如,联机事务处理(OLTP)。Hive 查询操作过程严格遵守Hadoop MapReduce 的作业执行模型,Hive 将用户的HiveQL 语句通过解释器转换为MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。
hive与hdfs的关系:
hive是将hdfs上的文件映射成table,同时支持用户运用类sql即hql对hdfs文件进行操作。
类似我们在服务器上对日志文件进行处理,我们会写一个shell,对日志进行分列并赋给变量,然后对某一列数据进行累加、去重等处理。
在这里日志文件就类似于hdfs系统,hdfs是有实际存储真实待查询数据能力的,而shell中对日志进行分列并赋给变量的过程类似于hive建表的过程,最后对某一列数据进行累加、去重等处理则类似于用hivesql对hive表的操作。
hdfs的主要结构:
NameNode负责管理整个文件系统的元数据,使用 Master-Slave 模式(zk ha的使用按理之一),防止 NameNode 成为单点故障。
DataNode 负责管理用户的文件数据块,听从NameNode指挥。
hive表相关概念介绍:
1、hive表的存储格式
- textFile textFile为默认格式,存储方式:行存储
缺点:磁盘开销大;数据解析开销大;压缩的text文件,hive无法进行合并和拆分
- sequencefile 二进制文件,以<key,value>的形式序列化到文件中,存储方式:行存储
优点:可分割、压缩,一般选择block压缩,与hadoop api中的mapfile是互相兼容的。
- Rcfile 存储方式:数据按行分块 每块按照列存储,压缩快 快速列存取,读记录尽量涉及到的block最少,读取需要的列只需要读取每个row group 的头部定义。
读取全量数据的操作 性能可能比sequencefile没有明显的优势
- ORC
存储方式:数据按行分块 每块按照列存储,压缩快 快速列存取
效率比rcfile高,是rcfile的改良版本
官网介绍:
1 |
|
ORC实际上是在RC文件存储格式做了一些优化,它的主要优点有:
(1)、每个task只输出单个文件,这样可以减少NameNode的负载;
(2)、支持各种复杂的数据类型,比如: datetime, decimal, 以及一些复杂类型(struct, list, map, and union);
(3)、在文件中存储了一些轻量级的索引数据;
(4)、基于数据类型的块模式压缩:a、integer类型的列用行程长度编码(run-length encoding);b、String类型的列用字典编码(dictionary encoding);
(5)、用多个互相独立的RecordReaders并行读相同的文件;
(6)、无需扫描markers就可以分割文件;
(7)、绑定读写所需要的内存;
(8)、metadata的存储是用 Protocol Buffers的,所以它支持添加和删除一些列。
- 自定义格式
用户可以通过实现inoutformat和outputformat来定义输入输出格式。
2、分区hive表与非分区hive表(扩展说明:分桶表)
分区数据通常用于水平分布负载,这具有性能优势,并有助于以逻辑方式组织数据。分区表可以有多个分区字段,常用的依据时间、产品线进行联合分区。
非分区表一般用作存储一些静态数据。
分桶表 依据有真实含义的列进行hash取模分桶,Hive 在处理有些查询时能利用这个结构,例如join。
3、外表与内表
未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);内部表数据由Hive自身管理,外部表数据由HDFS管理;删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
三、hivesql(HQL)如何工作
需要对Hive的架构有些了解,
#上图描述了Hive和Hadoop之间的工作流程,下面是Hive和Hadoop框架的交互方式:
Hive和Hadoop框架的交互方式:
-
Execute Query。Hive接口,如命令行或Web UI发送查询驱动程序(任何数据库驱动程序,如JDBC,ODBC等)来执行。
-
Get Plan。在驱动程序帮助下查询编译器,分析查询检查语法和查询计划或查询的要求。
-
Get Metadata。编译器发送元数据请求到Metastore(支持MySQL,Postgres,Oracle,MS SQL Server这四种数据库,市面通用mysql)。
-
Send Metadata。Metastore发送元数据,以编译器的响应。
-
Send Plan。编译器检查要求,并重新发送计划给驱动程序。到此为止,查询解析和编译完成。
-
Execute Plan。驱动程序发送的执行计划到执行引擎。
-
Execute Job。在内部,执行作业的过程是一个MapReduce工作。执行引擎发送作业给JobTracker,在名称节点并把它分配作业到TaskTracker,这是在数据节点。在这里,查询执行MapReduce工作。(7.1 Metadata Ops:与此同时,在执行时,执行引擎可以通过Metastore执行元数据操作。)
-
Fetch Result. 执行引擎接收来自数据节点的结果。
-
Send Results. 执行引擎发送这些结果值给驱动程序。
-
Send Results。驱动程序将结果发送给Hive接口。
MapReduce简介:
stage划分:
在生成map-reduce任务时,Hive深度优先方式遍历Operator tree(操作符树),遇到第一个reduceSink操作符时,该操作符之前的操作符便划分到一个map-reduce任务的Map任务中,然后该reduceSink到下一个
reduceSink操作符之间的部分划分为map-reduce任务的Reduce任务。
一个完整的MapReduce阶段代表一个stage。当然Hive中还有非MapReduce的stage(例如:explain select * from t limit 1),在MapReduce为计算框架时,基本以MapReduce的stage为主,我们这里也只谈论这一stage。
由于Hive使用MapReduce计算引擎时无法直接使用不同阶段的结果。因此,每个阶段完成之后的结果都要输出到临时目录,供下一阶段读取,因此便将整个操作符图分解成不同的stage。
https://www.cnblogs.com/NightPxy/p/9230253.html(几种explain)
四、数梦的使用
bigdata和数梦定位的不同: bigdata滴滴数据平台,数梦属于开发加工平台
任务类型:手动任务、周期任务
任务流程:创建-保存-发布-执行
报警机制:配置报警规则及接警人。
tag(特殊情况:sparkjar、多表写入、多任务写一个表)、success与上下游依赖关系。
同步中心同步任务-多种途径2hive
五、hive增删改查及常用函数与udf
https://blog.csdn.net/wxfghy/article/details/80677785
六、HQL注意事项
1、小文件灾难
文件数是一个重要指标,文件数与namenode资源损耗正相关,同时与下游执行任务的执行快慢相关。不合理的reduce数目会造成小文件灾难。
2、数据倾斜
表现:
任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大。单一reduce的记录数与平均记录数差异过大,通常可能达到3倍甚至更多。 最长时长远大于平均时长。
原因:key分布不均匀
业务数据本身的特性
建表时考虑不周
某些SQL语句本身就有数据倾斜
解决办法:
参数调整 map阶段进行简单聚合 set hive.map.aggr=true
不均匀key值处理(key值加上前后缀)
3、mapreduce数量管理与执行时长的关系
大型任务调优过程,看当前任务explain,并观察每一个stage中mr分别的数量及耗时情况,判断是否出现1、2中的情况,出现需要解决。再写出可替换sql,执行以上步骤。对比各自耗时情况,选择最优sql。
4、常用参数配置及调整优化。
https://blog.csdn.net/tyhawk/article/details/88863754
七、扩展项
数梦代理 :如何配置大数据集群代理?
基于presto对hive表进行快速查询。02 Presto用户手册
./presto --server 10.82.128.62:8080 --catalog hive --user=prod_supervision --password=???
Presto 基于内存的并行计算,Facebook推出的分布式SQL交互式查询引擎 多个节点管道式执行
支持任意数据源 数据规模GB~PB 是一种Massively parallel processing(mpp)(大规模并行处理)模型
数据规模PB 不是把PB数据放到内存,只是在计算中拿出一部分放在内存、计算、抛出、再拿 。
spark与hive的关系。 spark进行更多借助于内存对hive进行读取计算。
存储量 传统与ec https://blog.csdn.net/weixin_42486226/article/details/99581136
hive未来 作为存储组件拥有不会动摇的地位,作为查询工具来说,已经在慢慢被替代。spark、presto都是由于人类受不了hivesql(mapreduce)的执行效率而被发明出来的,实质是更多地依赖内存和一些技巧。
八、答疑
OLTP:on-linetransactionprocessing 对数据的增删改查等操作,主要用于传统的关系数据库。
OLAP:On-LineAnalyticalProcessing 数据按不同维度的聚合,维度的下钻,上卷等,主要用于数据仓库。
以上内容存在引用,如有侵权请联系本人。