摘要:本文通过简单的例子来解析,大数据实践中的Spark读写流程,内容主要聚焦于Spark中的高效并行读写以及在写过程中如何保证事务性。

导读:

众所周知,在大数据/数据库领域,数据的存储格式直接影响着系统的读写性能。spark是一种基于内存的快速、通用、可扩展的大数据计算引擎,适用于新时代的数据处理场景。在“大数据实践解析(上):聊一聊spark的文件组织方式”中,我们分析了spark的多种文件存储格式,以及分区和分桶的设计。接下来,本文通过简单的例子来分析在Spark中的读写流程,主要聚焦于Spark中的高效并行读写以及在写过程中如何保证事务性。

1、文件读

如何在Spark中做到高效的查询处理呢?这里主要有两个优化手段:

1)减少不必要的数据处理。数据处理涉及文件的IO以及计算,它们分别需要耗费大量的IO带宽和CPU计算。在实际的生产环境中,这两类资源都是有限的,同时这些操作十分耗时,很容易成为瓶颈,所以减少不必要的数据处理能有效提高查询的效率;

以下面的查询为例:

spark.read.parquet("/data/events")
.where("year = 2019")
.where("city = 'Amsterdam'")
.select("timestamp")

由于在events表中按照year字段做了分区,那么首先通过 year 字段我们就可以过滤掉所有year字段不为 2019 的分区:

因为文件是parquet的文件格式,通过谓词下推可以帮助我们过滤掉 city 字段不是 "Amsterdam" 的 row groups;同时,由于我们的查询最终需要输出的投影字段只有 "timestamp" ,所以我们可以进行列裁剪优化,不用读取其他不需要的字段,所以最终整个查询所读的数据只有剩下的少部分,过滤掉了大部分的数据,提升了整体的查询效率:

2)并行处理,这里主流的思想分为两类:任务并行和数据并行。任务并行指充分利用多核处理器的优势,将大的任务分为一个个小的任务交给多个处理器执行并行处理;数据并行指现如今越来越丰富的SIMD指令,一次动作中处理多个数据,比如AVX-512可以一次处理16个32bit的整型数,这种也称为向量化执行。当然,随着其他新硬件的发展,并行也经常和GPU联系在一起。本文主要分析Spark读流程中的任务并行。

下面是Spark中一个读任务的过程,它主要分为三个步骤:

  1. 将数据按照某个字段进行hash,将数据尽可能均匀地分为多个大小一致的Partition;
  2. 发起多个任务,每个任务对应到图中的一个Executor;
  3. 任务之间并行地进行各自负责的Partition数据读操作,提升读文件效率。

2文件写

Spark写过程的目标主要是两个:并行和事务性。其中并行的思想和读流程一样,将任务分配给不同的Executor进行写操作,每个任务写各自负责的数据,互不干扰。

为了保证写过程的事务性,Spark在写过程中,任何未完成的写都是在临时文件夹中进行写文件操作。如下图所示:写过程中,results文件夹下只存在一个临时的文件夹_temporary;不同的job拥有各自job id的文件目录,相互隔离;同时在各目录未完成的写操作都是存在临时文件夹下,task的每次执行都视为一个taskAttempt,并会分配一个task attempt id,该目录下的文件是未commit之前的写文件。

当task完成自己的写任务时,会进行commit操作,commit成功后,该任务目录下的临时文件夹会移动,写文件移到对应的位置,表示该任务已经写完成。

当写任务失败时,首先需要删除之前写任务的临时文件夹和未完成的文件,之后重新发起该写任务(relaunch),直到写任务commit提交完成。

整个任务的描述可用下图表示,如果commit成功,将写完成文件移动到最终的文件夹;如果未commit成功,写失败,删除对应的文件,重新发起写任务。当写未完成时,所有写数据都存在对应的临时文件中,其他任务不可见,直到整个写commit成功,保证了写操作的事务性。

当所有任务完成时,所有的临时文件夹都移动,留下最终的数据文件,它是最终commitJob之后的结果。

本文介绍的算法是 FileOutputCommitter v1的实现,它的commitJob阶段由Driver负责依次移动数据到最终的目录。但是在当前广泛应用的云环境下,通常采取存算分离的架构,这时数据一般存放在对象存储中(如AWS S3,华为云OBS),Spark FileOutputCommitter中的数据移动并不像HDFS文件系统移动那么高效,v1的commitJob过程耗时可能会非常长。为了提升FileOutputCommitter 的性能,业界提出了FileOutputCommitter v2的实现,它们可以通过 spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version = 1或2 配置项来设置,它和v1的不同点在于,每个Task在commitTask时就将文件移动到最终的目录,而在commitJob时,Driver只需要负责将Task留下来的空目录删除,这样相比 v1 带来好处是性能提升, 但是由于commit task时直接写最终目录,在执行未完成时,部分数据就对外可见。同时,如果job失败了,成功的那部分task产生的数据也会残留下来。这些情况导致spark写作业的事务性和一致性无法得到保障。

其实v1也不完全一定能保证数据一致性,文件移动过程中完成的数据对外是可见的,这部分数据外部已经可以读取,但是正在移动和还未移动的数据对外是不可见的,而在云环境下,这个移动耗时会进一步加长,加重数据不一致的情况。

那么有没有能够使得Spark 分析在云环境下也可以保证数据的事务性和一致性的解决方案呢?华为云数据湖探索DLI(Data Lake Insight)改进了v1和v2这两种算法,使得Spark 分析在云环境下也可以保证数据的事务性和一致性,同时做到高性能,并且完全兼容Apache Spark和Apache Flink生态, 是实现批流一体的Serverless大数据计算分析服务,欢迎点击体验。

