黑马-hive学习笔记(1)
一、hadoop介绍
1.hadoop定义
是一个分布式的大数据平台,这个平台上会有很多的组件,HDFS,Mapreduce,hive都是它生态的一部分,HDFS是一个数据存储系统,Mapreduce是一个计算引擎,hive是一个数据仓库
2.Hadoop集群
Hadoop集群是一种分布式大数据存储和处理系统,主要由Hadoop文件系统(HDFS)和Hadoop资源管理器(YARN)组成,同时还常配合一些其他的大数据组件一起使用,例如MapReduce作业框架、Hive SQL查询引擎等。
组件介绍:
1). HDFS
定义:一种分布式文件系统,负责在整个集群中存储大数据。HDFS将一个大文件切分成多个数据块,然后分配到集群的各个节点上进行存储,同时还会保存数据的副本,以防数据丢失。
主要的服务:(1)NameNode(主):是HDFS中的主服务器,负责管理HDFS的元数据,包括文件目录树的维护,以及文件和数据块之间的映射关系。NameNode记录在哪些DataNode上存储了文件的哪些数据块,并处理来自客户端的文件访问请求。 (2)DataNode(从,每个结点都有):在HDFS中,一个集群的每个节点都会运行一个DataNode服务。这些DataNode负责在本地文件系统中存储和检索数据块,以及处理在这些数据块上的读写请求。同时,DataNode还需要定期的向NameNode报告其上存储的所有数据块信息。
HDFS Web界面的应用:
访问`http://<NameNode地址>:50070`可以查看HDFS的Web界面。其中`<namenode-hostname>`是HDFS NameNode的主机名或IP地址,`50070`是HDFS NameNode Web界面的默认端口(这个端口也可以在Hadoop的配置文件中进行设置,所以实际使用时可能会有所不同)。
在这个界面中,包含了HDFS集群的总体状态,比如文件系统的目录树、存储速率、存储占用和空闲情况等,还能看到各个DataNode的状态和健康状况,以及它们所存储的数据块信息。
这些Web界面基本上是只读的,你可以使用它们来查看集群的状态,但不能用它们来提交作业或操作文件系统。这些任务通常通过命令行或程序接口来完成。
2). YARN
定义:Hadoop的资源管理和任务调度组件。YARN负责管理集群中的CPU、内存等资源,并负责安排并发的作业和任务运行。
主要的服务:(1)ResourceManager(主):是Hadoop的YARN组件中的核心服务,负责整个集群的资源管理和任务调度。ResourceManager根据应用的资源需求(CPU,内存等)来分配资源,并决定任务在哪个NodeManager上运行。 (2)NodeManager(从,每个结点都有):是Hadoop的YARN组件中运行在每个节点的服务。每个NodeManager负责管理其所在节点的资源,并定期向ResourceManager汇报节点的资源使用情况。同时,NodeManager会执行ResourceManager分派的任务,并报告任务运行状态。
YARN web界面的应用:
访问`http://<ResourceManager地址>:8088`可以查看YARN的Web界面。其中`<ResourceManager的地址>`是你的ResourceManager的主机名或者IP地址,`8088`是Yarn的默认web界面端口号。
在Yarn的web界面中,一般可以查看到集群中运行的、已完成的、失败的和挂起的应用程序(Application)信息,以及每个NodeManager节点的状态,以及集群的详细的资源使用情况。
这些Web界面基本上是只读的,你可以使用它们来查看集群的状态,但不能用它们来提交作业或操作文件系统。这些任务通常通过命令行或程序接口来完成。
二、Hive的运行机制
每一个数据仓库都有两种功能,存储数据和处理数据。但是hive比较聪明,它利用HDFS存储数据,利用MapReduce查询分且析数据。那么 hive本身 承担了什么角色呢?用户写完sql之后,hive需要针对sql进行语法校验,并根据记录的元数据信息解读sql背后的含义,制定执行计划。并且把执行计划转换成MapReduce程序来执行,把执行的结果封装返回给用户,相当于是起到了一个sql语句检验-转化-返回结果这么一个作用。下图可以看作是用户使用hive的全流程:对于用户来说,只需要涉及到步骤12;但是对于hive本身来说,整个的流程都需要参与。

三.hive的架构图
从上到下依次为
用户接口(也叫做客户端):包括 CLI(shell命令行)、JDBC/ODBC(Hive中的Thrift服务器允许外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议)、WebGUI(浏览器访问)。
元数据存储:通常是存储在关系数据库如 mysql/derby中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
Driver驱动程序,包括语法解析器、计划编译器、优化器、执行器:完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有执行引擎调用执行。
执行引擎:Hive本身并不直接处理数据文件。而是通过执行引擎处理。当下Hive支持MapReduce、Tez、Spark3种执行引擎。

