Spark内核介绍
来源:互联网 发布:淘宝小号可以开店吗 编辑:程序博客网 时间:2024/06/05 10:42
相信大数据工程师都非常了解Hadoop MapReduce一个最大的问题是在很多应用场景中速度非常慢,只适合离线的计算任务。这是由于MapReduce需要将任务划分成map和 reduce两个阶段,map阶段产生的中间结果要写回磁盘,而在这两个阶段之间需要进行shuffle操作。Shuffle操作需要从网络中的各个节点 进行数据拷贝,使其往往成为最为耗时的步骤,这也是Hadoop MapReduce慢的根本原因之一,大量的时间耗费在网络磁盘IO中而不是用于计算。在一些特定的计算场景中,例如像逻辑回归这样的迭代式的计 算,MapReduce的弊端会显得更加明显。
那Spark是如果设计分布式计算的呢?首先我们需要理解Spark中最重要的概念--弹性分布数据集(Resilient Distributed Dataset),也就是RDD。
2.1 弹性分布数据集RDD
RDD是Spark中对数据和计算的抽象,是Spark中最核心的概念,它表示已被分片(partition),不可变的并能够被并行操作的数据集 合。对RDD的操作分为两种transformation和action。Transformation操作是通过转换从一个或多个RDD生成新的 RDD。Action操作是从RDD生成最后的计算结果。在Spark最新的版本中,提供丰富的transformation和action操作,比起 MapReduce计算模型中仅有的两种操作,会大大简化程序开发的难度。
RDD的生成方式只有两种,一是从数据源读入,另一种就是从其它RDD通过transformation操作转换。一个典型的Spark程序就是通 过Spark上下文环境(SparkContext)生成一个或多个RDD,在这些RDD上通过一系列的transformation操作生成最终的 RDD,最后通过调用最终RDD的action方法输出结果。
每个RDD都可以用下面5个特性来表示,其中后两个为可选的:
分片列表(数据块列表)计算每个分片的函数对父RDD的依赖列表对key-value类型的RDD的分片器(Partitioner)(可选)每个数据分片的预定义地址列表(如HDFS上的数据块的地址)(可选)
虽然Spark是基于内存的计算,但RDD不光可以存储在内存中,根据useDisk、useMemory、useOffHeap, deserialized、replication五个参数的组合Spark提供了12种存储级别,在后面介绍RDD的容错机制时,我们会进一步理解。值 得注意的是当StorageLevel设置成OFF_HEAP时,RDD实际被保存到Tachyon中。Tachyon是一个基于内存的分布式文件系统,目前正在快速发展,本文不做详细介绍,可以通过其官方网站进一步了解。
classStorageLevelprivate( privatevar _useDisk:Boolean, privatevar _useMemory:Boolean, privatevar _useOffHeap:Boolean, privatevar _deserialized:Boolean privatevar _replication:Int=1) extendsExternalizable{//… } val NONE =newStorageLevel(false,false,false,false) val DISK_ONLY =newStorageLevel(true,false,false,false) val DISK_ONLY_2 =newStorageLevel(true,false,false,false,2) val MEMORY_ONLY =newStorageLevel(false,true,false,true) val MEMORY_ONLY_2 =newStorageLevel(false,true,false,true,2) val MEMORY_ONLY_SER =newStorageLevel(false,true,false,false) val MEMORY_ONLY_SER_2 =newStorageLevel(false,true,false,false,2) val MEMORY_AND_DISK =newStorageLevel(true,true,false,true) val MEMORY_AND_DISK_2 =newStorageLevel(true,true,false,true,2) val MEMORY_AND_DISK_SER =newStorageLevel(true,true,false,false) val MEMORY_AND_DISK_SER_2 =newStorageLevel(true,true,false,false,2) val OFF_HEAP =newStorageLevel(false,false,true,false)
0 0
- Spark内核介绍
- spark内核
- Spark内核
- Spark内核介绍:Spark在运行时会把Stage包装成任务提交 (二)
- spark介绍
- spark介绍
- spark介绍
- Spark 介绍
- spark 介绍
- Spark介绍
- Spark开发-Spark内核细说
- Spark内核系列(一)Spark内核架构
- spark内核简介
- Spark内核-笔记1
- Spark内核研究
- Spark内核架构解密
- spark内核架构
- Spark内核架构
- 面向对象的三个基本特征
- ActionListener的三种实现方法
- CMDB内功心法,助我登上运维之巅
- DHTMLX-Windows
- MyBatis-----MyBatis传递数组参数
- Spark内核介绍
- 创建型设计模式_01--工厂模式
- 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置
- 山科大oj--字符串的连接 之一 (Append Code)
- 文字轮播与图片轮播
- codeigniter Message: mkdir(): Invalid path Filename: drivers/Session_files_driver.php
- spring添加<aop:aspectj-autoproxy>让注解自为类生成代理对象时出错
- 背景透明文字不透明
- Tomcat类加载机制触发的Too many open files问题分析