- 3.1、Hive启动过程中报错
- 3.2、Hive的基础sql命令
- 3.3、Hive中的一些参数和命令(临时和永久生效)
- 3.4、Hive中的交互式命令(hive -e和hive -f)
- 3.5、Hive中的数据抽象概念
一、前情回顾
Hadoop:
狭义:单单指apache hadoop软件(最最重要基础的一个部分)
广义:Hadoop生态圈:Hadoop、Hive、Sqoop、HBase…
每一类的组件都是为了解决特定事情,比如Hive是做sql的分析引擎,生产上需要基于多个框架进行组合来实现业务场景。
如何快速定位问题?及如何快速的解决问题
比如在Hadoop中需要处理如下业务:join/group by ,
面向mapreduce编程,复杂度会非常的高,以wordcount进行举例如下:
- https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html
- 需要本地开发,测试,打包,扔到服务器运行;后期维护起来非常的麻烦
2.1、Hive产生背景(引出Schema)
===> Hive的产生背景
- 由于面向MapReduce编程非常麻烦:比如原来从事RDBMS关系型数据库的从业者,对于他们开发起来是非常费劲的:
所以这是基于Hadoop MapReduce处理大数据的弊端:
Schema信息:
- 对等的去到MySQL中理解就是 --> 关系型数据库中的表名、列名、列类型
- 在MySQL或者Oracle中,如果我们进行SQL的统计,肯定要先创建表,包括:表名、列名、列类型…
然后再使用SQL进行相应业务的统计分析
而对于HDFS上的文件,主要分为:txt文本格式,它不存在表名、列名、列类型;关于文本格式我们顶多能做的是按照分隔符(\t):来知道第一列是什么、第二列是什么
源数据 VS 元数据:
源数据:HDFS上的数据
元数据:是描述数据的数据,比如数据的表名,列名,列类型
2.2、初识Hive
Hive官网:hive.apache.org
官网对Hive的描述:
-
The Apache Hive data warehouse software facilitates(促进)
reading,
writing,
managing large datasets residing
in distributed storage(HDFS/S3)
using SQL. -
A command line tool
and JDBC driver are provided to connect users to Hive.
翻译:
- Hive是一个数据仓库,能够读、写、管理大的数据集在分布式文件系统上使用SQL
Hive框架的产生对于RDBMS的从业者来说是很大的福音,不管是Spark还是Flink,他们推的都是批处理流处理一体,两种框架相通所以学习起来会比较方便。
拓展:Hive是由Facebook开源,用于解决海量结构化日志的数据统计问题,是基于日志来进行各种维度的统计分析;Hive是构建在Hadoop之上的数据仓库。
1、Hive中的数据是存放在hdfs上;
2、Hive底层的执行引擎有MapReduce/Spark/Tez,只需要修改一个参数即可;
(hive (ruozedata_hive)> set hive.execution.engine;
hive.execution.engine=mr)
3、Hive的作业是提交到Yarn上运行的;
4、Hive提供了HiveQL的查询语言,这个语言和SQL类似,但是不完全相同。
面试题:HiveQL和SQL的关系?
- 答:除了语法类似,其它完全不同
大数据“云化”:基于关系型的数据库迁移到大数据平台中去,原有的SQL都需要进行梳理,更换平台要考虑语法兼容性,理解业务逻辑,再使用HiveQL或者Spark SQL进行完成,这是一个很大的项目。
Hive适用于离线处理/批处理(一下子处理一个批次的数据),实时处理/流处理;
至此:HDFS上的数据:文本、压缩、列式存储,Hive就是使用sql来处理hadoop上的数据。
SQL on Hadoop:Hive/Presto/Impala/Spark SQL,如果sql语法兼容不是很好的话,就需要你进行自定义UDF函数。
Hive的优缺点:
优点:SQL(处理方便,受众面广)
缺点:Hive的底层执行引擎是MapReduce的话,它的执行性能必然是不高的。
2.3、Hive的架构
如下这块是Hive自动为我们完成的:
-
一条SQL只是普通的不能再普通的字符串,它进入到Driver驱动程序,需要借助于SQL Parser(SQL解析器),把SQL的语法进行解析 --> Query Optimizer(查询优化器)–> Pyhsical Plan(逻辑执行计划)–> 如果语法不支持的话你需要自定义UDF函数 --> SerDes(序列化、反序列化)–> Execution(执行)。
-
一个table,是属于哪个DB,table默认存放在HDFS上的路径/user/hive/warehouse,table的字段信息 --> 存储在MetaStore,这些信息需要让MapReduce知道;红色这个框中的Metastore是非常重要的,元数据默认是存放在derby和MySQL中的,derby一般不用,使用MySQL,此处的MySQL也不能使用单点,单点故障就会出现停止服务,生产上都是使用MySQL主备机制。
对于上图的详细描述:
第一层是用户接口层:通过linux黑窗口、JDBC的方式
第二层是Driver驱动程序:
SQL解析:SQL --> AST(antlr抽象语法树)
查询优化:逻辑/物理执行计划
UDF/SerDes:
Execution:执行