4 | 史上最全大数据笔记-Hive(上)

第一章 Hive简介

1.1 Hive的简介

1.1.1 hive出现的原因

FaceBook网站每天产生海量的结构化日志数据,为了对这些数据进行管理,并且因为机器学习的需求,产生了hive这门技术,并继续发展成为一个成功的Apache项目。

1.1.2 什么是hive

hive是一个构建在Hadoop上的数据仓库工具(框架),可以将结构化的数据文件映射成一张数据表,并可以使用类sql的方式来对这样的数据文件进行读,写以及管理(包括元数据)。这套HIVE SQL 简称HQL。hive的执行引擎可以是MR、spark、tez。

如果执行引擎是MapReduce的话,hive会将Hql翻译成MR进行数据的计算。 用户可以使用命令行工具或JDBC驱动程序来连接到hive。

1.1.3 为什么使用hive

因为直接使用MapReduce,需要面临以下问题:

 - 人员学习成本高
 - 项目周期要求太短
 - MapReduce实现复杂查询逻辑开发难度大

1.1.4 hive的优缺点

1) hive的优点

 1.学习成本低
         提供了类SQL查询语言HQL(简单,容易上手),避免了直接写MapReduce(适合java语言不好的,sql熟练的人),减少开发人员的学习成本。
 2.可扩展性好
         为超大数据集设计了计算/扩展能力(MR作为计算引擎,HDFS作为存储系统),Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
 3.适合做离线分析处理(OLAP)
         Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。
 4.延展性好
         Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
 5.良好的容错性
         某个数据节点出现问题HQL仍可完成执行。
 6.统计管理

         提供了统一的元数据管理

2) hive的缺点

 1. hiveHQL表达能力有限
   - 迭代式算法无法表达,比如PageRank(网页排名)
   - 数据挖掘方面,比如kmeans(k均值聚类算法)
 2. hive的效率比较低
   - hive自动生成的mapreduce作业,通常情况下不够智能化
   - hive调优比较困难,粒度较粗

1.2 Hive架构和原理

1.2.1 hive的架构简介

Hive的体系结构分为以下几部分:

 1. 用户连接接口
         CLI:是指Shell命令行
         JDBC/ODBC:是指Hive的java实现,与传统数据库JDBC类似。
         WebUI:是指可通过浏览器访问Hive。
 2. thriftserver
         hive的可选组件,此组件是一个软件框架服务,允许客户端使用包括JavaC++Ruby和其他很多种语言,通过编程的方式远程访问Hive
 3. 元数据
         Hive将元数据存储在数据库中,如mysqlderbyHive中的元数据包括(表名、表所属的数据库名、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等)
 4. 驱动器(Driver)
   - 解析器(SQLParser):
                 HQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法
                 分析,比如表是否存在、字段是否存在、SQL语义是否有误。        
         - 编译器(Compiler)
                 hql语句进行词法、语法、语义的编译(需要跟元数据关联),编译完成后会生成一个执行计划。hive上就
                 是编译成mapreducejob
         - 优化器(Optimizer)
                 将执行计划进行优化,减少不必要的列、使用分区、使用索引等。优化job
         - 执行器(Executer):
                 将优化后的执行计划提交给hadoopyarn上执行。提交job
 5. hadoop
         Jobtrackerhadoop1.x中的组件,它的功能相当于:Resourcemanager+AppMaster
         TaskTracker相当于:Nodemanager  +  yarnchild
  
         Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成

注意:

- 包含*的全表查询,比如select * from table 不会生成MapRedcue任务
- 包含*的limit查询,比如select * from table limit 3 不会生成MapRedcue任务

