火影 发表于 2024-7-15 10:58:53

sheng的学习笔记-hive框架原理

需要学习的前置知识:hadoop  可参考  sheng的学习笔记-hadoop-CSDN博客

相干网址
官网:http://hive.apache.org
文档:https://cwiki.apache.org/confluence/display/Hive/GettingStarted
https://cwiki.apache.org/confluence/display/Hive/Home
下载:http://archive.apache.org/dist/hive
Github地点:https://github.com/apache/hive

基础知识

什么是hive

Hive是基于Hadoop的一个数据堆栈(Data Aarehouse,简称数仓、DW),可以将布局化的数据文件映射为一张数据库表,并提供类SQL查询功能。是用于存储、分析、陈诉的数据系统,常用作离线数据堆栈
Hive的本质是:将Hive SQL转化成MapReduce程序,其机动性和扩展性比较好,支持UDF,自定义存储格式等;适合离线数据处理。
为啥用hive

直接用mapReduce有以下难点,以是在上面包了一层hive

[*]学习本钱太高
[*]开辟周期长,复杂度高
[*]mapReduce对于复杂查询开辟难度大
优缺点

优点:


[*]使用接口采用类SQL语法,提供快速开辟的本领(简单、轻易上手);
[*]制止了去写MapReduce,淘汰开辟职员的学习本钱;
[*]同一的元数据管理,可与impala/spark等共享元数据;
[*]易扩展(HDFS+MapReduce:可以扩展集群规模;支持自定义函数);
[*]数据的离线处理;好比:日志分析,海量布局化数据离线分析
缺点:
1、延迟较高:默认MR为执行引擎,MR延迟较高。
2、不支持雾化视图:Hive支持平凡视图,不支持雾化视图。Hive不能再视图上更新、插入、删除数据。
3、不适用OLTP:暂不支持列级别的数据添加、更新、删除使用。
使用场景:


[*] Hive的执行延迟比较高,因此hive常用于数据分析的,对及时性要求 不高的场合;
[*] Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执 行延迟比较高。
安装

windows

别试了,我最后失败了,报错创建文件失败,估计权限问题,最好弄个docker的
下载安装包

从官网下载安装包,解压安装包到(F:\workspace\arch\hive\apache-hive-3.1.3-bin),注意路径不要有空格。
设置情况变量

新增  HIVE_HOME
F:\workspace\arch\hive\apache-hive-3.1.3-bin
改一下path  ;%HIVE_HOME%\bin
处理windows的bin

办理“Windows情况中缺少Hive的执行文件和运行程序”的问题
Hive 的Hive_x.x.x_bin.tar.gz 高版本在windows 情况中缺少 Hive的执行文件和运行程序。
办理方法:
4.1、下载低版本Hive(apache-hive-2.0.0-src)
下载地点:http://archive.apache.org/dist/hive/hive-2.0.0/apache-hive-2.0.0-bin.tar.gz
或者网盘下载:https://pan.baidu.com/s/1exyrc51P4a_OJv2XHYudCw?pwd=yyds
并将bin文件更换到本身版本的Bin中
https://img-blog.csdnimg.cn/direct/a861e80ece6a4d8c951dde44ae0c7f33.png
给Hive添加MySQL的jar包

下载连接MySQL的依靠jar包“mysql-connector-java-5.1.47-bin.jar”
官网下载地点:https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.47.zip
或者网盘下载:https://pan.baidu.com/s/1X6ZGyy3xNYI76nDoAjfVVA?pwd=yyds
https://img-blog.csdnimg.cn/direct/990310c66cd04e97a3461e19260d9226.png
配置文件

创建Hive配置文件(hive-site.xml、hive-env.sh、hive-log4j2.properties、hive-exec-log4j2.properties)
配置文件目录(%HIVE_HOME%\conf)有4个默认的配置文件模板拷贝成新的文件名
原文件名    拷贝后的文件名
hive-log4j.properties.template    hive-log4j2.properties
hive-exec-log4j.properties.template    hive-exec-log4j2.properties
hive-env.sh.template    hive-env.sh
hive-default.xml.template    hive-site.xml

