当前位置: 首页 > ds >正文

基于 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.xdnf.cn/news/16768.html

相关文章:

  • 15.10 单机8卡到千卡集群!DeepSpeed实战调参手册:A100训练效率翻倍,百万成本优化实录
  • 【C++详解】深入解析多态 虚函数、虚函数重写、纯虚函数和抽象类、多态原理、重载/重写/隐藏的对⽐
  • composer 常用命令
  • Unity_XR控制手部动画
  • NVIDIA Isaac平台推动医疗AI机器人发展研究
  • C++:STL中list的使用和模拟实现
  • 常见的cms框架的webshell方法
  • JavaScript和小程序写水印的方法示例
  • 谈谈毕业工作一年后的变化
  • 【C语言】指针深度剖析(一)
  • 集成电路学习:什么是Wi-Fi无线保真度
  • Java优雅使用Spring Boot+MQTT推送与订阅
  • 使用LangChain构建法庭预定智能体:结合vLLM部署的Qwen3-32B模型
  • Accessibility Insights for Windows 使用教程
  • dubbo应用之3.0新特性(响应式编程)(2)
  • JVM 崩溃(Fatal Error)解决方法
  • C++与C#实战:FFmpeg屏幕录制开发指南
  • Rust基础-part8-模式匹配、常见集合
  • 前端学习日记(十五)
  • 利用对称算法及非对称算法实现安全启动
  • 《剑指offer》-算法篇-位运算
  • 【术语扫盲】MCU与MPU
  • [CSP-J 2022] 逻辑表达式
  • 【C++算法】76.优先级队列_前 K 个高频单词
  • 【VOS虚拟操作系统】未来之窗打包工具在前端资源优化中的应用与优势分析——仙盟创梦IDE
  • Java奖客富翁系统:注册登录抽奖全实现
  • 小程序视频播放,与父视图一致等样式设置
  • Python爬虫01_Requests第一血获取响应数据
  • 【Python】数据可视化之聚类图
  • logtrick 按位或最大的最小子数组长度