首页 > 数据库 >【Hive进阶】-- Hive SQL、Spark SQL和 Hive on Spark SQL

【Hive进阶】-- Hive SQL、Spark SQL和 Hive on Spark SQL

时间:2023-03-20 13:08:17浏览次数:59  
标签:支持 查询 Hive SQL Spark 数据


1.Hive SQL

1.1 基本介绍

概念

Hive由Facebook开发,用于解决海量结构化日志的数据统计,于2008年贡献给 Apache 基金会。

Hive是基于Hadoop的数据仓库工具,可以将结构化数据映射为一张表,提供类似SQL语句查询功能

本质:将Hive SQL转化成MapReduce程序。

与关系型数据库的对比


项目

Hive

关系型数据库

数据存储

HDFS

磁盘

查询语言

HQL

SQL

处理数据规模

分区

支持

支持

扩展性

非常有限

数据写入

支持批量导入/单条写入

支持批量导入/单条写入

索引

0.7版本后添加了索引(不怎么使用)

支持复杂索引

执行延迟

数据加载模式

读时模式(快)

写时模式(慢)

应用场景

海量数据查询

实时查询


PS:

读时模式: Hive 在加载数据到表中的时候不会校验.
写时模式: Mysql 数据库插入数据到表的时候会进行校验.

适用场景

Hive只适合用来做海量离线的数据统计分析,也就是数据仓库。

1.2 架构



【Hive进阶】-- Hive SQL、Spark SQL和 Hive on Spark SQL_大数据


(1)Client(用户接口)
JDBC(java访问Hive);ODBC(Open Database Connectivity);Client(hive shell);WEBUI(浏览器访问Hive)

(2)元数据(MetaStore)
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段,标的类型(表是否为外部表)、表的数据所在目录。这是数据默认存储在Hive自带的derby数据库中,推荐使用MySQL数据库存储MetaStore。

(3)Hadoop/HBase集群
使用 HDFS 进行存储数据,使用 MapReduce 进行计算。

(4)Driver(驱动器)
解析器(SQL Parser):将SQL字符串换成抽象语法树AST,对AST进行语法分析,判断表是否存在、字段是否存在、SQL语义是否有误。
优化器(Query Optimizer):将逻辑计划进行优化。
编译器(Physical Plan):将AST编译成逻辑执行计划。
执行器(Execution):把执行计划转换成可以运行的物理计划。对于Hive来说默认就是Mapreduce任务。

PS:从 hive-0.10.x开始,少数 Hql 不需要执行 MR,但是需要开启参数:

hive.fetch.task.conversion = more

添参数后,简单的查询,如select,不带count,sum,group by的 SQL,都不走map/reduce,直接读取hdfs文件进行filter过滤。

2.Spark SQL

2.1 基本介绍

概念

Spark SQL主要用于结构型数据处理,它的前身为Shark,在Spark 1.3.0版本后才成长为正式版,可以彻底摆脱之前Shark必须依赖HIVE的局面。与过去的Shark相比,一方面Spark SQL提供了强大的DataFrame API,另一方面则是利用Catalyst优化器,并充分利用了Scala语言的模式匹配与quasiquotes,为Spark提供了更好的查询性能。

在Databricks工程师撰写的论文《​​Spark SQL: Relational Data Processing in Spark​​》中,给出了Spark SQL与Shark以及Impala三者间的性能对比,如下图所示:



【Hive进阶】-- Hive SQL、Spark SQL和 Hive on Spark SQL_spark_02


Michael Armbrust、Yin Huai等人写的博客《​​Deep Dive into Spark SQL’s Catalyst Optimizer​​》简单介绍了Catalyst的优化机制。

特点

与 Spark 集成

