基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(二)

目录

二、Hive、SparkSQL、Impala 比较

1. SparkSQL 简介

2. Hive、SparkSQL、Impala 比较

(1)功能

(2)架构

(3)场景

3. Hive、SparkSQL、Impala 性能对比

(1)cloudera 公司 2014 年做的性能基准对比测试

(2)SAS 公司 2013 年做的 Impala 和 Hive 的对比测试


二、Hive、SparkSQL、Impala 比较

        Hive、SparkSQL 和 Impala 三种分布式 SQL 查询引擎都是 SQL-on-Hadoop 解决方案,但又各有特点。前面已经讨论了 Hive 和 Impala,本节先介绍一下 SparkSQL,然后从功能、架构、使用场景几个角度比较这三款产品的异同,最后附上分别由 cloudera 公司和 SAS 公司出示的关于这三款产品的性能对比报告。

1. SparkSQL 简介

        SparkSQL 是 Spark 的一个处理结构化数据的程序模块。与其他基本的 Spark RDD API 不同,SparkSQL 提供的接口包含更多关于数据和计算的结构信息,SparkSQL 会利用这些额外信息执行优化。可以通过 SQL 和数据集 API 与 SparkSQL 交互,但无论使用何种语言或 API 向 SparkSQL 发出请求,其内部都使用相同的执行引擎,这种统一性方便开发者在不同的 API 间进行切换。

        SparkSQL 具有如下特性:

  • 集成 —— 将 SQL 查询与 Spark 程序无缝集成。SparkSQL 可以将结构化数据作为 Spark 的RDD(Resilient Distributed Datasets,弹性分布式数据集)进行查询,并整合了 Scala、Java、Python、R 等语言的 API。这种集成可以使开发者只需运行 SQL 查询就能完成复杂的分析算法。
  • 统一数据访问 —— 通过 Schema-RDDs 为高效处理结构化数据而提供的单一接口,SparkSQL 可以从 Hive 表、parquet 或 JSON 文件等多种数据源查询数据,也可以向这些数据源装载数据。
  • 与 Hive 兼容 —— 已有数据仓库上的 Hive 查询无需修改即可运行。SparkSQL 复用 Hive 前端和元数据存储,与已存的 Hive 数据、查询和 UDFs 完全兼容。
  • 标准的连接层 —— 使用 JDBC 或 ODBC 连接。SparkSQL 提供标准的 JDBC、ODBC 连接方式。
  • 可扩展性 —— 交互式查询与批处理查询使用相同的执行引擎。SparkSQL 利用 RDD 模型提供容错和扩展性。

        SparkSQL 架构如下图所示。

        此架构包括 Language API、Schema RDD、Data Sources 三层。

  • Language API —— Spark SQL 与多种语言兼容,并提供这些语言的 API。
  • Schema RDD —— Schema RDD 是存放 Row 对象的 RDD,每个 Row 对象代表一行记录。Schema RDD 还包含记录的结构信息(即数据字段),它可以利用结构信息高效地存储数据。Schema RDD 支持 SQL 查询操作。
  • Data Sources —— 一般 Spark 的数据源是文本文件或 Avro 文件,而 SparkSQL 的数据源却有所不同。其数据源可能是 Parquet 文件、JSON 文档、Hive 表或 Cassandra 数据库。

2. Hive、SparkSQL、Impala 比较

