Spark应用场景以及与hadoop的比较
2024-09-01 06:06:23
一、大数据的四大特征:
a.海量的数据规模(volume)
b.快速的数据流转和动态的数据体系(velocity)
c.多样的数据类型(variety)
d.巨大的数据价值(value)
二.Spark 和 Hadoop的不同
Spark是给予map reduce 算法实现的分布式计算,拥有Hadoop MapReduce所具有的有点,但不同与MaoReduce的是Job中间输出和结果可以保存在内存中,从而不用在读写HDFS,因此Spark能更好的适用于数据挖掘与机器学习等需要迭代的map reduce的算法
架构如图:
1. Spark的中间数据放到内存中,对于迭代运算效率比较高。
2. Spark比Hadoop更通用。
Spark提供的数据集操作类型有很多种,不像Hadoop只提供了Map和Reduce两种操作。比如map, filter, flatMap,sample,groupByKey, reduceByKey, union, join, cogroup, mapValues, sort,partionBy等多种操作类型,他们把这些操作称为Transformations。同时还提供Count, collect, reduce,lookup, save等多种actions。
这些多种多样的数据集操作类型,给上层应用者提供了方便。各个处理节点之间的通信模型不再像Hadoop那样就是唯一的DataShuffle一种模式。用户可以命名,物化,控制中间结果的分区等。可以说编程模型比Hadoop更灵活。
Spark与Hadoop的结合
Spark可以直接对HDFS进行数据的读写,同样支持Sparkon YARN。Spark可以与MapReduce运行于同集群中,共享存储资源与计算,数据仓库Shark实现上借用Hive,几乎与Hive完全兼容。
Spark的适用场景
Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小
由于RDD的特性,Spark不适用那种异步细粒度更新状态的应用,例如web服务的存储或者是增量的web爬虫和索引。就是对于那种增量修改的应用模型不适合。
总的来说Spark的适用面比较广泛且比较通用。
运行模式
- 本地模式(对于开发来说非常方便)
- Standalone模式
- Mesoes模式
- yarn模式
Spark核心概念
(RDD)弹性分布数据集
RDD是Spark的最基本抽象,是对分布式内存的抽象使用,实现了以操作本地集合的方式来操作分布式数据集的抽象实现。RDD是Spark最核心的东西,它表示已被分区,不可变的并能够被并行操作的数据集合,不同的数据集格式对应不同的RDD实现。RDD必须是可序列化的。RDD可以cache到内存中,每次对RDD数据集的操作之后的结果,都可以存放到内存中,下一个操作可以直接从内存中输入,省去了MapReduce大量的磁盘IO操作。这对于迭代运算比较常见的机器学习算法, 交互式数据挖掘来说,效率提升比较大。
RDD的特点:
1. 它是在集群节点上的不可变的、已分区的集合对象。
2. 通过并行转换的方式来创建如(map, filter, join,etc)。
3. 失败自动重建。
4. 可以控制存储级别(内存、磁盘等)来进行重用。
5. 必须是可序列化的。
6. 是静态类型的。
RDD的生成有两种创建方式:
1、从Hadoop文件系统(或与Hadoop兼容的其它存储系统)输入(例如HDFS)创建。
2、从父RDD转换得到新RDD。
下面来看一从Hadoop文件系统生成RDD的方式,如:val file =spark.textFile("hdfs://..."),file变量就是RDD(实际是HadoopRDD实例),生成的它的核心代码如下:
// SparkContext根据文件/目录及可选的分片数创建RDD, 这里我们可以看到Spark与Hadoop MapReduce很像
// 需要InputFormat, Key、Value的类型,其实Spark使用的Hadoop的InputFormat, Writable类型。
def textFile(path: String, minSplits: Int =defaultMinSplits): RDD[String] = {
hadoopFile(path,classOf[TextInputFormat], classOf[LongWritable],
classOf[Text], minSplits) .map(pair=> pair._2.toString) }
// 根据Hadoop配置,及InputFormat等创建HadoopRDD
new HadoopRDD(this, conf, inputFormatClass,keyClass, valueClass, minSplits)
对RDD进行计算时,RDD从HDFS读取数据时与Hadoop MapReduce几乎一样的:
reader =fmt.getRecordReader(split.inputSplit.value, conf, Reporter.NULL)
val key: K = reader.createKey()
val value: V = reader.createValue()
//使用Hadoop MapReduce的RecordReader读取数据,每个Key、Value对以元组返回。
override def getNext() = {
try {
finished = !reader.next(key, value)
} catch {
case eof: EOFException =>
finished = true
}
(key, value)
}
最新文章
- 一些有意思的VR设备介绍
- Linux_日志管理介绍(一)
- Leetcode 113. Path Sum II
- Dubbo初探
- 【云计算】开源的Docker Registry WebUI
- spark IDEA开发环境搭建及运行问题
- C#中Thread.sleep()
- paip.sql索引优化----join 代替子查询法
- javascript将毫秒还原为可读时间格式
- DevExpress控件之:ChartControl 动态绑定数据
- CodeForces 21C Stripe 2 构造题
- android 弹出带输入框的对话框
- ElasticSearch基础(4)-索引
- ArcGIS API for JavaScript 4.2学习笔记[7] 鹰眼(缩略图的实现及异步处理、Promise、回调函数、监听的笔记)
- Bleve代码阅读(一)——新建索引
- java command line error opening registry key 'Software\JavaSoft\Java Runtime Environment' java.dll
- MySQL(1) 基本操作(MySQL的启动,表的创建,查询表的结构和表的字段的修改)
- Spring mvc 4系列教程(三)—— Spring4.X的新特性
- deepin linux java开发环境搭建全系列
- SAX,功能强大的 API
热门文章
- 面向对象和pickle模块结合
- 2019牛客多校第二场D-Kth Minimum Clique
- gawk(awk)的用法案例
- DAO模型 架构
- 【Android Studio】使用 Genymotion 调试出现错误 INSTALL_FAILED_CPU_ABI_INCOMPATI
- druid0.15.0安装方式
- apache安装zip包安装(非exe)
- linux集群实施与部署-----Nginx
- Linux - 查看端口的占用情况、找出并杀死占用进程的方法
- hashCode和equals的区别