四.元数据相关的概念
元数据(Metadata):元数据包含用Hive创建的database、table、表的位置、类型、属性,字段顺序类型等元信息。元数据存储在关系型数据库中。如hive内置的Derby、或者第三方如MySQL等。
元数据服务(Metastore):Metastore服务的作用是管理metadata元数据,并且对外暴露服务地址,让各种客户端通过连接metastore服务,由metastore再去连接MySQL数据库来存取元数据(metastore服务将通过JDBC与metastore数据库进行通信)。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可,可以保证了hive元数据的安全。

元数据服务(Metastore)的3种配置方式
说明:元数据服务的3种配置方式会决定hive的3种安装方式

(1)内嵌模式:元数据存储在hive内置的Derby数据库,并且Derby数据库和metastore服务都嵌入在主HiveServer进程中,当启动HiveServer进程时,Derby和metastore都会启动。不需要额外起Metastore服务。但是一次只能支持一个活动用户,所以只适合测试环境

(2)本地模式:Hive Metastore服务与主HiveServer进程在同一进程中运行,但是存储元数据的数据库在单独的进程中运行,并且可以在单独的主机上。metastore服务将通过JDBC与metastore数据库进行通信。hive根据hive.metastore.uris 参数值来判断,如果为空,则为本地模式;远程模式下就需要配置参数

(3) 远程模式:Metastore服务在其自己的单独JVM上运行,而不在HiveServer的JVM中运行。远程模式需要配置hive.metastore.uris 参数来指定metastore服务运行的机器ip和端口(元数据服务可能在其他的机器上,如果我们想要访问,就必须在自己电脑hive的配置文件上来指定元数据服务的相关地址),并且需要单独手动启动metastore服务。

五 、Hive客户端的使用
说明:hive有两代客户端,3种安装方式,总共有6种使用情况,这6种情况的配置方式和软件运行进程都不一样
(1)hive客户端和hive服务关系图

(2)两代客户端
Hive Client(第一代客户端):
位置:$HIVE_HOME/bin/hive;
功能:运行Hive查询;用于Hive相关服务的启动,比如metastore服务
使用方法:
1)内嵌模式:
配置内容:不需要进行任何配置;
运行方式:直接运行bin/hive,Derby和metastore元数据服务会内嵌一起启动
2)本地模式:
配置内容:在hive的配置文件Hive-site.xml中配置元数据数据库(MySQL)相关信息(目的让hive知道元数据保存在哪儿&怎么连接等问题)
运行方式:直接运行bin/hive,metastore元数据服务会内嵌一起启动。
3)远程模式:
配置内容:在hive的配置文件Hive-site.xml中 1)配置元数据数据库(MySQL)相关信息;2)部署metastore 服务
运行方式:1)手动启动运行metastore服务;2)运行bin/hive
Hive Beeline Client(第二代客户端):
位置:$HIVE_HOME/bin/beeline
使用方法:
1)内嵌模式:不需要进行任何配置;
运行方式:直接运行bin/beeline
2)本地模式:
配置内容:在hive的配置文件Hive-site.xml中配置元数据数据库(MySQL)相关信息(目的让hive知道元数据保存在哪儿&怎么连接等问题)
运行方式:直接运行bin/beeline,metastore元数据服务会内嵌一起启动。
问题:使用Beeline客户端在嵌入式模式下,需要连接HiveServer2 服务吗?
答:不需要。当在嵌入式模式下通过Beeline客户端运行时,我们的JVM同时也是Hive的服务端,因此无需连接HiveServer2服务。具体而言,嵌入式模式下的Hive是直接在本地JVM中运行,不通过Thrift协议与HiveServer2进行通信。
3)远程模式:
配置内容:在hive的配置文件Hive-site.xml中 1)配置元数据数据库(MySQL)相关信息;2)部署metastore 服务
运行方式:1)手动启动运行metastore服务;2)然后启动hiveserver2服务(hiveserver2服务启动之后需要稍等一会才可以对外提供服务);3)运行bin/beeline:这里有2种情况,一种是在本机器上运行,直接运行bin/beeline就可以;一种是在其他的机器上使用hive客户端,这时候就需要知道hiveserver2协议的地址,在命令行中直接指定HiveServer2的地址和端口,然后才可以成功运行
(3)关于客户端连接Hive的一些问题
问题1:hive远程模式下,使用beeline客户端,需要每次都手动运行metastore服务和hiveserver2服务吗?
答:在生产环境中,这两个服务通常都会配置为在系统启动时自动启动,而不需要手动启动。这是因为在生产环境中,通常有多个用户或应用同时使用Hive,所以需要Hive Metastore服务和HiveServer2服务始终可用。 只需要在首次部署Hive时启动这两个服务,或在服务需要进行维护或升级后重启服务就可以了。
问题2:hive远程模式下,当hiveserver2在其他机器上的时候,每次使用beeline客户端都需要重新连接hiveserver2吗?
答:当HiveServer2服务在其他机器上运行时,每次使用Beeline客户端都需要建立到HiveServer2的连接。但是,一旦连接建立成功后,在同一次使用期间,就可以多次利用这个连接执行查询操作,直到你显式断开连接或者退出Beeline。
问题3:hive远程模式下,客户端、元数据服务、元数据存储可以放在不同的机器上吗?
答:是的,Hive的远程模式下,客户端、元数据服务(Hive Metastore)和元数据存储(如MySQL、PostgreSQL等数据库)可以部署在不同的机器上。 具体来说,客户端(如Beeline、Hive CLI等)可以部署在用户的本地机器上,它通过网络连接到运行在远程服务器上的HiveServer2服务。HiveServer2服务在接收到来自客户端的请求后,会与运行在另一台或者同一台服务器上的Hive Metastore服务通信,获取执行查询所需的元数据信息。元数据服务则连接到元数据存储,元数据存储可以是部署在本地或者远程的数据库服务器。
六、Hive初体验
1.hive使用起来和mysql差不多吗?
按照以下流程来做:
create database dsb;--创建数据库
show databases;--列出所有数据库
use dsb;--切换数据库
create table t_student(id int,name varchar(255));--建表
insert into table t_student values(1,"allen");--插入一条数据
select * from t_student;--查询表数据
做完之后会发现,以上代码在hive中都可以实现;但是,在插入数据的时候会非常非常的慢,hive作为大数据仓库,不可能这样一条条的插入数据,他有自己插入数据的办法——映射结构性文件。
web界面的应用:
YARN Web UI: http://resourcemanager_host:8088/

