颠覆大数据分析之Spark为Shark所提供的扩展

简介:

颠覆大数据分析之SparkShark所提供的扩展

译者:黄经业    购书

在Spark的RDD上执行SQL查询遵循的是传统并行数据库的三步流程:

  1. 查询解析
  2. 逻辑计划的生成
  3. 将逻辑计划映射为物理的执行计划

Shark使用Hive查询编译器来进行查询语句的解析。它会生成一棵抽象语法树,然后再将它转化成一个逻辑计划。Shark中逻辑计划的生成方式也类似于Hive中的。但两者的物理计划的生成方式则不尽相同。Hive中的物理计划是一系列的MR作业,而Shark中的则是分阶段RDD转换的一个有向无环图。由于Shark的高工作负荷的这个性质(通常在Hive中机器学习及用户定义函数(UDF)都很常见),因此在编译期很难获取到物理查询计划。对于新数据而言的确是这样的(之前还未被加载到Shark中)。值得注意的是, Hive和Shark都经常用来查询这类数据。因此,Shark引入了一个叫部分有向无环图执行(Partial DAG Execution,PDE)的概念。

部分DAG执行

这项技术会基于运行时收集的数据来生成查询语句的执行计划,而不是在编译期就去生成查询的物理执行计划。收集的数据包括分区大小,倾斜检测的记录条数,哪些记录是频繁出现的,以及RDD分区中数据分布的粗略的直方图。Spark在洗牌阶段之前会将map输出存储到内存中——之后reduce任务会通过MOT组件来使用这些数据。Shark的第一个改动是收集了指定分区以及全局环境的数据。另一个修改则是使得DAG可以在运行时根据所收集的数据来进行改变。必须注意的是,Shark是基于单个节点上的查询优化方法来构建的,它使用了PDE的概念来结合本地优化器进行查询的全局优化。

数据收集以及后续的DAG的修改对Shark实现分布式的连接操作至关重要。它提供了两种类型的连接操作:洗牌连接(shuffle join)以及映射/广播连接。广播连接是通过将小表发送到所有的节点来实现的,在这里它会和大表中不相交的分区进行本地合并。而在洗牌连接中,两张表都会根据连接的主键来进行哈希分区。广播连接只有在表比较小的时候才会比较高效——从这读者可以看到,为什么在Shark的动态查询优化中这些数据统计是如此重要了。Shark中数据统计用于优化查询的另一种方式就是通过检查分区的大小来合并较小分区以决定归约器的数量或者说并行度。

列内存存储

Spark中默认会将RDD存储为JVM内存中的反序列化的Java对象。这样的好处就是对JVM而言它们天生就是可用的,这加快了访问的速度。这样做的缺点就是无法在JVM内存中创建大量对象。读者应当时刻牢记,随着Java堆中对象数量的上升,垃圾回收器(GC)收集的时候就会越长。因此Shark(Muthukumar和Janakiram 2006)实现了列存储,所有基础类型的列都会创建一个对象来存储,而对于复杂类型,它会使用字节数组。这极大地减少了内存中的对象数量也提高了GC及Shark的性能。同时和Spark原生的实现相比,它还提高了空间的使用率。[1]

分布式数据加载

Shark使用Spark执行器来加载数据,但会对它进行定制化。每一张表都会进行分区,每一个分区都会由一个单独的Spark任务来进行加载。这个任务会独立决定是否进行压缩(这列是否需要压缩,如果需要的话用何种技术进行压缩——它是字典编码还是游程长度编码[Abadi 等2006])。每个分区还会单独保存压缩后的结果元数据。然而必须注意的是,世系图并不需要存储压缩元数据,这个会在重构RDD的时候进行计算。结果表明,和Hadoop相比,Shark加载数据到内存中的速度要更快,同时将数据加载到HDFS中的吞吐量也和Hadoop的一样。

完全分区智能连接(Full Partition-Wise Join)

正如在传统数据库中所了解到的那样,完全分区智能连接可以通过根据连接列来将两张表分区的方式来实现。尽管Hadoop并不支持这样的协同分区,Shark通过在数据定义中使用”distribute by”子句实现了这点。当连接两张一致分区的表时,Shark会创建Spark的map任务以避免使用昂贵的洗牌操作,从而获得了更高的运行效率。

分区修剪

正如在传统数据库中那样,分区修剪指的是优化器在构建分区访问列表时通过分析SQL中的where和from子句,删除掉不必要的分区。Shark还通过存储在分区元数据中的范围值(range value)和非重复值(distinct value, 对应枚举类型)增强了数据加载过程中的数据统计,以便在运行时指导分区修剪决策——这个过程又被Shark团队称之为映射修剪。

机器学习的支持

