大数据篇(2-1)--Hive(1)简介

本文介绍了Hive作为Hadoop上的数据仓库,其特性包括SQL查询便利性、元数据管理、执行流程和多种存储格式的选择。重点讲解了体系架构、HQL执行过程以及如何通过STOREDAS指定存储格式。

一、Hive是什么


        Hive 是一个构建在 Hadoop 之上的数据仓库,它可以将结构化的数据文件映射成表,并提供类 SQL 查询功能,用于查询的 SQL 语句会被转化为 MapReduce 作业,然后提交到 Hadoop 上运行。

特点:

  1. 简单、容易上手 (提供了类似 sql 的查询语言 hql),使得精通 sql 但是不了解 Java 编程的人也能很好地进行大数据分析
  2. 灵活性高,可以自定义用户函数 (UDF) 和存储格式
  3. 为超大的数据集设计的计算和存储能力,集群扩展容易
  4. 统一的元数据管理,可与 presto/impala/sparksql 等共享数据
  5. 执行延迟高,不适合做数据的实时处理,但适合做海量数据的离线处理。

二、Hive的体系架构


1)command-line shell & thrift/jdbc

        可以用 command-line shell 和 thrift/jdbc 两种方式来操作数据:

  • command-line shell:通过 hive 命令行的的方式来操作数据;
  • thrift/jdbc:通过 thrift 协议按照标准的 JDBC 的方式操作数据。

2)Metastore

        在 Hive 中,表名、表结构、字段名、字段类型、表的分隔符等统一被称为元数据。所有的元数据默认存储在 Hive 内置的 derby 数据库中,但由于 derby 只能有一个实例,也就是说不能有多个命令行客户端同时访问,所以在实际生产环境中,通常使用 MySQL 代替 derby。

        Hive 进行的是统一的元数据管理,就是说你在 Hive 上创建了一张表,然后在 presto/impala/sparksql 中都是可以直接使用的,它们会从 Metastore 中获取统一的元数据信息,同样的你在 presto/impala/sparksql 中创建一张表,在 Hive 中也可以直接使用。

3)HQL的执行流程

        Hive 在执行一条 HQL 的时候,会经过以下步骤:

  1. 语法解析:Antlr 定义 SQL 的语法规则,完成 SQL 词法,语法解析,将 SQL 转化为抽象 语法树 AST Tree;
  2. 语义解析:遍历 AST Tree,抽象出查询的基本组成单元 QueryBlock;
  3. 生成逻辑执行计划:遍历 QueryBlock,翻译为执行操作树 OperatorTree;
  4. 优化逻辑执行计划:逻辑层优化器进行 OperatorTree 变换,合并不必要的 ReduceSinkOperator,减少 shuffle 数据量;
  5. 生成物理执行计划:遍历 OperatorTree,翻译为 MapReduce 任务;
  6. 优化物理执行计划:物理层优化器进行 MapReduce 任务的变换,生成最终的执行计划。

三、存储格式


支持的存储格式

        Hive 会在 HDFS 为每个数据库上创建一个目录,数据库中的表是该目录的子目录,表中的数据会以文件的形式存储在对应的表目录下。Hive 支持以下几种文件存储格式:

格式

说明

TextFile

存储为纯文本文件。 这是 Hive 默认的文件存储格式。这种存储方式数据不做压缩,磁盘开销大,数据解析开销大。

SequenceFile

SequenceFile 是 Hadoop API 提供的一种二进制文件,它将数据以<key,value>的形式序列化到文件中。这种二进制文件内部使用 Hadoop 的标准的 Writable 接口实现序列化和反序列化。它与 Hadoop API 中的 MapFile 是互相兼容的。Hive 中的 SequenceFile 继承自 Hadoop API 的 SequenceFile,不过它的 key 为空,使用 value 存放实际的值,这样是为了避免 MR 在运行 map 阶段进行额外的排序操作。

RCFile

RCFile 文件格式是 FaceBook 开源的一种 Hive 的文件存储格式,首先将表分为几个行组,对每个行组内的数据按列存储,每一列的数据都是分开存储。

ORC Files

ORC 是在一定程度上扩展了 RCFile,是对 RCFile 的优化。

Avro Files