hive-env.sh

# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=F:\workspace\arch\hadoop\hadoop-3.4.0

# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=F:\workspace\arch\hive\apache-hive-3.1.3-bin\conf

# Folder containing extra libraries required for hive compilation/execution can be controlled by:
export HIVE_AUX_JARS_PATH=F:\workspace\arch\hive\apache-hive-3.1.3-bin\lib
有人这么配置的
https://img-blog.csdnimg.cn/direct/4be5607cb97644a2889fbfb65019e8e6.png
hive-site.xml

windows的改成这样
修改后的 hive-site.xml 下载地点:百度网盘 请输入提取码
<property>
    <name>hive.exec.local.scratchdir</name>
    <value>D:/bigdata/hive/2.3.5/data/scratch</value>
    <description>Local scratch space for Hive jobs</description>
</property>
<property>
    <name>hive.server2.logging.operation.log.location</name>
    <value>D:/bigdata/hive/2.3.5/data/op_logs</value>
    <description>Top level directory where operation logs are stored if logging functionality is enabled</description>
</property>
<property>
    <name>hive.downloaded.resources.dir</name>
    <value>D:/bigdata/hive/2.3.5/data/resources/${hive.session.id}_resources</value>
    <description>Temporary local directory for added resources in the remote file system.</description>
</property>
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
</property>
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
    <description>Username to use against metastore database</description>
</property>
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
    <description>password to use against metastore database</description>
</property>
<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3307/hive?createDatabaseIfNotExist=true&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
    <description>
      JDBC connect string for a JDBC metastore.
      To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
      For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
    </description>
</property>
linux的改成root
https://img-blog.csdnimg.cn/direct/49ec12d7aaa848f49c1abee2bb7d657d.png
启动hadoop 

https://img-blog.csdnimg.cn/direct/b0c5ace7446b41a0878ecfe3c4d78a03.png
 在Hadoop上创建HDFS目录并给文件夹授权(选做,可不做)

   hadoop fs  -mkdir       /tmp
hadoop fs  -mkdir       /user/
hadoop fs  -mkdir       /user/hive/
hadoop fs  -mkdir       /user/hive/warehouse 
hadoop fs  -chmod g+w   /tmp
hadoop fs  -chmod g+w   /user/hive/warehouse
 
https://img-blog.csdnimg.cn/direct/cbdadb4085044373bc66198b297cd2f6.png
https://img-blog.csdnimg.cn/direct/0708052406a548359e6f5b7a8d4fad39.png
https://img-blog.csdnimg.cn/direct/47c6f76ed3dd419080320abb8e0bfac1.png
启动Hive服务

在%HIVE_HOME%/bin目录下执行下面的脚本:
   hive --service schematool -dbType mysql -initSchema

使用hive

数据库

创建数据库,本质是在hadoop中新增一个目录,并在mysql中增长元数据(数据库和文件的映射,数据库信息等) 。
删除数据库会在Mysql中删除对应数据,在hdfs中删除对应文件夹
默认有个default的数据库
https://img-blog.csdnimg.cn/direct/3cddaaf1b1734d14b7b1c96d0df4401e.png
创建数据库 
https://img-blog.csdnimg.cn/direct/99e74e35e8b94593977406e8916800ed.png
看欣赏器的hive的文件路径,新增了一个test1.db的文件夹,这个数据库下新建的表都会在test1.db的文件夹内https://img-blog.csdnimg.cn/direct/b20770f6964d43e4a537e18831ee3441.png
mysql记载test1数据库信息 
https://img-blog.csdnimg.cn/direct/fb6f9b54d30f44a388ebf92bca81d742.png