(1)功能

        Hive:

  • 是简化数据抽取、转换、装载的工具。
  • 提供一种机制,给不同格式的数据加上结构。
  • 可以直接访问 HDFS 上存储的文件,也可以访问 HBase 的数据。
  • 通过 MapReduce 执行查询。
  • Hive 定义了一种叫做 HiveQL 的简单的类 SQL 查询语言,用户只要熟悉 SQL,就可以使用它查询数据。同时,HiveQL 语言也允许熟悉 MapReduce 计算框架的程序员添加定制的 mapper 和 reducer 插件,执行该语言内建功能不支持的复杂分析。
  • 用户可以定义自己的标量函数(UDF)、聚合函数(UDAF)和表函数(UDTF)。
  • 支持索引压缩和位图索引。
  • 支持文本、RCFile、HBase、ORC。等多种文件格式或存储类型。
  • 使用 RDBMS 存储元数据,大大减少了查询执行时语义检查所需的时间。
  • 支持 DEFLATE、BWT 或 snappy 等算法操作 Hadoop 生态系统内存储的数据。
  • 大量内建的日期、数字、字符串、聚合、分析函数,并且支持 UDF 扩展内建函数。
  • HiveQL 隐式转换成 MapReduce 或 Spark 作业。

        SparkSQL:

  • 支持 Parquet、Avro、Text、JSON、ORC 等多种文件格式。
  • 支持存储在 HDFS、HBase、Amazon S3 上的数据操作。
  • 支持 snappy、lzo、gzip 等典型的 Hadoop 压缩编码方式。
  • 通过使用“shared secret”提供安全认证。
  • 支持 Akka 和 HTTP 协议的 SSL 加密。
  • 保存事件日志。
  • 支持 UDF。
  • 支持并发查询和作业的内存分配管理(可以指定 RDD 只存内存中、或只存磁盘上、或内存和磁盘都存)。
  • 支持把数据缓存在内存中。
  • 支持嵌套结构。

        Impala:

  • 支持 Parquet、Avro、Text、RCFile、SequenceFile 等多种文件格式。
  • 支持存储在 HDFS、HBase、Amazon S3 上的数据操作。
  • 支持多种压缩编码方式:Snappy(有效平衡压缩率和解压缩速度)、Gzip(最高压缩率的归档数据压缩)、Deflate(不支持文本文件)、Bzip2、LZO(只支持文本文件)。
  • 支持 UDF 和 UDAF。
  • 自动以最有效的顺序进行表连接。
  • 允许定义查询的优先级排队策略。
  • 支持多用户并发查询。
  • 支持数据缓存。
  • 提供计算统计信息(COMPUTE STATS)。
  • 提供窗口函数(聚合 OVER PARTITION、RANK、LEAD、LAG、NTILE 等等)以支持高级分析功能。
  • 支持使用磁盘进行连接和聚合,当操作使用的内存溢出时转为磁盘操作。
  • 允许在 where 子句中使用子查询。
  • 允许增量统计 —— 只在新数据或改变的数据上执行统计计算。
  • 支持 maps、structs、arrays 上的复杂嵌套查询。
  • 可以使用 Impala 插入或更新 HBase。

(2)架构

        Hive:

        构建在 Hadoop 之上,查询管理分布式存储上的大数据集的数据仓库组件。底层使用 MapReduce 计算框架,Hive 查询被转化为 MapReduce 代码并执行。生产环境建议使用 RDBMS 存储元数据。支持 JDBC、ODBC、CLI 等连接方式。

        SparkSQL:

        底层使用 Spark 计算框架,提供有向无环图,比 MapReduce 更灵活。SparkSQL 以 Schema RDD 为核心,模糊了 RDD 与关系表之间的界线。Schema RDD 是一个由 Row 对象组成的 RDD,附带包含每列数据类型的结构信息。Spark SQL 复用 Hive 的元数据存储。支持 JDBC、ODBC、CLI 等连接方式,并提供多种语言的 API。

        Impala:

        底层采用 MPP 技术,支持快速交互式 SQL 查询。与 Hive 共享元数据存储。Impalad 是核心进程,负责接收查询请求并向多个数据节点分发任务。statestored 进程负责监控所有 Impalad 进程,并向集群中的节点报告各个 Impalad 进程的状态。catalogd 进程负责广播通知元数据的最新信息。

(3)场景

        Hive:

        适用场景:

  • 周期性转换大量数据,例如:每天晚上导入 OLTP 数据并转换为星型模式;每小时批量转换数据等。
  • 整合遗留的数据格式,例如:将 CSV 数据转换为 Avro;将一个用户自定义的内部格式转换为 Parquet 等。

        不适用场景:

  • 商业智能,例如:与 Tableau 结合进行数据探查;与 Micro Strategy 一个出报表等。
  • 交互式查询,例如:OLAP 查询。

        SparkSQL:

        适用场景:

  • 从 Hive 数据仓库中抽取部分数据,使用 Spark 进行分析。

        不适用场景:

  • 商业智能和交互式查询。

        Impala:

        适用场景:

  • 秒级的响应时间
  • OLAP
  • 交互式查询

        不适用场景:

  • ETL
  • UDAF

3. Hive、SparkSQL、Impala 性能对比

