Shark简介

article/2025/9/15 14:57:01

简介

Shark是一个新的数据分析系统,在集群上进行查询处理和复杂分析。Shark使用一种新的分布式内存抽象,为SQL查询和复杂分析函数提供了统一的运行引擎,并能够有效的容错。这种新的分布式内存抽象使得shark执行SQL查询的速度比Hive100倍,执行机器学习算法比Hadoop100倍。与之前的系统不同,shark在取得如此良好性能的同时尽可能的保留了类似于mapreduce的执行框架,以及细粒度的容错特性。为了有效的执行SQL查询,shark提供了面向列存储,查询中重计划等机制。Shark在速度上能够与MPP分析数据库相当,同时又具有MPP分析数据库不具备的容错和复杂分析的能力。

Shark基本上就是在Spark的框架基础上提供和Hive一样的HiveQL命令接口,为了最大程度的保持和Hive的兼容性,Shark使用了HiveAPI来实现query ParsingLogic Plan generation,最后的PhysicalPlan   execution阶段用Spark代替Hadoop MapReduce。通过配置Shark参数,Shark可以自动在内存中缓存特定的RDD,实现数据重用,进而加快特定数据集的检索。同时,Shark通过UDF用户自定义函数实现特定的数据分析学习算法,使得SQL数据查询和运算分析能结合在一起,最大化RDD的重复使用。

系统概述

Shark既支持SQL查询处理,也支持机器学习函数。Shark是与Hive兼容的,用户可以无需修改Hive的查询以及数据就能在shark上执行。

由于与Hive的兼容,shark可以在任何支持Hadoop存储API的系统上进行查询,包括HDFSAmazon S3等。Shark也支持多种数据格式,例如:textjsonxml等。Shark继承了Hiveschema-on-read和嵌套数据类型。

此外,用户可以选择将部分数据存储到shark的内存中,以便进行快速分析处理。

 

上图显示了shark集群的体系结构,包括一个master节点和一组worker节点。数据仓库的元数据存储在一个外部事务性数据库中。Shark是建立在Spark之上的,Spark是一个类似于Mapreduce的集群计算引擎。当一个查询提交到master时,shark将该查询转换成一个用RDD表示的操作树。这些RDDSpark转化成一张任务的图,worker节点来执行这些任务。

 

上图显示了shark的体系结构,特点如下:

1、 物理计划在Spark上执行;

2、 依靠Spark的快速执行、容错性及RDD

3、 尽可能的充分利用Hive的代码:将Hive生成的逻辑计划转换为Spark的执行图(execution graph);

4、 与Hive的兼容性:无需修改就可以利用hivemetadataHDFS上执行HiveQL

RDD上执行SQL查询

Shark与传统的RDBMS一样,执行SQL查询一般都经过以下3个过程:解析查询语句、生成逻辑计划、生成物理计划。给定一个查询,Shark使用Hive的查询编译器解析查询语句并生成对应的抽象语法树,然后将这棵树转化为逻辑计划及基本的逻辑优化(比如,预测下推),以上这些,SharkHive都使用了相同的方法。Hive将把操作转化为有一系列MapReduce程序组成的物理计划,而对于Shark,它的优化器将应用额外的优化规则(如,对于关键字LIMIT对应的优化规则)到各个独立的分区(individual partitions)中,并且创建由一序列在RDDs上的转化操作构成的物理计划,而不是MapReduce Jobs,然后利用在Spark中已经实现的operators(如,mapreduce)或在Shark中实现的operators(如 broadcast joins)执行相应的物理计划。

系统拓展

尽管通过这些基本的方法可以在Spark上执行SQL语句,但怎样做到高效率是一个挑战。UDF(用户自定义函数)的流行以及复杂的分析函数在Shark上的使用,很难再编译的时候就确定相应的优化查询计划,特别在没有经过ETL处理的新数据上。另外,尽管有了这样一个计划,愚蠢的在Spark或其他MapReduce环境下也是低效的。为了高效的存储相关的数据以及执行SQL,对Spark引擎进行了一些如下拓展。

Ø Partial DAG ExecutionPDE

为了在分布式数据集上支持动态查询优化,拓展了Spark支持PDE,这项技术允许使用在运行时收集的统计数据,动态的改变查询计划。目前,PDE主要用在Shuffle操作阶段边界上,这里将进行数据的交换及重新分区,都是Shark上典型的高消耗操作。默认情况下,在shuffle之前,Spark将在内存中实例化map任务的输出,如果有必要才输出到磁盘上,reduce任务将随后获取这些输出。

PDE通过以下两步修改这种机制。首先,在实例化map输出的时收集总体可定制的统计信息和每个分区的粒度;然后,将依赖这些统计值,通过选择不同的operators或改变它们的参数(如,并行度)来修改DAG

Ø Columnar Memory Store

SharkSpark的内存存储机制上实现了基于列的内存存储。Shark使用JVM原始的数组存储原始类型(primitive types)的所有列,Hive支持的复杂数据类型(如,maparray),将被序列化并由关联着的字节数组进行存储。每一列都只创建了一个JVM对象,能够实现高效的空间利用、GCs和压缩数据,减轻了deserialize的负担。