创建个表,本质就是创建个目录。
不指定数据库,会创建到default数据库中,在hdfs中数据库对应文件夹创建个目录(目录名是表名),mysql进行记载映射关系和表的情况。在表款式录中的文件内容,就是这个表的数据
可以对表的字段进行增长和修改,删除
https://img-blog.csdnimg.cn/direct/66a93dc0cf62416fb92479a8f0be5e75.png
https://img-blog.csdnimg.cn/direct/0ee4e0cf1e1e4649990aff07bd1bcc47.png
https://img-blog.csdnimg.cn/direct/c00a7428ad9c45a6a611f1b98bffb0db.png

指定分割规则建表

表的实质,是hdfs的一个目录,目录中文件内容就是表的数据,文件内容可以用分隔符进行分割,好比多个字段之间的分割,多行之间的分割,在建表时可以指定分割符号,好比用逗号分割
https://img-blog.csdnimg.cn/direct/1e0c04965ed4454394fce1ff5a534a03.png
https://img-blog.csdnimg.cn/direct/36a1434533b248a8b2132b9ec7ab2f6a.png
表数据导入

数据导入到表中,有3种方法


[*]本地加载到hive中
[*]hdfs文件加载到hive中
[*]用insert语句,从另一个表中加载数据
本地加载到hive中,实际就是用上传的方式,将本地文件上传到hdfs中表目录中,此处是拷贝文件
hdfs文件加载hive中,实际就是把hdfs的文件,移动到hdfs表目录中,此处是移动,原文件会没了
hive是读模式,加载时不检查数据完备性,读的时候发现数据不对,就给null值,好比给一个int类型的字段很长的数字(超过存储长度,会表现null)
https://img-blog.csdnimg.cn/direct/eaf8b7e2dfe84e648f1146faebebd983.png

 表数据导出

与导入对应,导出也分为:


[*]导出到本地文件
[*]导出到hdfs中
[*]导出到hive其他表
实质都是对文件的移动
https://img-blog.csdnimg.cn/direct/e96a9ba40f424655b7f0b03155ec49c2.png
内部表和外部表

建表的时候使用关键字,可以控制是内部表还是外部表
一般使用外部表,因为外部系统源源不断把数据文件传到指定系统路径,hive读取这个系统路径(非hdfs),不需要额外动作,读取表就会有数据
内部表和外部表可以相互转换
https://img-blog.csdnimg.cn/direct/5cbf15d1c3e34e69a0c8949a0ee9b701.png
两者区别
需要注意的是,drop外部表的时候,会删除mysql内的表信息,但不会删除数据文件,因为这个文件别的系统也会用
https://img-blog.csdnimg.cn/direct/0cb35e59358e4e82a75c5ed3358207bb.png
生成数据

插入数据会触发hadoop的job,以是速度会比较慢
https://img-blog.csdnimg.cn/direct/df5c55a3aef542758ed6d5da3882aafa.png
hive分区和分桶

Hive分区和分桶是优化Hive性能的两种方式,它们的区别如下:
https://img-blog.csdnimg.cn/direct/003660078f6a4c5ea681f00d150de4be.png
分区

什么是分区

Hive分区是把数据按照某个属性分成不同的数据子集。


[*]在Hive中,数据被存储在HDFS中,每个分区实际上对应HDFS下的一个文件夹,这个文件夹中保存了这个分区的数据。
[*]因此,在Hive中使用分区,实际上是将数据按照某个属性值进行分别,然后将相同属性值的数据存储在同一个文件夹中。Hive分区的效率提升主要是因为,当进行查询使用时,只需读取与查询相干的数据分区,制止了全表扫描,节约了查询时间。
Hive分区的主要作用是:



[*]进步查询效率: 使用分区对数据进行访问时,系统只需要读取和此次查询相干的分区,制止了全表扫描,从而明显进步查询效率。
[*]低落存储本钱: 分区可以更加方便的删除逾期数据,淘汰不须要的存储。
怎样创建分区表