(1)cloudera 公司 2014 年做的性能基准对比测试

        原文链接:Cloudera Blog

        先看一下测试结果:

  • 对于单用户查询,Impala 比其他方案最多快 13 倍,平均快 6.7 倍。
  • 对于多用户查询,差距进一步拉大:Impala 比其他方案最多快 27.4 倍,平均快 18 倍。

        下面看看这个测试是怎么做的。

        配置:

        所有测试都运行在一个完全相同的 21 节点集群上,每个节点只配有 64GB 内存。之所以内存不配大,就是为了消除人们对于 Impala 只有在非常大的内存上才有好性能的错误认识:

  • 双物理 CPU,每个 12 核,Intel Xeon CPU E5-2630L 0 at 2.00GHz。
  • 12 个磁盘驱动器,每个磁盘 932GB,1 个用作 OS,其他用作 HDFS。
  • 每节点 64GB 内存。

        对比产品:

  • Impala 1.4.0
  • Hive-on-Tez 0.13
  • Spark SQL 1.1
  • Presto 0.74

        查询:

  • 21 个节点上的数据量为 15TB。
  • 测试场景取自 TPC-DS,一个开放的决策支持基准(包括交互式、报表、分析式查询)。
  • 由于除 Impala 外,其他引擎都没有基于成本的优化器,本测试使用的查询都使用 SQL-92 标准的连接。
  • 采用统一的 Snappy 压缩编码方式,各个引擎使用各自最优的文件格式,Impala 和 SparkSQL 使用 Parquet,Hive-on-Tez 使用 ORC,Presto 使用 RCFile。
  • 对每种引擎多次运行和调优。

        结果:

        单用户如下图所示。

        多用户如下图所示。

        查询吞吐率如下图所示。

        Impala 本身就是 cloudera 公司的主打产品,因此只听其一面之词未免有失偏颇,下面就再看一个 SAS 公司的测试。

(2)SAS 公司 2013 年做的 Impala 和 Hive 的对比测试

        硬件:

  • Dell M1000e server rack
  • 10 Dell M610 blades
  • Juniper EX4500 10 GbE switch

        刀片服务器配置:

  • Intel Xeon X5667 3.07GHz processor
  • Dell PERC H700 Integrated RAID controller
  • Disk size: 543 GB
  • FreeBSD iSCSI Initiator driver
  • HP P2000 G3 iSCSI dual controller
  • Memory: 94.4 GB

        软件:

  • Linux 2.6.32
  • Apache Hadoop 2.0.0
  • Apache Hive 0.10.0
  • Impala 1.0
  • Apache MapReduce 0.20.2

        数据:

        数据模型如下图所示。

        各表的数据量如下图所示。

        PAGE_CLICK_FLAT 表使用 Compressed Sequence 文件格式,大小 124.59 GB。

        查询:

        使用了以下 5 条查询语句。

-- What are the most visited top-level directories on the customer support website for a given week and year?
select top_directory, count(*) as unique_visits   from (select distinct visitor_id, split(requested_file, '[\\/]')[1] as top_directoryfrom page_click_flatwhere domain_nm = 'support.sas.com' and flash_enabled='1' and weekofyear(detail_tm) = 48 and year(detail_tm) = 2012) directory_summarygroup by top_directoryorder by unique_visits;-- What are the most visited pages that are referred from a Google search for a given month?
select domain_nm, requested_file, count(*) as unique_visitors, monthfrom (select distinct domain_nm, requested_file, visitor_id, month(detail_tm) as monthfrom page_click_flatwhere domain_nm = 'support.sas.com' and referrer_domain_nm = 'www.google.com') visits_pp_ph_summarygroup by domain_nm, requested_file, monthorder by domain_nm, requested_file, unique_visitors desc, month asc;-- What are the most common search terms used on the customer support website for a given year?
select query_string_txt, count(*) as countfrom page_click_flatwhere query_string_txt <> '' and domain_nm='support.sas.com' and year(detail_tm) = '2012'group by query_string_txtorder by count desc;-- What is the total number of visitors per page using the Safari browser?
select domain_nm, requested_file, count(*) as unique_visitorsfrom (select distinct domain_nm, requested_file, visitor_idfrom page_click_flatwhere domain_nm='support.sas.com' and browser_nm like '%Safari%' and weekofyear(detail_tm) = 48 and year(detail_tm) = 2012) uv_summarygroup by domain_nm, requested_fileorder by unique_visitors desc;-- How many visitors spend more than 10 seconds viewing each page for a given week and year?
select domain_nm, requested_file, count(*) as unique_visitsfrom (select distinct domain_nm, requested_file, visitor_idfrom page_click_flatwhere domain_nm='support.sas.com' and weekofyear(detail_tm) = 48 and year(detail_tm) = 2012 and seconds_spent_on_page_cnt > 10;) visits_summarygroup by domain_nm, requested_fileorder by unique_visits desc;

        结果:

        Hive 与 Impala 查询时间对比如下图所示。

        可以看到,查询 1、2、4 Impala 比 Hive 快的多,而查询 3、5 Impala 却比 Hive 慢很多。这个测试可能更客观一些,而且也从侧面说明了一个问题,不要轻信厂商宣传的数据,还是要根据自己的实际测试情况得出结论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91754.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++:std::array vs 原生数组 vs std::vector