1.2.2 Hive的工作原理

  1. 用户提交查询等任务给Driver
 2. 驱动程序将Hql发送编译器,检查语法和生成查询计划。
 3. 编译器Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。
 4. 编译器Compiler得到元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划(MapReduce, 最后选择最佳的策略。
 5. 将最终的计划提交给Driver。到此为止,查询解析和编译完成。
 6. Driver将计划Plan转交给ExecutionEngine去执行。
 7. 在内部,执行作业的过程是一个MapReduce工作。执行引擎发送作业给JobTracker,在名称节点并把它分配作业到TaskTracker,这是在数据节点。在这里,查询执行MapReduce工作。
 7.1 与此同时,在执行时,执行引擎可以通过Metastore执行元数据操作。
 8. 执行引擎接收来自数据节点的结果。
 9. 执行引擎发送这些结果值给驱动程序。
 10. 驱动程序将结果发送给Hive接口。
 

1.2.3 hive和hadoop的关系

 - hive本身其实没有多少功能,hive就相当于在hadoop上面包了一个壳子,就是对hadoop进行了一次封装。
 - hive的存储是基于hdfs/hbase的,hive的计算是基于mapreduce
 参考下图:

1.3 Hive与传统型数据库的区别

 1. Hive采用了类SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和数据库除了拥有类似的查询语言,再无类似之处。
 
 2. 数据库可以用在OLTP的应用中,但是Hive是为数据仓库而设计的,清楚这一点,有助于从应用角度理解Hive的特性。
 
 3. Hive不适合用于联机事务处理(OLTP),也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。Hive 的特点是可伸缩(在Hadoop 的集群上动态的添加设备),可扩展、容错、输入格式的松散耦合。Hive 的入口是DRIVER ,执行的SQL语句首先提交到DRIVER驱动,然后调COMPILER解释驱动,最终解释成MapReduce 任务执行,最后将结果返回。
 
 4. MapReduce 开发人员可以把自己写的 Mapper  Reducer 作为插件支持 Hive 做更复杂的数据分析。 它与关系型数据库的 SQL 略有不同,但支持了绝大多数的语句(如 DDLDML)以及常见的聚合函数、连接查询、条件查询等操作。

Hive和数据库的比较如下表:

比较项

关系数据库

Hive

ANSI SQL

支持

不完全支持

更新

UPDATE INSERT DELETE

INSERT OVERWRITE\ INTO TABLE

事务

支持

支持(部分支持)

模式

写模式

读模式

存储位置

块设备、本地文件系统

HDFS

延时

多表插入

不支持

支持

子查询

完全支持

只能用在From子句中

视图

Updatable

Read-only

可扩展性

数据规模

实时响应

毫秒级

秒级

Hive和Mysql的比较

 - mysql用自己的存储存储引擎,hive使用的hdfs来存储。
 - mysql使用自己的执行引擎,而hive使用的是mapreduce来执行。
 - mysql使用环境几乎没有限制,hive是基于hadoop的。
 - mysql的低延迟,hive是高延迟。
 - mysqlhandle的数据量较小,而hive的能handle数据量较大。
 - mysql的可扩展性较低,而hive的扩展性较高。
 - mysql的数据存储格式要求严格,而hive对数据格式不做严格要求。
 - mysql可以允许局部数据插入、更新、删除等,而hive不支持局部数据的操作。

第二章 Hive的安装部署

Hive常用的安装分三种,分别是内嵌模式、本地模式和远程模式。这里我们只讲本地模式。(注意:Hive会自动监测Hadoop的环境变量,如有就必须启动Hadoop)

先从本地上传Hive安装文件apache-hive-3.1.2-bin.tar.gz/root/software

2.1. 本地模式

 使用mysql替换derby进行元数据的存储,hive的相关进程都是在同一台机器上,即本地模式。mysql因为是独立的进程,所以mysql可以和hive在同一机器上,也可以在其他机器上。

说明:

通常使用关系型数据库来进行元数据存储(mysql、oracle等执行带jdbc驱动的数据库)

优点:支持多session

缺点:需要配置、还需要安装mysql等关系型数据库

2.1.1 配置安装mysql

安装包准备

 通过SSH工具,将MySQLRPM安装包上传到Linux ~/software 目录下。
 
 MySQLRPM安装包,可以在MySQL的官网下载,也可以直接使用课程提供的资料。 注意事项:
 - 在官网下载安装包的时候,注意版本号
 - mysql-8.0.26-1.el7.aarch64.rpm-bundle.tar
 - 这里的el7,表示适用于CentOS7的版本。注意,不要下载el6的。
 - aarch64: 这个表示arm版本的CentOS,如果是amd64架构的,可以选择x64。

安装前准备

 # CentOS7中,系统默认采用的数据库是mariadb,这个数据库与MySQL冲突!
 # 因此,在安装MySQL之前,需要先将其卸载!
 [root@hadoop01 ~]# rpm -qa | grep mariadb         # 查询是否已经安装了mariadb
 mariadb-libs-5.5.68-1.el7.aarch64             # 查询结果。如果没有这个结果,说明没有安装。
 ​
 # 强制卸载mariadb
 # --nodeps: 强制卸载,RPM卸载程序的时候,如果这个程序被其他的程序依赖,是无法卸载的。
 #  此时,就需要使用--nodeps,忽略依赖,强制卸载。
 # 下面的卸载命令中,卸载的包是上方查询到的包
 [root@hadoop01 ~]# rpm -e mariadb-libs-5.5.68-1.el7.aarch64 --nodeps

安装MySQL

 # 安装MySQL, 其实就需要安装 mysql-community-server, 但是它依赖其他的包
[root@hadoop01 mysql]# rpm -ivh mysql-community-common-8.0.26-1.el7.aarch64.rpm
[root@hadoop01 mysql]# rpm -ivh mysql-community-client-plugins-8.0.26-1.el7.aarch64.rpm
[root@hadoop01 mysql]# rpm -ivh mysql-community-libs-8.0.26-1.el7.aarch64.rpm
[root@hadoop01 mysql]# rpm -ivh mysql-community-libs-compat-8.0.26-1.el7.aarch64.rpm
[root@hadoop01 mysql]# rpm -ivh mysql-community-client-8.0.26-1.el7.aarch64.rpm
[root@hadoop01 mysql]# yum install -y net-tools
[root@hadoop01 mysql]# rpm -ivh mysql-community-server-8.0.26-1.el7.aarch64.rpm

启动MySQL的服务

 # 查看MySQL服务的运行状态
[root@hadoop01 ~]# systemctl status mysqld
# 如果MySQL服务没有开启,则开启
[root@hadoop01 ~]# systemctl start mysqld

登录到MySQL

 # 在第一次开启MySQL服务的时候,会自动生成一个随机的密码
[root@hadoop01 ~]# grep password /var/log/mysqld.log
# 到mysqld.log文件中查找 password
2020-12-16T07:47:14.117739Z 1 [Note] A temporary password is generated for root@localhost: pVLJs6&o(QQe
# 使用这个随机密码登录到MySQL
[root@hadoop01 ~]# mysql -u root -p pVLJs6&o(QQe
 # 这里用自己的密码登录

修改密码

# 1. 修改MySQL的密码策略(安全等级)
# MySQL默认的密码安全等级有点高,在设置密码的时候,必须同时包含大小写字母、数字、特殊字符,以及对位数有要求
show variables like '%validate_password%';
set global validate_password.policy=LOW;
set global validate_password.length=4;
set global validate_password.mixed_case_count=0;
set global validate_password.number_count=0;
set global validate_password.special_char_count=0;
# 2. 修改密码
alter user root@localhost identified by '123456';
# 3. 远程授权
create user root@'%' identified by '123456';
grant all privileges on *.* to 'root'@'%' with grant option;

重新登录

试着退出MySQL,用新的密码重新登录。如果可以登录成功,那么MySQL的安装就到此结束!
MySQL在安装完成后,是不需要配置环境变量的。因为RPM的安装特性,启动脚本会被放到/usr/bin下。这个路径本来 就在环境变量里面,不需要单独配置。

2.2.2 配置hive的环境

1、解压并配置环境变量

2、配置hive的配置文件 cp hive-env.sh.template hive-env.sh vi hive-env.sh(可以配置jdk、hive的conf路径)

3、在Hive的conf配置hive的自定义配置文件 vi hive-site.xml:添加如下内容

注意:前三步和内嵌模式一样

4、找到下面四个属性进行修改对应的值。

<!--配置mysql的连接字符串-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop03:3306/hive?createDatabaseIfNotExist=true&characterEncoding=latin1</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<!--配置mysql的连接驱动-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<!--配置登录mysql的用户-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<!--配置登录mysql的密码-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>password to use against metastore database</description>
</property>

注意:hive的元数据在mysql库里创建的数据库hive的编码最好设置成latin1

show variables like 'character%';

5、将mysql的驱动包mysql-connector-java-8.0.26.jar上传到$HIVE_HOME/lib下(注意:驱动是jar结尾,不是tar结尾)

6、执行执行先要初始化数据库

[root@hadoop01 hive]# bin/schematool -initSchema -dbType mysql

7、启动hive

[root@hadoop01 hive]# bin/hive

说明: hive命令会默认启动元数据服务项(metastore)

至此hive的简介和安装完结

建议收藏!

正在更新hive的基本操作和表类型!

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值