Hive性能优化指南

Hive 性能优化指南

Hive是Hadoop中数PB数据的SQL查询标准。它提供对HDFS中数据的类似SQL的访问,使Hadoop可用作数据仓库。 Hive查询语言(HQL)在关系数据库中具有与标准SQL类似的语义和功能,因此经验丰富的数据库分析人员可以轻松掌握它。 Hive的查询语言可以在不同的计算引擎上运行,例如MapReduce,Tez和Spark。
Hive的元数据结构在HDFS之上提供了一个高级的,类似于表的结构。它支持三种主要数据结构,表,分区和存储桶。这些表对应于HDFS目录,可以分为多个分区,数据文件可以分成多个分区。 Hive的元数据结构通常是Hadoop上的Schema-on-Read概念的Schema,这意味着在将数据存储在HDFS之前,您不必在Hive中定义模式。存储数据后应用Hive元数据可为数据工作带来更多灵活性和效率。 Hive元数据的流行使其成为描述大数据的事实上的方式,并被大数据生态系统中的许多工具使用。
下图是Hadoop生态系统中Hive的体系结构视图。 Hive元数据存储(也称为Metastore)可以使用嵌入式,本地或远程数据库。 thrift服务器基于Apache Thrift Server技术构建。凭借其最新版本2,hiveserver2能够处理多个并发客户端,支持Kerberos,LDAP和自定义可插入身份验证,并为JDBC和ODBC客户端提供更好的选项,尤其是元数据访问。

在这里插入图片描述

以下是我们可以记住的Hive的一些亮点:Hive提供了一个简单且优化的查询模型,其编码少于MapReduce。
HQL和SQL具有类似的语法。
在相同数量的大数据集上,Hive的查询响应时间通常比其他查询响应时间快得多。
Hive支持在不同的计算框架上运行。
Hive支持在HDFS和HBase上进行临时查询数据。
Hive支持用户定义的java / scala函数,脚本和过程。
语言来扩展其功能。
成熟的JDBC和ODBC驱动程序允许许多应用程序提取Hive数据以实现无缝报告。
Hive允许用户使用SerDes和输入/输出格式以任意格式读取数据。
Hive是一种稳定可靠的批处理工具,可长期投入生产。
Hive具有用于元数据管理,身份验证和查询优化的定义良好的体系结构。
有一个庞大的从业者和开发人员社区致力于和使用Hive。

首先要知道如何了解性能瓶颈在哪里.
性能分析方法:

性能考虑
尽管Hive是为处理大数据处理而构建的,但我们仍然不能忽视性能的重要性。大多数情况下,更好的查询可以依靠智能查询优化器来查找最佳执行策略,以及默认设置和最佳实践。但是,有经验的用户应该更多地了解性能调优的理论和实践,尤其是在处理对性能敏感的项目或环境时。
使用HQL中提供的实用程序来查找导致性能不佳的潜在问题。
性能实用程序设计优化数据优化作业优化性能实用程序HQL提供EXPLAIN和ANALYZE语句,可用作检查和识别查询性能的实用程序。此外,Hive日志包含足够的详细信息,用于性能调查和故障排除。