&#x1f4cc; C&#xff1a;std::array vs 原生数组 vs std::vector 引用&#xff1a; C/C 标准库 std::vector、std::array、原生静态数组 的区别有哪些&#xff1f; 深度剖析&#xff1a;std::vector 内存机制与 push_back 扩容策略 今天过去了 还有许许多个明天 能和大…

Hyper-V + Centos stream 9 搭建K8s集群(二)

一、安装自动补全主节点安装就可以yum install -y bash-completion echo source <(kubectl completion bash) >>~/.bashrc kubectl completion bash >/etc/bash_completion.d/kubectl二、安装Calico网络插件&#xff08;主节点&#xff09;下载文件wget https://ca…

VBA代码解决方案第二十七讲:禁用EXCEL工作簿右上角的关闭按钮

《VBA代码解决方案》(版权10028096)这套教程是我最早推出的教程&#xff0c;目前已经是第三版修订了。这套教程定位于入门后的提高&#xff0c;在学习这套教程过程中&#xff0c;侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码…

Spring AI 系列之三十一 - Spring AI Alibaba-基于Nacos的MCP

之前做个几个大模型的应用&#xff0c;都是使用Python语言&#xff0c;后来有一个项目使用了Java&#xff0c;并使用了Spring AI框架。随着Spring AI不断地完善&#xff0c;最近它发布了1.0正式版&#xff0c;意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说…

sqli-labs:Less-12关卡详细解析

1. 思路&#x1f680; 本关的SQL语句为&#xff1a; $uname".$uname."; $passwd".$passwd."; $sql"SELECT username, password FROM users WHERE username($uname) and password($passwd) LIMIT 0,1";注入类型&#xff1a;字符串型&#xff0…

【SpringAI】8.通过json动态添加mcp服务

前言 官方示例的代码中&#xff0c;mcp一般是配置到yml中或者json文件中&#xff0c;使用自动装配的方式注入服务&#xff0c;这种方式不方便在程序启动后添加新的服务&#xff0c;这里参考cherry studio的方式动态添加mcp服务 1.确定方案 mcp服务的维护放到mysql业务数据库维…

【PDF + ZIP 合并器:把ZIP文件打包至PDF文件中】

B站链接 PDF ZIP 合并器&#xff1a;把ZIP文件打包至PDF文件中_哔哩哔哩_bilibiliz 加强作者的工具 https://wwgw.lanzn.com/i8h1C32k9bef 密码:30cv 新增c框架&#xff0c;加快运行速度

阿里云部署微调chatglm3

git Ifs install Git lfs 主要用于管理大型文件。在传统的Git仓库中&#xff0c;所有文件内容都会被完整记录在每一次提交中&#xff0c;这会导致仓库体积增大&#xff0c;克隆、拉取和推送操作变慢&#xff0c;甚至可能超出存储限额。Git LFS通过将大文件替换成文本指针&#…

Linux网络编程 ---五种IO模型

五种IO模型一、IO慢的原因二、五种IO模型三、如何设置非阻塞式IO&#xff1f;一、IO慢的原因 二、五种IO模型 阻塞式IO 非阻塞式IO 信号驱动IO 多路转接 异步IO 三、如何设置非阻塞式IO&#xff1f; &#xff08;一&#xff09;用法说明 &#xff08;二&#xff0…

Obsidian结合CI/CD实现自动发布

