Hive | Hive 启动和 *** 作出错

Hive | Hive 启动和 *** 作出错,第1张

具体步骤:

step1:在修改 hive-sitexml 前,先创建 tmp 目录

进入到hive的安装目录下,本文是进入到  /opt/modules/hive/apache-hive-122-bin

输入      mkdir   tmp             存储临时文件

step2:进入到 /apache-hive-122-bin/conf 目录下,修改 hive-sitexml 文件
输入    vim    hive-sitexml         编辑 hive-sitexml  文件

搜索 system:javaiotmpdir ,输入  /system:javaiotmpdir  进行搜索

可定位到多处含有 system:javaiotmpdir 的地方(搜索功能按小写 n可切换到下一处;按小写 N 可切换到上一处)

输入 i 键 进入编辑模式

将 system:javaiotmpdir 全部替换成 /opt/modules/hive/apache-hive-122-bin/tmp(这个是我存放临时文件的路径,替换成你所创建的)

输入 Esc 键 退出编辑模式,输入 :wq   保存并退出
具体步骤:

进入到 /apache-hive-122-bin/conf 目录下,修改 hive-sitexml 文件

输入    vim    hive-sitexml      编辑 hive-sitexml  文件

搜索 hiveexeclocalscratchdir ,输入  /hiveexeclocalscratchdir   进行搜索

输入 i 键 进入编辑模式

将 ${system:username} 替换成 ${username}

改成:

输入 Esc 键 退出编辑模式,输入 :wq   保存并退出
step1:查看目前 hdfs 和 yarn 的启动情况

输入   jps

从上图可看到,datanode 木有掉了,所以重启一下 hdfs 和 yarn

step2: 先停止 hdfs 和 yarn

输入      stop-allsh       

或者分别输入        stop-dfssh        stop-yarnsh

step3:再启动 hdfs 和 yarn

输入 start-allsh

或是分别输入          start-dfssh        start-yarnsh

参考链接:

>

UDTF(User-Defined Table-Generating Functions)是一进多出函数,如hive中的explode()函数。
在学习自定义UDTF函数时,一定要知道hive中的UDTF函数如何使用,不会的先看这篇文章: hive中UDTF函数explode详解 + explode与lateral view 3套案例练习 。

自定义函数、实现UDTF一进多出功能,我们主要关心的是要继承什么类,实现什么方法。
1)继承 orgapachehadoophiveqludfgenericGenericUDTF 类
2)重写 initialize、process、close 方法

继承GenericUDTF抽象类时,我们需要重写 initialize 方法、并实现2个抽象方法 (process、close)
在Alt + Enter回车时,只提示我们实现两个方法抽象方法 process、close 。 initialize方法 不是抽象方法不用实现,但是该方法 需要重写 ,不然会报错。

initialize方法是针对整个任务调一次,initialize作用是 定义输出字段的列名、和输出字段的数据类型 ,重写该方法时里面有一些知识点需要我们记

process方法是 一行数据调用一次process方法 ,即 有多少行数据就会调用多少次process方法 。主要作用是对传入的 每一行数据写出去多次 ,调用forward()将数据写入到一个缓冲区。

有2个点需要记住:

这里没有io流的 *** 作所以不需要关闭。

关于是否有IO流以及是否关闭IO流不清楚。

最后文章里面,还有很多描述不清楚的地方,以及我不明白的地方,大家也可以去看看其他的文章。

1.语法

(1)load data:表示加载数据

(2)local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表

(3)inpath:表示加载数据的路径

(4)overwrite:表示覆盖表中已有数据,否则表示追加

(5)into table:表示加载到哪张表

(6)student:表示具体的表

(7)partition:表示上传到指定分区

2.实 *** 案例

(0)创建一张表

(1)加载本地文件到hive

(2)加载HDFS文件到hive中

上传文件到HDFS

加载HDFS上数据

(3)加载数据覆盖表中已有的数据

上传文件到HDFS

加载数据覆盖表中已有的数据

1.创建一张分区表

2.基本插入数据

3.基本模式插入(根据单张表查询结果)

4.多插入模式(根据多张表查询结果)(有问题,只是查询单表不同分区的)

根据查询结果创建表(查询的结果会添加到新创建的表中)

1.创建表,并指定在hdfs上的位置

2.上传数据到hdfs上

3.查询数据

注意:先用export导出后,再将数据导入。

1.将查询的结果导出到本地

2.将查询的结果格式化导出到本地

3.将查询的结果导出到HDFS上(没有local)

基本语法:(hive -f/-e 执行语句或者脚本 > file)

后续。

注意:Truncate只能删除管理表,不能删除外部表中数据

1.全表查询

2.选择特定列查询

注意:

(1)SQL 语言大小写不敏感。

(2)SQL 可以写在一行或者多行

(3)关键字不能被缩写也不能分行

(4)各子句一般要分行写。

(5)使用缩进提高语句的可读性。

1.重命名一个列

2.便于计算

3.紧跟列名,也可以在列名和别名之间加入关键字‘AS’

4.案例实 ***