当使用代码执行操作时,可以打开YARN(负责资源调度) Web界面观察相关操作的进程,完成与失败的情况;
HDFS Web UI: http://namenode_host:9870/

当你创建一个数据库时,Hive 将在 HDFS 的某个位置创建一个对应的目录来存储表和相关的数据。可以登录HDFS Web界面查看相关的文件结构和文件信息;
问题1:如何查找数据库的位置?
答: DESCRIBE DATABASE database_name(注释:数据库的名称);
问题2:如何查找数据表的位置?
答:USE database_name(注释:数据库的名称);
DESCRIBE FORMATTED table_name(注释:数据表的名称);
问题3:hive中数据库和数据表在hdfs的默认存储路径在哪儿?
答:默认情况下,Hive 在 HDFS 的 `/user/hive/warehouse` 目录下创建数据库和表。例如,如果你有一个叫做 `mydatabase` 的数据库和一个叫做 `mytable` 的表,那么这个表在 HDFS 中的默认位置就是 `/user/hive/warehouse/mydatabase.db/mytable`。
一般来说,我们新建的数据库和表都会在HDFS系统一级目录user(user这个文件夹是HDFS特有的,在本地的Windows系统是找不到的,学习hive的时候,只要是路径,直接在hdfs里面找就行,不要在本地文件系统找,找不到的)下面,如果想要新增一级目录,大概率是没有相关权限的
问题4:什么叫绝对路径?
答:例如,在 Unix 或 Linux 系统中,`/home/user/documents/rep ort.txt` 是 report.txt 文件的绝对路径,它描述了从根目录 `(/)` 开始,通过各级子目录(`home`、`user`、`documents`)来访问文件。 在 Windows 系统中,绝对路径可能看起来像这样:`C:\Users\Username\Documents\report.txt`
问题5:HDFS的根目录是什么?如何查看HDFS的根目录下所有的文件?
答:在 Hadoop 文件系统(HDFS)中,根目录用斜杠(`/`)表示。要查看 HDFS 的根目录下的所有文件和文件夹,必须在 Hadoop 命令行工具中运行以下命令:hadoop fs -ls / 或者 hdfs dfs -ls / ,这个命令将列出 HDFS 根目录下的所有文件和文件夹。如果你想列出一个特定目录下所有的文件与目录,你只需要将路径更改为你想查看的目录。例如,如果你想查看"/user/hadoop"目录下的所有文件,你可以运行: `hdfs dfs -ls /user/hadoop`。
请注意,这些命令需要在Hadoop环境中运行,而非Hive环境。
2.hive中如何映射成功表?
注意:以下步骤是将Windows中的txt文件上传到hdfs指定的文件夹中
(1)在windows本地创建一个txt文件,名字叫 user.txt
|
1,zhangsan,18,beijing 2,lisi,25,shanghai 3,allen,30,shanghai 4,woon,15,nanjing 5,james,45,hangzhou 6,tony,26,beijing |
(2)在hive中创建一张表t_user,这个时候在hdfs上面就会对应的生成一个文件夹,但是因为还没有上传文件,所以它还是空的。注意:字段的类型顺序要和文件中字段保持一致,还需要指定文件中字段之间的分隔符,如果不指定分割符,hive虽然可以感知文件的存在,但是却无法识别。
--建表语句 增加分隔符指定语句
create table t_user_1(id int,name varchar(255),age int,city varchar(255)) |
(3) 需要把txt文件上传到hdfs表对应的文件夹下面:
方式1:首先打开命令行工具,将目录切换到你的txt文件所在的目录。然后,使用下面的语法上传文件: `hadoop fs -put localfile.txt /path/in/hdfs`,这里,“localfile.txt”是你要上传的文本文件,而“/path/in/hdfs”是你想在HDFS中放置文件的路径。
hadoop fs -put user.txt /user/hive/warehouse/dsb.db/t_user_1/
方式2:首先打开命令行工具,定位到Hadoop服务就行,不需要将目录切换到你的txt文件所在的目录。然后,使用下面的语法上传文件: `hadoop fs -put localfile.txt /path/in/hdfs`,这里,“localfile.txt”是你要上传的文本文件的根路径(完整的),而“/path/in/hdfs”是你想在HDFS中放置文件的路径。
hadoop fs -put C:\Users\lenovo\Desktop\user1.txt /user/hive/warehouse/dsb.db/t_user_1/
(4)执行查询操作,看看是否能映射出文件的信息
select * from t_user_1;
问题1:(1)如何将Windows中的txt文件上传到hdfs的根目录上?(2)如何将hdfs上的txt文件移动到hdfs指定的文件夹?
答:(1)打开命令提示符(CMD),使用`cd`命令切换到你的txt文件所在的目录,输入命令
`hadoop fs -put localfile.txt /`,在这个命令中,`localfile.txt`是你要上传的txt文件,`/`是HDFS的根目录。(2)在命令行工具上键入下面的命令:`hadoop fs -mv /path/originalfile.txt /path/to/destination/`。在这个命令中,“/path/originalfile.txt”是你需要移动的HDFS上的txt文件的当前路径,而“/path/to/destination/”则是你希望将文件移动到的新目录。
问题2:在往hdfs上移动文件时候,命令行在hive服务上可以吗?
答:你可以从 Hive 服务的命令行界面(CLI)中退出,然后直接使用 Hadoop 提供的命令行工具在 HDFS 上进行文件操作。Hive 命令行界面不直接支持文件系统的操作如移动文件等,这些操作通常是在 Hadoop 的环境中用 Hadoop 的命令行工具进行的。 所以,你可以先退出 Hive 的命令行界面(比如 输入 `exit;`),然后就可以使用 Hadoop 命令行工具,例如使用 `hadoop fs -mv` 命令在 HDFS 上移动文件了。
问题3:往hdfs上移动文件的时候,什么情况下命令行需要定位到hdfs服务,什么情况下命令行需要定位到文件所在路径?
答:(1.)当你需要在HDFS上执行操作时,如在HDFS上创建或删除目录,移动或删除文件等,命令行无需定位到特定的目录,可以直接在Hadoop服务上进行。例如,`hadoop fs -mkdir /user/newdirectory` 这条命令可以在任何位置执行,因为它直接在HDFS上创建目录。 (2) 当你需要将本地文件上传到HDFS时,你需要直接在命令行中指定完整的本地文件路径,或者先定位到本地文件所在的路径。例如,如果你当前定位在本地文件夹D:\Docs中,你可以直接使用 `hadoop fs -put myfile.txt /path/in/hdfs` 来上传myfile.txt文件到HDFS目录/path/in/hdfs。也可以不用先导航到文件所在的路径,直接在命令行中给出完整路径,如 `hadoop fs -put D:\Docs\myfile.txt /path/in/hdfs`。
更多推荐




所有评论(0)