CI/CDQuickAddJS脚本bat脚本sh脚本实现自动发版Hugo文章 需求来源 每次手动执行Hugo的命令&#xff0c;手动把public文件夹上传到自己的服务器可以完成发版需求。 但是&#xff0c;作为一个内容创作者&#xff0c;我更希望的关注于自己的内容&#xff0c;而不是关注整个发版…

[硬件电路-141]:模拟电路 - 源电路,信号源与电源,能自己产生确定性波形的电路。

源电路&#xff08;Source Circuit&#xff09;是电子系统中为其他电路或负载提供特定信号或能量的基础电路模块&#xff0c;其核心功能是生成、调节或转换所需的物理量&#xff08;如电压、电流、波形、频率等&#xff09;。以下是源电路的详细解析&#xff1a;一、源电路的核…

Unity_数据持久化_PlayerPrefs基础

Unity数据持久化 一、数据持久化基础概念 1.1 什么是数据持久化 定义&#xff1a; 数据持久化就是将内存中的数据模型转换为存储模型&#xff0c;以及将存储模型转换为内存中的数据模型的统称。 通俗解释&#xff1a; 将游戏数据存储到硬盘&#xff0c;硬盘中数据读取到游戏中&…

什么是列存储(Columnar Storage)?深度解析其原理与应用场景

列存储的基本概念&#xff1a;颠覆传统的数据组织方式列存储&#xff08;Column Storage&#xff09;是一种革命性的数据库存储技术&#xff0c;它通过按列而非按行组织数据&#xff0c;从根本上改变了数据的物理存储结构。与传统行存储数据库不同&#xff0c;列式数据库将每一…

机器人抓取流程介绍与实现——机器人抓取系统基础系列(七)

机器人抓取系统基础系列文章目录 1. UR机械臂的ROS驱动安装官方教程详解——机器人抓取系统基础系列&#xff08;一&#xff09; 2. MoveIt控制机械臂的运动实现——机器人抓取系统基础系列&#xff08;二&#xff09; 3. 机器人&#xff08;机械臂&#xff09;的相机选型与安装…

【Qt】QObject::startTimer: Timers cannot be started from another thread

QTimer对象的 start 函数调用必须和创建QTimer对象是同一个线程。 #include "QtTimerTest.h" #include <QDebug>QtTimerTest::QtTimerTest(QWidget *parent): QMainWindow(parent),m_timer(nullptr),m_timerThread(nullptr), m_workingThread(nullptr) {ui.set…

社会治安满意度调查:为城市安全治理提供精准参考(满意度调查公司)

在社会治理不断深化的背景下&#xff0c;公众对社会治安的感知与评价已成为衡量城市治理水平的重要维度&#xff08;社会治安满意度调查&#xff09;&#xff08;公众满意度调查&#xff09;&#xff08;满意度调查&#xff09;。为全面掌握市民对治安状况的真实反馈&#xff0…

Python篇--- Python 的加载、缓存、覆盖机制

要理解 import 与 if __name__ "__main__": 的关系&#xff0c;以及 Python 的加载、缓存、覆盖机制&#xff0c;我们可以从 “模块的两种身份” 和 “导入的全过程” 入手&#xff0c;用通俗的例子一步步拆解。一、核心&#xff1a;模块的 “双重身份” 与 __name_…

Java设计模式之行为型模式(访问者模式)应用场景分析

访问者模式&#xff08;Visitor Pattern&#xff09;作为Java设计模式中的“隐形冠军”&#xff0c;常被开发者低估其价值。这一模式通过“双分派”机制巧妙解耦数据结构与操作&#xff0c;为复杂系统的扩展提供了强大武器。在大厂项目中&#xff0c;访问者模式往往出现在业务逻…

【IDEA】JavaWeb自定义servlet模板

方法一&#xff1a;&#xff08;推荐去使用方法二&#xff0c;还能创建其它代码模板&#xff09;使用servlet模板创建Servlet类如果创建时找不到servlet模板&#xff1a;File -> Project Structure然后应用 -> OK&#xff0c;如果还是找不到Servlet模板&#xff0c;看看项…

Linux选择

在内存中运行着的进程称为&#xff08; 服务 &#xff09;。负责控制systemd系统和服务管理器的工具为&#xff08; systemctl &#xff09;命令。systemd管理系统服务的基本单位是&#xff08; unit &#xff09;。分配和管理资源的基本单位是&#xff08; 进程 &#xf…