查询名称和部门

(1)where针对表中的列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据。
(2)where后面不能写分组函数,而having后面可以使用分组函数。
(3)having只用于group by分组统计语句。

空字段赋值

5CASE WHEN

需求
求出不同部门男女各多少人。结果如下:

创建本地emp_sextxt,导入数据

创建hive表并导入数据

按需求查询数据

Order By:全局排序,一个Reducer

1.使用 ORDER BY 子句排序

ASC(ascend): 升序(默认)

DESC(descend): 降序

2.ORDER BY 子句在SELECT语句的结尾

3.案例实 ***

(1)查询员工信息按工资升序排列

(2)查询员工信息按工资降序排列

按照员工薪水的2倍排序

按照部门和工资升序排序

Sort By:每个Reducer内部进行排序,对全局结果集来说不是排序。

1.设置reduce个数

2.查看设置reduce个数

3.根据部门编号降序查看员工信息

4.将查询结果导入到文件中(按照部门编号降序排序)

Distribute By:类似MR中partition,进行分区,结合sort by使用。

注意,Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前。

对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。

案例实 *** :

当distribute by和sorts by字段相同时,可以使用cluster by方式

cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。

1)以下两种写法等价

注意:按照部门编号分区,不一定就是固定死的数值,可以是20号和30号部门分到一个分区里面去。

Hive是大数据领域常用的组件之一,主要用于大数据离线数仓的运算,关于Hive的性能调优在日常工作和面试中是经常涉及的一个点,因此掌握一些Hive调优是必不可少的一项技能。影响Hive效率的主要因素有数据倾斜、数据冗余、job的IO以及不同底层引擎配置情况和Hive本身参数和HiveSQL的执行等。本文主要从建表配置参数方面对Hive优化进行讲解。

1 创建一个普通表

table test_user1(id int, name string,code string,code_id string ) ROW FORMAT DELIMITED FIELDS TERMINATED  BY ',';

2 查看这张表的信息

DESCRIBE FORMATTED  test_user1;

我们从该表的描述信息介绍建表时的一些可优化点。

21 表的文件数

numFiles表示表中含有的文件数,当文件数过多时可能意味着该表的小文件过多,这时候我们可以针对小文件的问题进行一些优化,HDFS本身提供了解决方案:

(1)Hadoop Archive/HAR:将小文件打包成大文件。

(2)SEQUENCEFILE格式:将大量小文件压缩成一个SEQUENCEFILE文件。

(3)CombineFileInputFormat:在map和reduce处理之前组合小文件。

(4)HDFS Federation:HDFS联盟,使用多个namenode节点管理文件。

除此之外,我们还可以通过设置hive的参数来合并小文件。

(1)输入阶段合并

需要更改Hive的输入文件格式,即参数hiveinputformat,默认值是orgapachehadoophiveqlioHiveInputFormat,我们改成orgapachehadoophiveqlioCombineHiveInputFormat。这样比起上面对mapper数的调整,会多出两个参数,分别是mapredminsplitsizepernode和mapredminsplitsizeperrack,含义是单节点和单机架上的最小split大小。如果发现有split大小小于这两个值(默认都是100MB),则会进行合并。具体逻辑可以参看Hive源码中的对应类。

(2)输出阶段合并

直接将hivemergemapfiles和hivemergemapredfiles都设为true即可,前者表示将map-only任务的输出合并,后者表示将map-reduce任务的输出合并,Hive会额外启动一个mr作业将输出的小文件合并成大文件。另外,hivemergesizepertask可以指定每个task输出后合并文件大小的期望值,hivemergesizesmallfilesavgsize可以指定所有输出文件大小的均值阈值,默认值都是1GB。如果平均大小不足的话,就会另外启动一个任务来进行合并。

22 表的存储格式

通过InputFormat和OutputFormat可以看出表的存储格式是TEXT类型,Hive支持TEXTFILE, SEQUENCEFILE, AVRO, RCFILE, ORC,以及PARQUET文件格式,可以通过两种方式指定表的文件格式:

(1)CREATE TABLE STORE AS <file_format>:在建表时指定文件格式,默认是TEXTFILE

(2)ALTER TABLE [PARTITION partition_spec] SET FILEFORMAT <file_format>:修改具体表的文件格式

如果要改变创建表的默认文件格式,可以使用set

hivedefaultfileformat=<file_format>进行配置,适用于所有表。同时也可以使用set

hivedefaultfileformatmanaged = <file_format>进行配置,仅适用于内部表或外部表。

扩展:不同存储方式的情况

TEXT,

SEQUENCE和

AVRO文件是面向行的文件存储格式,不是最佳的文件格式,因为即便只查询一列数据,使用这些存储格式的表也需要读取完整的一行数据。另一方面,面向列的存储格式(RCFILE,

ORC, PARQUET)可以很好地解决上面的问题。关于每种文件格式的说明,如下:

(1)TEXTFILE