性能注意事项:
EXPLAIN语句Hive提供了一个EXPLAIN语句,用于在不运行查询的情况下返回查询执行计划。如果我们对其性能有疑虑,我们可以使用它来分析查询。 EXPLAIN语句帮助我们查看两个或多个查询之间的差异,以实现相同的目的。它的语法如下:EXPLAIN [FORMATTED | EXTENDED | DEPENDENCY | AUTHORIZATION] hql_query可以使用以下关键字:FORMATTED:这提供了查询计划的格式化JSON版本。
EXTENDED:这为计划中的操作员提供了附加信息,例如文件路径名。
DEPENDENCY:这提供了一个JSON格式输出,其中包含查询所依赖的表和分区列表。自Hive v0.10.0 AUTHORIZATION以来一直可用:它列出了需要授权的所有实体,包括运行查询的输入和输出,以及授权失败(如果有)。它从Hive v0.14.0开始提供。
典型的查询计划包含以下三个部分。稍后我们还将看一个示例:抽象语法树(AST):Hive使用一个名为ANTLR的解析器生成器(请参阅http:// www.antlr.org /)来自动生成树语法HQL阶段依赖关系:这列出了用于运行查询的所有依赖关系和阶段数阶段计划:它包含用于运行作业的重要信息,例如运算符和排序顺序以下是典型查询计划的外观。从以下示例中,我们可以看到AST部分显示为Map / Reduce运算符树。

在STAGE DEPENDENCIES部分中,Stage-0和Stage-1都是独立的根阶段。在STAGE PLANS部分中,Stage-1有一个map和reduce,由Map Operator Tree和Reduce Operator Tree引用。在每个Map / Reduce Operator Tree部分中,列出了与查询关键字相对应的所有运算符,以及表达式和聚合。 Stage-0阶段没有map和reduce。它只是一个Fetch操作:

EXPLAIN SELECT gender_age.gender,count(*)> FROM employee_partitioned WHERE year = 2018> GROUP BY gender_age.gender LIMIT

具体优化策略如下:

一.设计优化

设计优化
设计优化包括多种设计,数据格式和作业优化策略,以提高性能。这将在以下部分中介绍。

1.分区表设计
分区表设计Hive分区是提高较大表的查询性能的最有效方法之一。具有分区过滤的查询将仅加载来自指定分区(子目录)的数据,因此它的执行速度比通过非分区字段过滤的普通查询快得多。分区键的选择始终是性能的重要因素。它应该始终是一个低基数属性,以避免这么多的子目录开销。以下是一些常用作分区键的属性:按日期和时间分区:使用日期和时间(如年,月和日(甚至小时))作为数据与日期/时间列关联时​​的分区键,例如as load_date,business_date,run_date等按位置分区:当数据与位置相关时,使用国家,地区,州和城市作为分区键按业务逻辑划分分区:使用部门,销售区域,应用程序,客户等作为分区键数据可以由业务逻辑均匀分隔时的分区键.

2.存储桶表设计
存储桶表设计与分区类似,存储桶表将数据组织到HDFS中的单独文件中。 Bucketing可以加速桶上的数据采样。如果连接键也是桶列,则Bucketing还可以提高连接性能,因为存储可确保键存在于某个存储桶中。更好选择的bucket列使Bucket 表连接表现更好。选择存储桶列的最佳做法是根据数据集背后的业务逻辑识别最有可能在过滤器或连接条件中使用的列。有关更多详细信息,请参阅本章后面的“作业优化”部分。

3.索引设计
索引设计使用索引是关系数据库中性能调优的一种非常常见的最佳实践。自Hive v0.7.0起,Hive支持在表/分区上创建索引。 Hive中的索引为某些操作(如WHERE,GROUP BY和JOIN)提供基于键的数据视图和更好的数据访问。使用索引总是比全表扫描更便宜的替代方案。在HQL中创建索引的命令很简单,如下所示:
CREATE INDEX idx_id_employee_id

ON TABLE employee_id (employee_id)
AS ‘COMPACT’
WITH DEFERRED REBUILD;
No rows affected (1.149 seconds)

除了存储索引列的值对及其块ID的COMPACT索引之外,HQL还支持BITMAP索引,因为v0.8.0对于具有较小方差的列值,如以下示例所示:> CREATE INDEX idx_gender_employee_id> ON TABLE employee_id(gender_age)> AS’BITMAP’> WITH DEFERRED REBUILD;没有受影响的行(0.251秒)此示例中的WITH DEFERRED REBUILD选项可防止立即构建索引。要构建索引,我们可以发出ALTER … REBUILD命令,如以下示例所示。当基表中的数据发生更改时,必须再次使用相同的命令才能使索引更新。这是一个原子操作。如果在表上重建的索引先前已被索引失败,则索引的状态保持不变。请参阅此示例以构建索引:> ALTER INDEX idx_id_employee_id ON employee_id REBUILD;没有行受影响(111.413秒)> ALTER INDEX idx_gender_employee_id ON employee_id REBUILD;没有行受影响(82.23秒)构建索引后,将为每个索引创建一个新索引表,其名称格式为<database_name> __ <table_name> _ <index_name> __

  1. 使用倾斜/临时表
    除了常规的内部/外部或分区表,我们还应该考虑使用
    倾斜或临时的桌子,以获得更好的设计和性能。
    从Hive v0.10.0开始,HQL支持创建一个用于组织倾斜的特殊表
    数据。 通过拆分这些偏斜值,可以使用倾斜表来提高性能
    自动分成单独的文件或目录。 因此,文件总数或
    分区文件夹减少了。 此外,查询可以快速包含或忽略此数据
    有效率的。 以下是用于创建倾斜表的示例:

CREATE TABLE sample_skewed_table (
dept_no int,
dept_name string
)
SKEWED BY (dept_no) ON (1000, 2000); – Specify value skewed
No rows affected (3.122 seconds)
DESC FORMATTED sample_skewed_table;
±----------------±-----------------±--------+
| col_name | data_type | comment |
±----------------±-----------------±--------+
| … | … | |
| Skewed Columns: | [dept_no] | NULL |
| Skewed Values: | [[1000], [2000]] | NULL |
| … | … | |
±----------------±-----------------±--------+
33 rows selected (0.247 seconds)

另一方面,
在数据递归处理期间使用HQL中的临时表来保存中间数据将为您节省重建公共或共享结果集的工作量。此外,临时表可以利用存储策略设置将固态或内存虚拟硬盘用于数据存储,这也可以提高性能。

二.数据优化

数据优化
数据文件优化涵盖了数据文件在文件格式,压缩和存储方面的性能改进。

1.文件格式
Hive支持TEXTFILE,SEQUENCEFILE,AVRO,RCFILE,ORC和PARQUET文件格式。
有两个HQL语句用于指定文件格式,如下所示:CREATE TABLE … STORE AS <file_format>:创建表时指定文件格式ALTER TABLE … [PARTITION partition_spec] SET FILEFORMAT <file_format>:修改现有表格中的文件格式(仅限定义)一旦创建了以文本格式存储的表格,我们就可以直接将文本数据加载到其中。要将文本数据加载到具有其他文件格式的表中,我们可以先将数据加载到以文本形式存储的表中,然后使用INSERT OVERWRITE / INTO TABLE … SELECT从中选择数据,然后将数据插入表中有其他文件格式。
要更改表创建的默认文件格式,我们可以为所有表设置hive.default.fileformat = <file_format>属性,或仅为内部/托管表设置hive.default.fileformat.managed = <file_format>。
TEXT,SEQUENCE和AVRO文件作为面向行的文件存储格式不是最佳解决方案,因为即使只请求一列,查询也必须读取整行。
另一方面,混合行 - 列存储文件格式(例如RCFILE,ORC或PARQUET)用于解决此问题。 HQL支持的文件格式的详细信息如下:TEXTFILE:这是表创建的默认文件格式。数据以明文形式存储为此格式。文本文件可自然拆分,并且可以并行处理。它也可以使用算法进行压缩,例如GZip,LZO和Snappy。但是,大多数压缩文件不可拆分用于并行处理。因此,他们只使用一个作业和一个映射器来缓慢处理数据。使用压缩文本文件的最佳做法是确保文件不会太大并且接近几个HDFS块大小。
SEQUENCEFILE:这是键/值对的二进制存储格式。序列文件的好处是它比文本文件更紧凑,并且与MapReduce输出格式非常吻合。序列文件可以压缩到记录或块级别,其中块级别具有更好的压缩率。要启用块级压缩,我们需要使用以下设置:set hive.exec.compress.output = true;并设置io.seqfile.compression.type = BLOCK;。
性能注意事项第7章[132] AVRO:这也是二进制格式。更重要的是,它也是一个序列化和反序列化框架。 AVRO提供了一个描述数据结构的数据模式,并且还处理模式更改,例如添加,重命名和删除列。模式与数据一起存储以进行任何进一步处理。考虑到AVRO在处理模式演变方面的优势,建议在映射源数据时使用它,这可能会逐时更改模式。

RCFILE:这是Record Columnar File的缩写。它是一个由二进制键/值对组成的平面文件,它与序列文件有许多相似之处。 RCFile将数据水平拆分为行组。一个或多个组存储在HDFS文件中。然后,RCFile通过在所有行中保存第一列,然后跨所有行保存第二列,以字节格式保存行组数据,依此类推。这种格式是可拆分的,允许Hive跳过数据的不相关部分,并使结果更快,更便宜。

ORC:这是Optimized Row Columnar的缩写。它从Hive v0.11.0开始提供。 ORC格式可以被认为是RCFILE的改进版本。它默认提供256 MB的更大块大小(RCFILE有4 MB,SEQUENCEFILE有1 MB),针对HDFS上的大型顺序读取进行了优化,以获得更高的吞吐量和更少的文件,以减少名称节点中的过载。与RCFILE不同,RCFILE依赖于Metastore来了解数据类型,ORC文件通过使用特定的编码器来理解数据类型,以便它可以根据不同的类型优化压缩。它还在列上存储基本统计信息,例如MIN,MAX,SUM和COUNT,以及可用于跳过无关紧要的行块的轻量级索引。

PARQUET:这是另一种列式文件格式,其设计与ORC类似。更重要的是,与主要由Hive,Pig和Spark支持的ORC相比,Parquet对生态系统中的大多数项目提供了更广泛的支持。 PARQUET利用Google Dremel设计中的最佳实践(参见http:/ / research.google.com / pubs / pub36632.html)来支持嵌套的数据结构。自Hive v0.10.0以来,PARQUET一直受到插件的支持,并且在v0.13.0之后得到了本机支持。

根据所使用的技术堆栈,如果Hive是用于定义或处理数据的主要工具,建议使用ORC格式。如果您在生态系统中使用多种工具,PARQUET在适应性方面是更好的选择。
Hadoop存档文件(HAR)是另一种将HDFS文件打包到存档的文件格式。这是在HDFS中存储大量小型文件的选项(不是一个好的选择),因为直接在HDFS中存储大量小型文件效率不高。但是,HAR还有其他限制,例如不可变存档过程,不可拆分以及兼容性问题。有关HAR和归档的更多信息,请参阅https:/ / cwiki.apache.org / confluence / display / Hive / LanguageManual Archiving中的Hive Wiki。
Hive中的压缩压缩技术可以通过正确压缩中间和最终输出数据,显着减少映射器和缩减器之间的数据传输量。因此,查询将具有更好的性能。要压缩多个MapReduce作业之间生成的中间文件,我们需要在命令行会话或hive-site.xml文件中设置以下属性(默认为false):

SET hive.exec.compress.intermediate = true
然后,我们需要决定配置哪个压缩编解码器。下表中列出了常用的编解码器:

Deflate(.deflate)是一个默认的编解码器,具有平衡的压缩比和CPU成本。 Gzip的压缩率非常高,CPU成本也是如此。 Bzip2是可拆分的,但考虑到巨大的CPU成本(如Gzip),压缩速度太慢。 LZO文件本身不可拆分,但我们可以预处理它们(使用com.hadoop.compression.lzo.LzoIndexer)来创建一个确定文件拆分的索引。当谈到CPU成本和压缩比的平衡时,LZ4或Snappy比Deflate做得更好,但Snappy更受欢迎。由于大多数压缩文件不可拆分,因此不建议压缩单个大文件。最佳实践是生成几个HDFS块大小的压缩文件,以便每个文件花费更少的时间进行处理。可以在mapred-site.xml,hivesite.xml或命令行会话中指定压缩编解码器,如下所示:> SET hive.intermediate.compression.codec = org.apache.hadoop.io.compress.SnappyCodec中间压缩只会为需要多个MapReduce作业的特定作业节省磁盘空间。为了进一步节省磁盘空间,可以压缩实际的Hive输出文件。当hive.exec.compress.output属性设置为true时,Hive将使用mapreduce.output.fileoutputformat.compress.codec属性配置的编解码器来压缩HDFS中的数据,如下所示。可以在hive-site.xml或命令行会话中设置这些属性:> SET hive.exec.compress.output = true> SET mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io .compress.SnappyCodec存储优化经常使用或扫描的数据可以识别为热数据。通常,热数据的查询性能对整体性能至关重要。增加HDFS中的数据复制因子(参见以下示例)以获取热数据可能会增加作业在本地命中数据的可能性并提高整体性能。但是,这是对存储的权衡:$ hdfs dfs -setrep -R -w 4 / user / hive / warehouse / employee复制4集:/ user / hive / warehouse / employee / 000000_0另一方面,太多了文件或冗余可能会使namenode的内存耗尽,特别是大量小于HDFS块大小的小文件。
Hadoop本身已经有一些解决方案可以通过以下方式处理许多小文件问题:性能注意事项第7章[135] Hadoop Archive / HAR:这些是用于打包以前引入的小文件的工具包。
SEQUENCEFILE格式:这是一种可用于将小文件压缩为更大文件的格式。
CombineFileInputFormat:一种InputFormat类型,用于在map和减少处理之前组合小文件。它是Hive的默认InputFormat(请参阅https:/ / issues.apache.org / jira / browse / HIVE-2245)。
HDFS Federation:它支持多个名称节点来管理更多文件。

我们还可以利用Hadoop生态系统中的其他工具,如下所示:HBase具有更小的块大小和更好的文件格式,可以处理较小的文件存储和访问问题Flume NG可以用作管道进行合并小文件到大文件开发和调度文件合并程序以合并HDFS中的小文件或在将文件加载到HDFS之前对于Hive,我们可以使用以下配置来合并查询结果的文件并避免重新创建小文件:hive.merge。 mapfiles:这会在仅限地图的作业结束时合并小文件。默认情况下,这是真的。
hive.merge.mapredfiles:这会在MapReduce作业结束时合并小文件。将其设置为true,因为默认值为false。
hive.merge.size.per.task:这定义了作业结束时合并文件的大小。默认值为256,000,000。
hive.merge.smallfiles.avgsize:这是触发文件合并的阈值。默认值为16,000,000。
当作业的平均输出文件大小小于hive.merge.smallfiles.avgsize属性和hive.merge.mapfiles(对于仅映射作业)和hive.merge.mapredfiles(对于MapReduce作业)指定的值时如果设置为true,Hive将启动一个额外的MapReduce作业,将输出文件合并为大文件。

三.作业优化

作业优化
作业优化包括在作业运行模式,JVM重用,作业并行运行 和 查询连接优化等方面提高性能的经验和技能。

1.本地模式
Hadoop可以在独立模式,伪分布模式和完全分布模式下运行。大多数情况下,我们需要将其配置为以完全分布式模式运行。当要处理的数据很小时,启动分布式数据处理是一种开销,因为完全分布式模式的启动时间比作业处理时间花费更多时间。从v0.7.0开始,Hive支持使用以下设置自动转换作业以在本地模式下运行:

SET hive.exec.mode.local.auto = true; - 默认false
SET hive.exec.mode.local.auto.inputbytes.max = 50000000;
SET hive.exec.mode.local.auto.input.files.max = 5; - 默认值4

作业必须满足以下条件才能在本地模式下运行:作业的总输入大小小于hive.exec.mode.local.auto.inputbytes.max设置的值。映射任务的总数小于hive.exec.mode.local.auto.input.files.max设置的值所需的reduce任务总数为1或0

2.JVM重用
默认情况下,Hadoop为每个map或reduce作业启动一个新的JVM,运行地图或并行减少任务。当map或reduce作业是一个只运行几秒钟的轻量级作业时,JVM启动过程可能是一个巨大的开销。 Hadoop可以通过共享JVM来串行运行mapper / reducer而不是并行运行,从而重用JVM。 JVM重用适用于映射或减少同一作业中的任务。来自不同作业的任务将始终在单独的JVM中运行。要启用重用,我们可以使用以下属性为单个作业设置JVM重用的最大任务数。它的默认值是1.如果设置为-1,则没有限制:

SET mapreduce.job.jvm.numtasks = 5;

3.并行执行
Hive查询通常被转换为由默认序列执行的多个阶段。这些阶段并不总是相互依赖。相反,它们可以并行运行以减少整个作业运行时间。我们可以使用以下设置启用此功能,并设置并行运行的预期作业数:

SET hive.exec.parallel = true; - 默认false
SET hive.exec.parallel.thread.number = 16; - 默认8

并行执行将增加群集利用率。如果集群的利用率已经非常高,那么并行执行在整体性能方面将无济于事。

4.连接优化
我们已经在第4章,数据关联和范围中讨论了不同类型的Hive连接的优化。在这里,我们将简要回顾一下连接改进的关键设置。
4.1公共连接
公共连接也称为reduce side join。它是HQL的基本连接,大部分时间都可以工作。
对于常见连接,我们需要确保大表位于最右侧或由命中指定,如下所示:
/ * STREAMTABLE(stream_table_name)* /映射连接当其中一个连接表小到足以适合时,使用映射连接在内存中,它很快但受表大小的限制。从Hive v0.7.0开始,它已经能够使用以下
设置自动转换Map连接:

SET hive.auto.convert.join = true; - 在v0.11.0之后默认为true
SET hive.mapjoin.smalltable.filesize = 600000000; - 默认25m
SET hive.auto.convert.join.noconditionaltask = true; - 上面的默认值为true,因此不需要map join提示
SET hive.auto.convert.join.noconditionaltask.size = 10000000; - 上面的默认值控制表的大小以适应内存一旦启用了join auto-convert,Hive将自动检查较小的表文件大小是否大于hive.mapjoin.smalltable.filesize指定的值,然后它将联接转换为公共联接。如果文件大小小于此阈值,它将尝试将公共连接转换为Map连接。启用自动转换连接后,无需在查询中提供地图连接提示。

4.2存储桶映射连接

存储桶映射连接是应用于存储桶表的特殊类型的映射连接。要启用存储桶映射连接,我们需要启用以下设置:

SET hive.auto.convert.join = true;
SET hive.optimize.bucketmapjoin = true; - default false

在桶映射连接中,所有连接表必须是存储桶表并在存储桶列上连接。
此外,较大表中的桶号必须是较小表中桶号的倍数。

4.3 排序合并存储桶(SMB)连接SMB是对具有相同排序,存储桶和连接条件列的存储桶表执行的连接。它从两个存储桶表读取数据,并在存储桶表上执行常见连接(映射和减少触发)。我们需要启用以下属性才能使用
SMB:

SET hive.input.format => org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
SET hive.auto.convert.sortmerge.join = true; > SET hive.optimize.bucketmapjoin = true;
SET hive.optimize.bucketmapjoin.sortedmerge = true;
SET hive.auto.convert.sortmerge.join.noconditionaltask = true;
排序合并存储桶映射(SMBM)连接SMBM连接是一种特殊的存储桶连接,但仅触发映射端连接。它可以避免缓存内存中的所有行,就像Map连接一样。要执行SMBM连接,连接表必须具有相同的存储桶,排序和连接条件列。要启用此类连接,我们需要启用以下设置:
SET hive.auto.convert.join = true;
SET hive.auto.convert.sortmerge.join = true
SET hive.optimize.bucketmapjoin = true;
SET hive.optimize.bucketmapjoin.sortedmerge = true;
SET hive.auto.convert.sortmerge.join.noconditionaltask = true;
SET hive.auto.convert.sortmerge.join.bigtable.selection.policy = org.apache.hadoop.hive.ql.optimizer.TableSizeBasedBigTableSelectorForAutoSM J;

4.4 偏斜连接当处理具有高度不均匀分布的数据时,数据偏斜可能以少量计算节点必须处理大部分计算的方式发生。如果发生数据倾斜,以下设置会通知Hive正确优化:

SET hive.optimize.skewjoin = true; - 如果连接中存在数据偏斜,请将其设置为true。默认值为false。
SET hive.skewjoin.key = 100000; - 这是默认值。如果密钥的数量大于 - 这,则新密钥将发送给其他未使用的减速器。

4.5 GROUP BY数据也可能出现偏差数据。为了优化它,我们需要设置hive.groupby.skewindata = true以使用前面的设置来启用GROUP BY结果中的偏斜数据优化。配置完成后,Hive将首先触发另一个MapReduce作业,该作业的Map输出将随机分配到reducer以避免数据偏斜。

有关连接优化的更多信息,请参阅https:/ / cwiki上的Hive Wiki.apache.org / confluence / display / Hive / LanguageManual JoinOptimization和https:/ / cwiki.apache .org / confluence / display / Hive / Skewed Join Optimization。

5.作业引擎

Hive支持在不同引擎上运行作业。引擎的选择也会影响整体性能。但是,与其他设置相比,这是一个更大的变化。此外,此更改需要重新启动服务,而不是暂时使其在命令行会话中生效。以下是设置引擎的语法以及每个引擎的详细信息:
SET hive.execution.engine = ; - = mr | tez | spark mr:这是默认引擎MapReduce。它在Hive v2.0.0之后被弃用。
tez:Tez(http:// tez.apache.org.org)是一个基于Yarn构建的应用程序框架,可以执行复杂的有向无环图(DAG)以执行常规数据处理任务。 Tez进一步分割地图并将作业减少为较小的任务,并以灵活有效的方式将它们组合起来执行。 Tez被认为是MapReduce框架的灵活且强大的后继者。 Tez已经投入生产并且大部分时间都在用它来取代先进的发动机。
spark:Spark是另一个通用的大数据框架。它的组件Spark SQL支持HQL的一个子集,并提供与HQL类似的语法。通过使用Hive over Spark,Hive可以利用Spark的内存计算模型以及Hive成熟的基于成本的优化器。但是,Hive over Spark需要手动配置,并且在生产中仍然缺乏可靠的用例。有关Hive over Spark的更多详细信息,请参阅Wiki页面(https:/ / cwiki。
Spark%3A开始使用apache.org / confluence / display / Hive / Hive)。

mr3:MR3是另一个实验引擎(https:/ / mr3。postech.ac.kr /)。它类似于Tez,但具有更简单的设计,更好的性能和更多功能的增强功能。 MR3已记录为可供生产使用,并支持Tez的所有主要功能,例如基于Kerberos的安全性,身份验证和授权,容错和恢复。但是,它缺乏可靠的生产用例和生产部署的最佳实践,以及CDH或HDP分发支持。

在Hive v2.0.0中添加了Live Long And Process(LLAP)功能。它结合了长时间运行的查询服务和智能内存缓存,可以提供快速查询。 LLAP与作业引擎一起提供混合执行模型,以提高整体Hive性能。 LLAP需要通过Apache Slider(https:/ / slider。孵化器。apache。org /)现在只适用于Tez。在未来,它将支持其他引擎。最近的HDP提供了LLAP支持的思想Tez。

优化器与关系数据库类似,Hive在提交最终执行之前生成并优化每个查询的逻辑和物理执行计划。现在,Hive中有两个主要的优化器可以进一步优化查询性能,即Vectorize和基于成本的优化(CBO)。
矢量化优化矢量化优化同时处理更大批量的数据,而不是一次处理一行,从而显着降低计算开销。每个批处理包含一个列向量,通常是一个基本类型数组。对整个列向量执行操作,这改进了指令管道和高速缓存使用。文件必须以ORC格式存储才能使用矢量化。有关矢量化的更多详细信息,请参阅Hive Wiki(https:/ / cwiki.apache.org / confluence / display / Hive / Vectorized Query Execution)。要启用矢量化,我们需要使用以下设置:> SET hive.vectorized.execution.enabled = true; - 默认false基于成本的优化Hive中的CBO由Apache Calcite(http:/ / calcite。apache.org /)提供支持,这是一个开源的,企业级的基于成本的逻辑优化器和查询执行框架。
Hive CBO通过检查由ANALYZE语句或Metastore本身收集的查询成本来生成有效的执行计划,最终减少查询执行时间并降低资源利用率。要使用CBO,请设置以下属性:

SET hive.cbo.enable = true; - 在v0.14.0之后默认为true
SET hive.compute.query.using.stats = true; - 默认为false
SET hive.stats.fetch.column.stats = true; - default false
SET hive.stats.fetch.partition.stats = true; - default true

这里推荐2本英文书:

2018.06 page204 Apache Hive Essentials, 2nd Edition.pdf
2016 page282 Practical.Hive.A.Guide.to.Hadoops.Data.Warehouse.System.pdf
写的很专业,可操作性强。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开心自由天使

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值