教程地址:http://www.showmeai.tech/tutorials/84
本文地址:http://www.showmeai.tech/article-detail/174
声明:版权所有,转载请联系平台与作者并注明出处
要掌握基于Spark的大数据处理操作,大家首先要了解Spark中的一个核心数据概念:RDD。
RDD,全称为Resilient Distributed Datasets(弹性分布式数据集合),是一个容错的、并行的数据结构,可以让用户显式地将数据存储到磁盘和内存中,并能控制数据的分区。同时,RDD还提供了一组丰富的操作来操作这些数据。
RDD(弹性分布式数据集合)是Spark的基本数据结构,Spark中的所有数据都是通过RDD的形式进行组织。
每个RDD有5个主要的属性:
在Spark分布式数据处理任务中,RDD提供数据,供任务处理。很多时候hadoop和Spark结合使用:hadoop提供hdfs的分布式存储,Spark处理hdfs中的数据。
我们以 sc.textFile("hdfs://path/to/file")
形式生成RDD时,Spark就已经算好了数据的各个切片(也叫分区),并把分区信息放在了一个列表(名单)里,这个名单就属于RDD自带的其中一个属性。
RDD在被分发到每个执行计算的任务节点后,每个任务节点会根据元数据信息获取自身节点负责计算的分区数据,并把数据放到本节点的内存当中,然后对数据进行计算。
一般我们会把数据所在的节点和Spark的计算节点配成同一个主机,这样就实现了数据本地化。
RDD的3种创建方式如下图所示(以pyspark代码为例):
spark也支持从多种外部数据源读取数据,包括HDFS、S3、Hbase、MongoDB等,如下图所示:
在Spark程序中,当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时,Spark操作实际上操作的是这个函数所用变量的一个独立副本。
这些变量会被复制到每台机器上,并且这些变量在远程机器上的所有更新都不会传递回驱动程序。
通常跨任务的读写变量是低效的,但是,Spark还是为两种常见的使用模式提供了两种有限的共享变量:
为什么要将变量定义成广播变量?
在分布式计算中,由Driver端分发大对象(如字典、集合、黑白名单等),一般,如果这个变量不是广播变量,那么每个task就会分发一份。在task数目十分多的情况下,Driver的带宽会成为系统的瓶颈,而且会大量消耗task服务器上的资源。
如果将这个变量声明为广播变量,那么知识每个executor拥有一份,这个executor启动的task会共享这个变量,节省了通信的成本和服务器的资源
为什么要将变量定义为累加器?
在Spark应用程序中,异常监控、调试、记录符合某特性的数据数目,这些需求都需要用到计数器。
如果变量不被声明为累加器,那么被改变时不在Driver端进行全局汇总。即在分布式运行时每个task运行的只是原始变量的一个副本,并不能改变原始变量的值。
但是,当这个变量被声明为累加器后,该变量就会有分布式计数的功能。
要对大数据进行处理,我们需要使用到一系列Spark RDD上可以变换与操作的算子,我们来重点理解一下spark的RDD transformation和action。
transformation操作针对已有的RDD创建一个新的RDD。
action主要是对RDD进行最后的操作(如遍历、reduce、保存到文件等),并可以返回结果给Driver程序。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。