Spark SQL 查询与 Spark 程序集成。Spark SQL 允许我们使用 SQL 或可在 Java、Scala、Python 和 R 中使用的 DataFrame API 查询 Spark 程序中的结构化数据。要运行流式计算,开发人员只需针对 DataFrame / Dataset API 编写批处理计算, Spark 会自动增加计算量,以流式方式运行它。这种强大的设计意味着开发人员不必手动管理状态、故障或保持应用程序与批处理作业同步。相反,流式作业总是在相同数据上给出与批处理作业相同的答案。

统一数据访问

DataFrames 和 SQL 支持访问各种数据源的通用方法,如 Hive、Avro、Parquet、ORC、JSON 和 JDBC。这将连接这些来源的数据。这对于将所有现有用户容纳到 Spark SQL 中非常有帮助。

Hive兼容性

Spark SQL 对当前数据运行未经修改的 Hive 查询。它重写了 Hive 前端和元存储,允许与当前的 Hive 数据、查询和 UDF 完全兼容。

标准连接

连接是通过 JDBC 或 ODBC 进行的。JDBC和 ODBC 是商业智能工具连接的行业规范。

性能和可扩展性

Spark SQL 结合了基于成本的优化器、代码生成和列式存储,在使用 Spark 引擎计算数千个节点的同时使查询变得敏捷,提供完整的中间查询容错。Spark SQL 提供的接口为 Spark 提供了有关数据结构和正在执行的计算的更多信息。在内部,Spark SQL 使用这些额外信息来执行额外优化。Spark SQL 可以直接从多个来源(文件、HDFS、JSON/Parquet 文件、现有 RDD、Hive 等)读取。它确保现有 Hive 查询的快速执行。

下图描述了 Spark SQL 与 Hadoop 相比的性能。Spark SQL 的执行速度比 Hadoop 快 100 倍。



【Hive进阶】-- Hive SQL、Spark SQL和 Hive on Spark SQL_Powered by 金山文档_03


适用场景

实时计算 & 离线批量计算。

2.2 架构



【Hive进阶】-- Hive SQL、Spark SQL和 Hive on Spark SQL_spark_04


3.Hive on Spark SQL

3.1基本介绍

Hive on Spark是由Cloudera发起,由Intel、MapR等公司共同参与的开源项目,其目的是把Spark作为Hive的一个计算引擎,将Hive的查询作为Spark的任务提交到Spark集群上进行计算。

通过该项目,可以提高Hive查询的性能,同时为已经部署了Hive或者Spark的用户提供了更加灵活的选择,从而进一步提高Hive和Spark的普及率。参考:​​javascript:void(0)​​

3.2 架构



【Hive进阶】-- Hive SQL、Spark SQL和 Hive on Spark SQL_Powered by 金山文档_05


参考:​​http://people.csail.mit.edu/matei/papers/2015/sigmod_spark_sql.pdf​

(1)Client
执行 bin/spark-sql 或者 bin/spark-shell 进入客户端
jdbc/odbc 的server
用户编程的 jar 包

(2)Metastore
元数据管理中心,即为 Hive 的metastore

(3)Driver
1)sql parser:基于antlr框架对 sql解析,生成抽象语法树
2)Analyzer:通过分析器,结合catalog,把logical plan和实际的数据绑定起来,将unresolve logical plan生成 logical plan
3)Catalyst optimizer
a.Logic plan:由 Analyzer 生成,称为 Unresolved Logical Plan
b.Cache Manager:缓存替换:替换有相同结果的 logical plan,在分析器之后,optimizer logic plan 之前发生
c.Optimizer logic plan:基于规则的优化;优化执行器 RuleExecutor 生成 spark plan
4)Physical plan:获取一个逻辑计划,并使用与 Spark执行引擎匹配的物理操作来生成一个或多个物理计划,然后使用CBO的模型在这个多个物理计划中选择最优的那个
5)Execution:使用 QueryExecution 执行物理计划,此时则调用 SparkPlan的execute() 方法,生成 RDD

(4)RDD
弹性分布式数据集,注意其5大特性:一个分区列表、func 作用于每个分区、宽窄依赖、就近原则、tuple