Ø Distributed Data Loading

除了查询的执行,Shark还使用Spark的执行引擎实现了分布式数据加载。在加载的过程中,表将被分割成小的partitions,这些partitions将被不同的tasks根据加载模式,提取相应的数据并以列的形式存储在内存中。每一个数据加载的task将跟踪metadata来决定分区中的每一列是否应该压缩,如:若某列不同的值低于某个阈值,对应的数据加载task将在此列上进行压缩处理。每个task根据加载数据的情况,选择合适的处理优化策略,而不是所有的task都统一使用共同的策略,保证在加载过程中实现最大的并行度。需要注意的是,RDD的血统并不会记录这些处理的策略。

Ø Data Co-partitioning

Shark为了在后面的查询中快速的实现join操作,在数据加载过程中,允许在共同的主键上进行co-partitioning。在分布式文件系统(如,HDFS)中,存储系统基于模式判别,不能实现co-partitioning。在join两个co-partitioned tables时,Shark的优化器将会创建一个避免了高耗shuffleDAG并且代替map任务执行join。在Shark中可以使用DISTRIBUTE BY进行实现:

CREATE TABLE l_mem TBLPROPERTIES ("shark.cache"=true)

AS SELECT * FROM lineitem DISTRIBUTE BY L_ORDERKEY;

CREATE TABLE o_mem TBLPROPERTIES ("shark.cache"=true,"copartition"="l_mem") AS SELECT * FROM order DISTRIBUTE BY O_ORDERKEY;

Ø Partition Statistics and Map Pruning

存储文件系统中的数据,很有可能在一列或几列上存在在聚集的性质,Map Pruning就是建立在具有聚集特性的数据上进行数据分区修剪的过程。Shark的内存将数据存储成小的分区(block),每个block都包含了一个或几个逻辑上具有聚集性质的组,而Shark可以避免扫描那些不在查询范围内的block

为了充分利用这些在某些列上具有聚集特性的数据,Shark的内存存储了每个worker在数据加载过程中记录的统计信息,包括每一列值的范围。如果某列上值不同的数较少,还将统计这些不同的值,这些统计值将在master中汇总,实现查询过程中修剪分区。

支持机器学习 

Shark的一个重要设计目标就是能处理高效SQL查询和复杂的机器学习。Shark遵循将计算移到数据处的原则,支持机器学习。这样设计的原因是选择了Spark作为执行引擎、RDD作为operators操作的主要数据结构。Shark除了执行SQL查询并返回其结果外,还允许查询返回代表了查询计划的RDD,用户可以使用返回的RDD进行分布式计算。

Shark会在集群上自动的并行执行上述的mapmapRowsreduce函数,并且master程序将收集reduce函数的输出进行更新操作。目前Shark提供一些基本的机器学习算法,包括linear regressionlogistic regressionk-means。在大部分情况下,用户只需要实现一个mapRows函数提取待分析的数据,然后调用上述提供的算法。

除了语言的集成,另一个使用RDDs作为operators操作的数据结构关键益处是执行引擎的集成。这个共同的抽象使得机器学习计算和SQL查询可以共用workers,并且可以通过数据缓存避免了数据移动带来的负载。


http://chatgpt.dhexx.cn/article/CBBbXRHr.shtml

相关文章

Vue3中shallowReactive 与 shallowRef 的用法

shallowReactive 与 shallowRef shallowReactive:只处理对象最外层属性的响应式(浅响应式)。 shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理。 什么时候使用? 如果有一个对象数据,结构比较深, 但…

2018华为软挑--模拟退火+FF解决装箱问题【C++代码】

算法简介: 装箱问题是一个NP完全问题,求解全局最优解有很多种方法:遗传算法、禁忌搜索算法、蚁群算法、模拟退火算法等等,本次使用模拟退火,它的优点是在参数合适的情况下基本上可以100%得到全局最优解,缺点…

2020华为软挑热身赛代码开源-思路大起底(华为软件精英挑战赛编程闯关)

本文首发于个人公众号【两猿社】,后台回复【华为】,获取完整开源代码链接。 昵称:lou_shang_shi_bian_tai 成绩:0.032 社长没有针对硬件做任何优化,热身赛成绩也一般。但有些比赛的trick我想与大家一起分享,希望对继续…

2021华为软挑-成渝复赛复盘

成渝赛区 团队名:newWorld 初赛 rank 22,复赛 rank 22。 github源码:https://github.com/Yin-Freedom/codecraft_2021 赛题介绍 赛题网址:https://competition.huaweicloud.com/advance/1000041380/circumstance 本次赛题来源…

2020华为软挑热身赛

基于高斯贝叶斯分类的C优化器 摘要:2020华为软件挑战赛如期举行,本次挑战赛分为热身赛、初赛、复赛、总决赛4个部分,其中热身赛结合当前机器学习中分类问题以及鲲鹏服务器性能相关来出题。为了解决该问题,达到算法准确率和程序时…