在Hive中,可以使用PARTITIONED BY关键字来创建分区表。以下是创建分区表的示例:
CREATE TABLE my_table (
col1 INT,
col2 STRING
)
PARTITIONED BY (dt STRING, country STRING);
分桶

什么是分桶

Hive分桶是将数据分别为若干个存储文件,并规定存储文件的数目。


[*]Hive分桶的实现原理是将数据按照某个字段值分成若干桶,并将相同字段值的数据放到同一个桶中。在存储数据时,桶内的数据会被写入到对应数目的文件中,最终形成多个文件。
[*]Hive分桶主要是为了进步分布式查询的效率。它能够通过将数据分别为若干数据块来将大量数据分发到多个节点,使得数据均衡分布到多个机器上处理。这样分发到不同节点的数据可以在本地进行处理,制止了数据的传输和网络带宽的浪费,同时进步了查询效率。
分桶的主要作用是:



[*]数据聚合: 分桶可以使得数据被分成较小的存储单元,进步了数据统计和聚合的效率。
[*]均衡负载: 数据经过分桶后更轻易实现均衡负载,数据可以分发到多个节点中,进步了查询效率。
怎样创建分桶表

在Hive中,可以使用CLUSTERED BY和SORTED BY关键字来创建分桶表。以下是创建分桶表的示例
CREATE TABLE my_bucketed_table (
col1 INT,
col2 STRING
)
CLUSTERED BY (col1) INTO 4 BUCKETS
SORTED BY (col2);
上述示例中,my_bucketed_table表按照col1列进行分桶,分为4个桶,并按照col2列进行排序 
分区和分桶对比

综上所述,分区和分桶的区别在于其提供的性能优化方向不同。分区适用于对于数据经常进行的聚合查询数据分析,而分桶适用于对于数据的均衡负载、高效聚合等方面的性能优化。当数据量较大、查询效率比较低时,使用分区和分桶可以有效优化性能。分区主要关注数据的分区和存储,而分桶则重点考虑数据的分布以及查询效率。
hive原理

架构图

https://img-blog.csdnimg.cn/direct/ea1cefa43fb54a3195db4350b58a633d.png
https://img-blog.csdnimg.cn/direct/26ef0fe31eaa4bd8a389ad644314b9e6.png
上面的图比较丑,加一个图,但组件是干啥的,看上个图 
https://img-blog.csdnimg.cn/direct/fce686134e41423389abe1a6eb6f90e3.png
工作原理

https://img-blog.csdnimg.cn/direct/d26ec8bc53604bcaa7c6f9e1bb05fcb1.png
序列化和反序列化

定义

1,序列化是对象转化为字节序列的过程;把内存数据转换成文件,insert就是序列化
2,反序列化是字节码恢复为对象的过程;把文件内容转换成内存数据,select就是反序列化
建表语句

用建表语句说明序列化,想要序列化,可以用以下语句建表
create table t1(
id int,
name string
)
row format delimited
fields terminated by ','
;

0,7369,SMITH,CLERK,7902,1980-12-17,800,null,20 序列化要求订定换行策略和字段间分割策略,即:用什么策略区分是2行数据,用什么策略区分是2个字段的值(而不是一个字段的值)
序列化策略

row format: 用于指定使用什么策略做分析
delimited : 表示使用 org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe 进行行的内容分析,如果不写,默认的就是LazySimpleSerDe这个策略
区分字段策略

一个类用于从上面读到的记载中切分出一个一个的字段(根据指定字符作为分隔符,区分行数据和列数据)
fields terminated by: 表示用什么字符进行字段之间的分隔
lines terminated by: 表示用什么字符进行行之间的分隔
序列化是Hive----->Hadoop, 反序列化是hadoop------>Hive  。本质的区别是数据存储的情势不同
https://img-blog.csdnimg.cn/direct/8ac67a51bca14797999c3d37e25585b3.png