创建表时的默认文件格式,数据被存储成文本格式。文本文件可以被分割和并行处理,也可以使用压缩,比如GZip、LZO或者Snappy。然而大部分的压缩文件不支持分割和并行处理,会造成一个作业只有一个mapper去处理数据,使用压缩的文本文件要确保文件不要过大,一般接近两个HDFS块的大小。

(2)SEQUENCEFILE

key/value对的二进制存储格式,sequence文件的优势是比文本格式更好压缩,sequence文件可以被压缩成块级别的记录,块级别的压缩是一个很好的压缩比例。如果使用块压缩,需要使用下面的配置:set

hiveexeccompressoutput=true; set ioseqfilecompressiontype=BLOCK

(3)AVRO

二进制格式文件,除此之外,avro也是一个序列化和反序列化的框架。avro提供了具体的数据schema。

(4)RCFILE

全称是Record Columnar File,首先将表分为几个行组,对每个行组内的数据进行按列存储,每一列的数据都是分开存储,即先水平划分,再垂直划分。

(5)ORC

全称是Optimized Row Columnar,从hive011版本开始支持,ORC格式是RCFILE格式的一种优化的格式,提供了更大的默认块(256M)

(6)PARQUET

另外一种列式存储的文件格式,与ORC非常类似,与ORC相比,Parquet格式支持的生态更广,比如低版本的impala不支持ORC格式。

配置同样数据同样字段的两张表,以常见的TEXT行存储和ORC列存储两种存储方式为例,对比执行速度。

TEXT存储方式

总结: 从上图中可以看出列存储在对指定列进行查询时,速度更快, 建议在建表时设置列存储的存储方式 。

23 表的压缩

对Hive表进行压缩是常见的优化手段,一些存储方式自带压缩选择,比如SEQUENCEFILE支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩;

ORC支持三种压缩选择:NONE,ZLIB,SNAPPY。我们以TEXT存储方式和ORC存储方式为例,查看表的压缩情况。

配置同样数据同样字段的四张表,一张TEXT存储方式,另外三张分别是默认压缩方式的ORC存储、SNAPPY压缩方式的ORC存储和NONE压缩方式的ORC存储,查看在hdfs上的存储情况:

TEXT存储方式

默认压缩ORC存储方式

SNAPPY压缩的ORC存储方式

NONE压缩的ORC存储方式

总结 :可以看到ORC存储方式将数据存放为两个block,默认压缩大小加起来13469M,SNAPPY压缩大小加起来19667M,NONE压缩大小加起来24755M,TEXT存储方式的文件大小为36658M,且默认block两种存储方式分别为256M和128M,ORC默认的压缩方式比SNAPPY压缩得到的文件还小,原因是ORZ默认的ZLIB压缩方式采用的是deflate压缩算法,比Snappy压缩算法得到的压缩比高,压缩的文件更小。 ORC不同压缩方式之间的执行速度,经过多次测试发现三种压缩方式的执行速度差不多,所以建议采用ORC默认的存储方式进行存储数据。

24 分桶分区

Num Buckets表示桶的数量,我们可以通过分桶和分区 *** 作对Hive表进行优化:

对于一张较大的表,可以将它设计成分区表,如果不设置成分区表,数据是全盘扫描的,设置成分区表后,查询时只在指定的分区中进行数据扫描,提升查询效率。要注意尽量避免多级分区,一般二级分区足够使用。常见的分区字段:

(1)日期或者时间,比如year、month、day或者hour,当表中存在时间或者日期字段时,可以使用些字段。

(2)地理位置,比如国家、省份、城市等

(3)业务逻辑,比如部门、销售区域、客户等等

与分区表类似,分桶表的组织方式是将HDFS上的一张大表文件分割成多个文件。分桶是相对分区进行更细粒度的划分,分桶将整个数据内容按照分桶字段属性值得hash值进行区分,分桶可以加快数据采样,也可以提升join的性能(join的字段是分桶字段),因为分桶可以确保某个key对应的数据在一个特定的桶内(文件),所以巧妙地选择分桶字段可以大幅度提升join的性能。通常情况下,分桶字段可以选择经常用在过滤 *** 作或者join *** 作的字段。

创建分桶表

create

table test_user_bucket(id int, name string,code string,code_id string )

clustered by(id) into 3 buckets ROW FORMAT DELIMITED FIELDS TERMINATED 

BY ',';

查看描述信息

DESCRIBE FORMATTED test_user_bucket

多出了如下信息

查看该表的hdfs

同样的数据查看普通表和分桶表查询效率

普通表

分桶表

普通表是全表扫描,分桶表在按照分桶字段的hash值分桶后,根据join字段或者where过滤字段在特定的桶中进行扫描,效率提升。

本文首发于: 数栈研习社

数栈是云原生—站式数据中台PaaS,我们在github上有一个有趣的开源项目: FlinkX

FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,比如MySQL,HDFS等,也可以采集实时变化的数据,比如MySQL

binlog,Kafka等,是全域、异构、批流一体的数据同步引擎,大家如果有兴趣,欢迎来github社区找我们玩~


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/10306610.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-07
下一篇2023-05-07

发表评论

登录后才能评论

评论列表(0条)

    保存