华为软挑赛2023-初赛笔记

前言 比赛介绍 官方链接: 2023华为软件精英挑战赛——普朗克计划 (huaweicloud.com) 赛题介绍 场景介绍 官方赛题介绍: 2023华为软件精英挑战赛初赛赛题及相关材料发布_2023华为软件精英挑战赛_华为云论坛 (huaweicloud.com) 比赛场景如图所示 简单来说,在一…

【C++】2018华为软挑:模拟退火+贪心FF解决装箱问题

本文的主要工作是补充这篇博客的缺失代码,使之能够运行。 2018华为软挑--模拟退火FF解决装箱问题【C代码】_小马哥MAX的博客-CSDN博客算法简介: 装箱问题是一个NP完全问题,求解全局最优解有很多种方法:遗传算法、禁忌搜索…

2020华为软挑热身赛-这些坑我帮你踩过了(华为软件精英挑战赛编程闯关)

本文始发于个人公众号【两猿社】。 声明,为保证比赛公平,本文不会提供比赛源码,仅提供思路与踩坑经验。 他来了,他来了,他带着面试绿卡走来了。 他来了,他来了,他带着20w大奖走来了。 一年一度…

2018华为软挑参赛体验

第一次接触到这个比赛应该是研究生刚入学的时候,在教研室看到了师姐的一份简历,上面就有华为软挑的参赛经历。研一利用空余时间加强C和STL的学习,看完了《C primer》《Effective STL》,自己也写了一些demo,感觉这个比赛…

2022华为软挑编程问题报错总结

for i in number_feature: TypeError: ‘int’ object is not iterable的错误 错误原因:是因为在python里,整型(int)数据是不能直接用于迭代的,而是应该用range()函数 改为如下图:

2021华为软挑部分答疑——哪些你有错却总是找不到的地方,我来带你找啦(含标准输入代码)

前期工作: 2021华为软挑初探——代码实现 2021华为软挑再探——代码实现 1 关于打包 在windows系统下,先把你写的程序写在src里面的CodeCraft-2021里面 然后在这个页面,将这三个文件压缩就可以上传啦: 2 关于标准输入 标准输…

华为软挑2019

参加软挑的一些感悟 写在前边的话 我本科一直在做嵌入式相关的项目,这是第一次参加软件类的竞赛,不得不说过程确实很刺激,最后止步杭厦赛区50强也很是遗憾,明明很接近,最后输在了代码效率上,本地成绩很好的 python代码 ,上传测评运行时间超限(官测环境比本地性能好&…

2021华为软挑初探——代码实现

其他工作: 2021华为软挑部分答疑——哪些你有错却总是找不到的地方,我来带你找啦(含标准输入代码) 2021华为软挑再探——代码实现 这几天华为软挑好多人也是做的热火朝天,作为一个渣渣小孙也来探探,不探…

2020华为软挑总结

文章目录 一、热身赛编程闯关:评价标准:问题分析 二、初赛问题描述评价标准:问题分析思路一:思路二:思路三:针对思路三的提速: 最终结果: 三、code记录初赛两篇不错的总结三、复活赛…

2022华为软挑比赛(初赛笔记)

文章目录 2022华为软挑(初赛笔记)1. 赛题要求2. 解决方案2.1 挑选适合的边缘节点2.2 第一轮:最大分配2.3 第二轮:均值分配 总结 本文仓库地址: Github-CodeCraft-2022 2022华为软挑(初赛笔记) …

2023华为软件精英挑战赛笔记心得(Python实现)

第一次参加华为软挑,问了周围一圈人没人组队,看了眼题目,感觉挺有意思的,就打算自己写来跑一下,不求分数,主要是想学点东西,顺便记录一下。(最后跑了195w,自己的能力也就…

2021华为软件精英挑战总结

2021华为软挑32强总结 今年的软挑最终止步于粤港澳赛区第16名,总成本为16亿3979万6349,赛区第一名总成本为15亿3903万4817。 虽然没进入决赛,但是拿到了华为面试直通卡,也喜提广州一日游,算不虚此行了。决赛虽然还在继…

Spring认证中国教育管理中心-Spring Data Neo4j教程一

原标题:Spring认证中国教育管理中心-Spring Data Neo4j教程一(Spring中国教育管理中心) 5. 开始 我们为 SDN 提供了 Spring Boot 启动器。请通过您的依赖管理包含启动模块并配置要使用的螺栓 URL,例如org.neo4j.driver.uribolt:/…

SpringBoot 整合 Neo4j

1、创建测试类2、集成 SpringBoot 阅读此文之前,必须对 Neo4j 有个初步的了解,如果要实际操作的话,需要自备一个 Neo4j 数据库 本文所涉及代码已开源至 Gitee https://gitee.com/Array_Xiang/spring-boot-neo4j 创建一个 SpringBoot 项目&…

【Neo4j教程之CQL函数基本使用】

🚀 Neo4j 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,C…