Serde

定义



[*]SerDe是“Serializer and Deserializer”的简称。
[*]Hive使用SerDe(和FileFormat)来读/写表的Row对象。
[*]HDFS文件-> InputFileFormat -> <key,value> -> Deserializer -> Row对象
[*]Row对象->Serializer -> <key,value> -> OutputFileFormat -> HDFS文件
注意,“key”部分在读取时会被忽略,而在写入时始终是常数。基本上Row对象存储在“值”中。
注意,org.apache.hadoop.hive.serde是一个逾期的SerDe库。使用最新版本的org.apache.hadoop.hive.serde2。
默认策略

如果不指明,默认的策略是LazySimpleSerDe
支持的策略:

https://img-blog.csdnimg.cn/direct/8a37ada74ea447d1bc9c50a8d2f11d15.png

自定义序列化



[*] RegexSerDe(正则化)

CREATE TABLE apachelog (
host STRING,
identity STRING,
user STRING,
time STRING,
request STRING,
status STRING,
size STRING,
referer STRING,
agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|*) (-|*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?"
)
STORED AS TEXTFILE;

[*] JsonSerDe

ADD JAR /usr/lib/hive-hcatalog/lib/hive-hcatalog-core.jar;

CREATE TABLE my_table(a string, b bigint, ...)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE;

[*] CSVSerDe

CREATE TABLE my_table(a string, b string, ...)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   "separatorChar" = "\t",
   "quoteChar"   = "'",
   "escapeChar"    = "\\"
)
STORED AS TEXTFILE;
存储格式

一般情况下hive在创建表时默认的存储格式是textfile,hive常用的存储格式有五种,textfile、sequencefile、rcfile、orc、parquet。
https://img-blog.csdnimg.cn/direct/5d1a743d19ec4c3dab76915eecf1cc9b.png
https://img-blog.csdnimg.cn/direct/d57f970fe9014c2891b0aed87dce5c4d.png
textfile利弊:


[*]基于行存,每一行就是一条记载。
[*]可以使用任意的分隔符进行分割。
[*]无压缩,造成存储空间大。
sequencefile利弊:


[*]基于行存储。
[*]sequencefile存储格有压缩,存储空间小,有利于优化磁盘和I/O性能。
[*]同时支持文件切割分片,提供了三种压缩方式:none,record,block(块级别压缩效率跟高).默认是record(记载)。
rcfile利弊:


[*]行列混合的存储格式,基于列存储。
[*]因为基于列存储,列值重复多,以是压缩效率高。
[*]磁盘存储空间小,io小。
orc利弊:


[*]具有很高的压缩比,且可切分;由于压缩比高,在查询时输入的数据量小,使用的task淘汰,以是提升了数据查询速度和处理性能。每个task只输出单个文件,淘汰了namenode的负载压力。
[*]在ORC文件中会对每一个字段建立一个轻量级的索引,如:row group index、bloom filter index等,可以用于where条件过滤。
[*]查询速度比rcfile快;支持复杂的数据类型;
[*]无法可视化展示数据;读写时需要消耗额外的CPU资源用于压缩和解压缩,但消耗较少;
[*]对schema演化支持较差;
parquet利弊:


[*]具有高效压缩和编码,是使用时有更少的IO取出所需数据,速度比ORC快,其他方面类似于ORC。
[*]不支持update和ACID。
[*]不支持可视化展示数据。


参考文章
02 Hive - Hive的架构与工作原理_哔哩哔哩_bilibili
怎样通俗地明白Hive的工作原理? - 知乎
快速了解下Hive基本原理 - 知乎
Windows下安装Hive(包安装成功)_windows安装hive-CSDN博客
百度安全验证
https://www.cnblogs.com/halberd-lee/p/12990357.html
https://download.csdn.net/blog/column/9122766/126776080

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: sheng的学习笔记-hive框架原理