(5)HDFS/对象存储(如OSS、S3、COS、OBS 等)
HDFS: Hadoop Distributed File System -- Apache
OSS: Object Storage Service -- 阿里云
COS: CloudObjectStorage -- 腾讯云
OBS: Object Storage Service -- 华为云
S3: Simple Storage Service -- Amazon

4.Hive SQL和 Spark sql 的区别

相同点

都支持ThriftServer服务,为JDBC提供解决方案
都支持静态分区、动态分区
都支持多种文件存储格式:text、parquet、orc等
都支持 UDF 函数

不同点

Spark SQL 是 Spark 的一个库文件
Spark SQL 中 schema 是自动推断的
Spark SQL 支持标准 SQL 语句,也支持 HQL 语句等(即支持SQL方式开发,也支持HQL开发,还支持函数式编程(DSL)实现SQL语句)
Spark SQL 支持 Spark Datasets 和 Spark DataFrames 的操作,而 Hive SQL 仅支持 Hive 表的操作。
Spark SQL 支持使用 Spark API 和 SQL 同时进行数据处理,而 Hive SQL 仅支持 SQL 操作。
Hive中必须有元数据,一般由 MySql 管理,必须开启 metastore 服务
Hive 中在建表时必须明确使用 DDL 声明 schema

标签:支持,查询,Hive,SQL,Spark,数据
From: https://blog.51cto.com/u_13966077/6132575

相关文章

  • PostgreSQL temp table 全链路 实现原理
    文章目录​​背景​​​​使用​​​​实现​​​​创建表​​​​插入​​​​删除表​​背景表(table/relation)作为PostgreSQL数据库中最为常用的一种数据库对象,用户......
  • MySQL锁机制
        上文总结了MySQL的隔离级别,而隔离级别是通过锁机制实现的,所以针对锁机制展开详细描述。    首先介绍MySQL的锁可以分为:享/读/共享锁SharedLocks:针......
  • MySql前缀索引解析
    一、什么是前缀索引所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前10位来建索引,这样建立起来的索引更小,查询效......
  • ShardingSphere5.0.0-Sharding-proxy MySql 读写分离
    一、关于ShardingSphere 官网:​​ApacheShardingSphere​​官方文档:​​概览::ShardingSphere​​官方下载:​​Indexof/dist/shardingsphere​​本文使用版本:apache-sh......
  • MySQL事务隔离级别
        大家都知道,MySQL的事务特性ACID,那么本文就针对I(隔离性)做出详细说明。    MySQL中事务的隔离级别分为四大等级,分别是读未提交READUNCOMMIT、读提交RE......
  • ShardingSphere5.0.0-Sharding-proxy MySql 读写分离
    一、关于ShardingSphere 官网:ApacheShardingSphere官方文档:概览::ShardingSphere官方下载:Indexof/dist/shardingsphere本文使用版本:apache-shardingsphere-5.0.0......
  • mysql datetime is null
    mysql中时间字段datetime怎么判断为空和不为空一般为空都用null表示,所以一句sql语句就可以。select*from表名where日期字段isnull;这里要注意null的用法,不可以用=nu......
  • mysqldump + binlog实现增量备份
    1、核心思路搞明白一件事:到底什么是增量备份?答:①要有全量备份②继续增删改数据③再次需要备份时,不需要进行全量备份,只需要备份binlog日志文件即可(因为binlog日志记录了......
  • mysql5.6以下排序
    SELECTtt.id,(@rowNum:=@rowNum+1)ASrankingFROM(select5asidunionallselect4asidunionallselect3asidunionallselect2asidunionall......
  • Spring Boot 如果防护 XSS + SQL 注入攻击 ?一文带你搞定!
    1.XSS跨站脚本攻击①:XSS漏洞介绍跨站脚本攻击XSS是指攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被解析执行,从而达到恶意攻......