Shark的一个关键的独特卖点(Unique Selling Points ,USP)在于它能够支持机器学习算法。之所以能够实现这个是因为Shark允许在返回查询结果的同时还顺便返回代表执行计划的RDD对象。这说明用户可以初始化这个RDD上的操作——这点非常关键,因为它使得Spark RDD的能力可以为Shark查询所用。需要注意的是机器学习算法能够在Spark RDD上实现,Kraska等人所开发的MLbase库或本书的后续章节都会介绍到这点。

[1]   分代GC常用于现代的JVM。一类回收被称为minor collection,它是用来将分区中存活的对象拷贝到存活区(suvivor space)以及持久代中。剩下的对象会被回收掉。另一种是stop-the-world的major collection,它会对老生代进行压缩。 

目录
相关文章
|
5天前
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
27 2
ClickHouse与大数据生态集成:Spark & Flink 实战
|
3天前
|
数据采集 机器学习/深度学习 搜索推荐
大数据与社交媒体:用户行为分析
【10月更文挑战第31天】在数字化时代,社交媒体成为人们生活的重要部分,大数据技术的发展使其用户行为分析成为企业理解用户需求、优化产品设计和提升用户体验的关键手段。本文探讨了大数据在社交媒体用户行为分析中的应用,包括用户画像构建、情感分析、行为路径分析和社交网络分析,以及面临的挑战与机遇。
|
6天前
|
SQL 机器学习/深度学习 分布式计算
Spark快速上手:揭秘大数据处理的高效秘密,让你轻松应对海量数据
【10月更文挑战第25天】本文全面介绍了大数据处理框架 Spark,涵盖其基本概念、安装配置、编程模型及实际应用。Spark 是一个高效的分布式计算平台,支持批处理、实时流处理、SQL 查询和机器学习等任务。通过详细的技术综述和示例代码,帮助读者快速掌握 Spark 的核心技能。
20 6
|
2天前
|
消息中间件 分布式计算 大数据
数据为王:大数据处理与分析技术在企业决策中的力量
【10月更文挑战第29天】在信息爆炸的时代,大数据处理与分析技术为企业提供了前所未有的洞察力和决策支持。本文探讨了大数据技术在企业决策中的重要性和实际应用,包括数据的力量、实时分析、数据驱动的决策以及数据安全与隐私保护。通过这些技术,企业能够从海量数据中提取有价值的信息,预测市场趋势,优化业务流程,从而在竞争中占据优势。
22 1
|
3天前
|
机器学习/深度学习 搜索推荐 大数据
大数据与教育:学生表现分析的工具
【10月更文挑战第31天】在数字化时代,大数据成为改善教育质量的重要工具。本文探讨了大数据在学生表现分析中的应用,介绍学习管理系统、智能评估系统、情感分析技术和学习路径优化等工具,帮助教育者更好地理解学生需求,制定个性化教学策略,提升教学效果。尽管面临数据隐私等挑战,大数据仍为教育创新带来巨大机遇。
|
4天前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第27天】在大数据时代,数据湖技术凭借其灵活性和成本效益成为企业存储和分析大规模异构数据的首选。Hadoop和Spark作为数据湖技术的核心组件,通过HDFS存储数据和Spark进行高效计算,实现了数据处理的优化。本文探讨了Hadoop与Spark的最佳实践,包括数据存储、处理、安全和可视化等方面,展示了它们在实际应用中的协同效应。
25 2
|
5天前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第26天】本文详细探讨了Hadoop与Spark在大数据处理中的协同作用,通过具体案例展示了两者的最佳实践。Hadoop的HDFS和MapReduce负责数据存储和预处理,确保高可靠性和容错性;Spark则凭借其高性能和丰富的API,进行深度分析和机器学习,实现高效的批处理和实时处理。
23 1
|
5天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
6天前
|
人工智能 供应链 搜索推荐
大数据分析:解锁商业智能的秘密武器
【10月更文挑战第31天】在信息爆炸时代,大数据分析成为企业解锁商业智能的关键工具。本文探讨了大数据分析在客户洞察、风险管理、供应链优化、产品开发和决策支持等方面的应用,强调了明确分析目标、选择合适工具、培养专业人才和持续优化的重要性,并展望了未来的发展趋势。
|
6天前
|
分布式计算 大数据 OLAP
AnalyticDB与大数据生态集成:Spark & Flink
【10月更文挑战第25天】在大数据时代,实时数据处理和分析变得越来越重要。AnalyticDB(ADB)是阿里云推出的一款完全托管的实时数据仓库服务,支持PB级数据的实时分析。为了充分发挥AnalyticDB的潜力,将其与大数据处理工具如Apache Spark和Apache Flink集成是非常必要的。本文将从我个人的角度出发,分享如何将AnalyticDB与Spark和Flink集成,构建端到端的大数据处理流水线,实现数据的实时分析和处理。
32 1