Avro 是一个数据序列化系统,设计用于支持大批量数据交换的应用。它的主要特点有:支持二进制序列化方式,可以便捷,快速地处理大量数据;动态语言友好,Avro 提供的机制使动态语言可以方便地处理 Avro 数据。

Parquet

Parquet 是基于 Dremel 的数据模型和算法实现的,面向分析型业务的列式存储格式。它通过按列进行高效压缩和特殊的编码技术,从而在降低存储空间的同时提高了 IO 效率。

以上压缩格式中 ORC 和 Parquet 的综合性能突出,使用较为广泛,推荐使用这两种格式。

指定存储格式

通常在创建表的时候使用 STORED AS 参数指定:

CREATE TABLE page_view(viewTime INT, userid BIGINT)
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\001'
   COLLECTION ITEMS TERMINATED BY '\002'
   MAP KEYS TERMINATED BY '\003'
 STORED AS SEQUENCEFILE;

 

各个存储文件类型指定方式如下:

  • STORED AS TEXTFILE
  • STORED AS SEQUENCEFILE
  • STORED AS ORC
  • STORED AS PARQUET
  • STORED AS AVRO
  • STORED AS RCFILE

 更多Hive内容:

大数据篇(2-1)--Hive(1)简介

大数据篇(2-2)--Hive(2)Hive分区表和分桶表

大数据篇(2-3)--Hive(3)Hive调优

### 数据倾斜问题概述 数据倾斜是指在大数据处理过程中,某些特定的任务或节点分配到了过多的数据量或计算负载,而其他任务或节点则相对轻松。这种不平衡会显著影响整个系统的性能和效率[^3]。 #### 数据倾斜的原因 数据倾斜的主要原因可以归纳为以下几个方面: - **数据分布不均**:如果原始数据本身存在明显的偏态分布,则可能会导致部分Key对应大量的记录,而另一些Key对应的记录较少甚至为空。 - **业务场景特性**:例如,在日志分析中常见的IP地址字段可能集中于少量热门IP;或者电商交易订单里可能存在极少数商品ID占据了大部分销量情况下的统计操作都会引发严重的数据倾斜现象[^1]。 #### 解决方案分类 针对上述提到的各种类型的倾斜状况,可以从不同角度出发采取相应的措施来缓解这一难题: ##### 无损方式 对于那些无法简单丢弃却又能独立完成的小规模子集可以通过如下手段加以优化: - 对分布极度失衡的部分单独提取出来另行运算后再合并结果,这样既能保留全部有用信息又不会拖累整体进度. 具体实现时可先按指定维度分组计数找出异常值集合之后再针对性地实施特殊策略. ##### 有损方式 当允许一定程度上的精度损失时还可以考虑采用下面几种简化办法快速降低复杂度: - 排除极端样本点如零值项等明显干扰因素可以直接舍弃不予理会; 通过增加额外的哈希层使得原本高度聚集在一起的大块被打散重新分配到更多可用资源上去承担负荷从而达到平衡效果的目的. ```python from pyspark.sql import SparkSession # 创建Spark Session实例 spark = SparkSession.builder.appName("DataSkewSolution").getOrCreate() # 加载Hive表作为DataFrame对象 df = spark.table("your_hive_table") # 方法一:对key进行二次Hash以减少热点分区的压力 hashed_df = df.selectExpr("*", "ABS(HASH(key_column)) % num_partitions AS hash_key") repartitioned_df = hashed_df.repartition("hash_key") # 方法二:预聚合技术用于减轻下游Join过程中的负担 pre_aggregated_df = df.groupBy("join_key").agg({"value_column": "sum"}).alias("a") final_result = pre_aggregated_df.join(another_df.alias("b"), col("a.join_key") == col("b.id")) # 展示最终结果 final_result.show() ``` 以上代码片段展示了如何利用PySpark框架有效应对可能出现的数据倾斜挑战的一些基本思路和技术细节说明[^2]. ### 结论 综上所述,面对日益复杂的实际应用场景需求变化莫测所带来的各种潜在风险隐患,我们需要不断学习探索更加高效合理的算法模型设计原则以及灵活运用各类工具平台所提供的强大功能特性相结合才能更好地满足未来发展的新要求。 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sun cat

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

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

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

打赏作者

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

抵扣说明:

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

余额充值