参考

【1】Databricks. 2020. Apache Spark's Built-In File Sources In Depth - Databricks. [online] Available at: <https://databricks.com/session_eu19/apache-sparks-built-in-file-sources-in-depth>.

点击这里→了解更多精彩内容

相关推荐

Spark如何与深度学习框架协作,处理非结构化数据

Apache CarbonData 2.0 开发实用系列之一:与Spark SQL集成使用

Spark中的文件源(上)

唐老师带你秒懂大数据,以及Spark和Flink在干啥咧

大数据容器化,头部玩家尝到了甜头

数据赋能,如何精细化保障企业大数据安全

【华为云技术分享】大数据实践解析(下):Spark的读写流程分析相关推荐

  1. 【华为云技术分享】数据赋能,如何精细化保障企业大数据安全

    云湖湖导读:随着企业业务的不断发展,企业大数据资产在企业辅助决策.用户画像.推荐系统等诸多业务流程中扮演着越来越重要的作用,如何保证企业大数据在满足各业务部门数据访问需求的同时又能精细化保障数据访问安 ...

  2. 【华为云技术分享】数据湖数据库,别再傻傻分不清了

    什么是数据湖 如果需要给数据湖下一个定义,可以定义为这样:数据湖是一个存储企业的各种各样原始数据的大型仓库,其中的数据可供存取.处理.分析及传输. 数据湖从企业的多个数据源获取原始数据,并且针对不同的 ...

  3. 【华为云技术分享】敏捷实践:一周的Sprint太短,可以调吗

    背景 一个人数为7人左右的团队采用Scrum框架工作.Sprint的长度,团队目前采用时间盒为1周.团队经常会出现在Sprint结束时不能完成当初设定的Sprint目标,很多工作项需要跨Sprint才 ...

  4. 【华为云技术分享】CentOS7.4系统下,手动安装MySQL5.7的方法

    MySQL数据库应用广泛,尤其对于JAVA程序员,不会陌生.如果在不想采购云数据库的情况下,可以自行安装MySQL数据库.文章将介绍,手动在CentOS7.4环境下,安装MySQL5.7版本的方法. ...

  5. 【华为云技术分享】大数据容器化成趋势,华为云BigData Pro一马当先

    大数据的需求热度,从来都是这个时代的浪尖.然而由于大数据系统的复杂性,一度导致业界大数据已死的各种声音不断.尤其是当MapR被HPE收购,Cloudera公司股票持续跌成狗,使得这种声音进一步放大. ...

  6. 【华为云技术分享】大数据容器化,头部玩家尝到了甜头

    [摘要] 大数据容器化,大势所趋.头部玩家在进行大数据容器化后,尝到了甜头? 大数据的需求热度,从来都是这个时代的浪尖.然而由于大数据系统的复杂性,一度导致业界大数据已死的各种声音不断.尤其是当Map ...

  7. 【华为云技术分享】三大前端技术(React,Vue,Angular)探密(下)

    [华为云技术分享]三大前端技术(React,Vue,Angular)探密(上) [Angular] Angular(通常被称为 "Angular 2+"或 "Angula ...

  8. 云技术与大数据开放市场(银联第一期技术开放日回顾2)

    接着之前介绍过的"移动人工智能与技术服务专场 ",我想继续分享开放日的 "云技术和大数据"专场,也供自己日后回顾. 2017年12月1日,以"技术开放 ...

  9. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 1

    前言 以互联网为代表的信息技术的迅猛发展对整个经济体系产生了巨大的影响.信息技术的发展一方面使知识的积累和传播更加迅速,知识爆炸性的增长:另一方面,使信息的获取变得越来越容易,信息交流的强度逐渐增加, ...

最新文章

  1. Spring - Java/J2EE Application Framework 应用框架 第 7 章 事务管理
  2. 公司软件AiDitron中涉及的英文单词及含义
  3. 基于Flink+ClickHouse构建实时游戏数据分析最佳实践
  4. sqlserver数据库事务
  5. dxf转nc代码软件_cad怎么转pdf?cad文件转换pdf文件的方法步骤
  6. Asp.net MVC应用在IIS7上部署后403错误解决方案
  7. jquery prop('checked', true)解决attr('checked', true)不能选中radio问题
  8. JavaScript 盖尔-沙普利算法
  9. endnotex7怎么导入中文文献_EndNote导入CNKI文献的方法 | 科研动力
  10. RNNoise降噪训练
  11. 头像加相框微信小程序
  12. Android 修改wifi阀值,6种简单方法使WiFi网络提速
  13. 如何清除本地计算机搜索记录,怎么深度清理电脑使用痕迹?
  14. clear在c语言中用法,clear的用法总结大全
  15. uefi +gpt 系统安装 和 传统legacy + mbr 的区别
  16. 小米note android7,小米note MIUI9.0+Android7.1刷机包
  17. html图片左右无缝循环滚动示例
  18. 整理了一波年终总结模版,速领!
  19. Kubeadm部署高可用K8S集群
  20. java证明角谷猜想_角谷猜想证明

热门文章

  1. es6 Promise.race()方法
  2. PyQt5 关于自动补全 QCompleter
  3. TensorFlow笔记(3) TensorBoard可视化
  4. 可以分屏的软件_Mac上的分屏功能,让你办公更高效
  5. Luogu P1164小A点菜
  6. 洛谷P5159 WD与矩阵
  7. 很不错的python 机器学习博客
  8. Unity脚本各种[XXX]的用法
  9. Runtime.getRuntime().exec()调用外部程序
  10. 一天就能打印一栋房子超大型3D打印机