您现在的位置 >> Hadoop教程 >> Hadoop实战 >> hadoop,spark专题  
 

Spark大数据

【作者:Hadoop实战专家】【关键词:数据集 Spark 机器学习 数据 】 【点击:20717次】【2013-09-2】
但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的map reduce的算法。Spark比Hadoop更通用。 //使用Hadoop MapReduce的RecordReader读取数据,每个Key、Value对以元组返回。  

相关热门搜索:

大数据标签:hadoop hdfs yarn mapreduce hive spark bigdata

问题导读:

1、什么是Spark?

2、 Spark和Hadoop的不同和整合?

前言:

大数据平台软件需要同时支持海量数据存储和高速分析能力。

大数据的四大特征——海量的数据规模(volume)、快速的数据流转和动态的数据体系(velocity)、多样的数据类型(variety)和巨大的数据价值(value)。

目前,HDFS加Map Reduce的组合很好的解决了海量数据规模和多样的数据类型的问题,但在对高速的数据查询需求、不同数据规模的场景下对应用的灵活支持还有很大的提升空间。Apache Spark作为下一代Map/Reduce计算框架,充分利用了内存加速,很好的解决了交互式查询和迭代式机器学习的效率问题。Transwarp Data Hub通过对Apache Spark和Apache Hadoop2.0的支持,使用优化内存处理技术,能10x/100x级别的提升Hadoop平台的性能。

同时通过对新的框架的整合和优化处理技术,Transwarp Data Hub扩大了Hadoop的应用领域和处理不同数据压力的能力,适合处理从GB到PB级别的数据。目前适用于离线分析,统计/挖掘;在线的存储和OLAP系统;以及在线的基于内存的高速分析。

Spark是一个通用的并行计算框架,由UCBerkeley的AMP实验室开发。

Spark和Hadoop有什么不同呢?

Spark是基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是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)

valkey: 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)

}

Scala

Spark使用Scala开发,默认使用Scala作为编程语言。编写Spark程序比编写Hadoop MapReduce程序要简单的多,SparK提供了Spark-Shell,可以在Spark-Shell测试程序。写SparK程序的一般步骤就是创建或使用(SparkContext)实例,使用SparkContext创建RDD,然后就是对RDD进行操作。如:

val sc = new SparkContext(master, appName,[sparkHome], [jars])

val textFile =sc.textFile("hdfs://.....")

textFile.map(....).filter(.....).....

Python

现在Spark也提供了Python编程接口,Spark使用py4j来实现python与java的互操作,从而实现使用python编写Spark程序。Spark也同样提供了pyspark,一个Spark的python shell,可以以交互式的方式使用Python编写Spark程序。 如:

from pyspark import SparkContext

sc = SparkContext("local","Job Name", pyFiles=['MyFile.py', 'lib.zip', 'app.egg'])

words =sc.textFile("/usr/share/dict/words")

words.filter(lambda w:w.startswith("spar")).take(5)

Java

Spark支持Java编程,但对于使用Java就没有了Spark-Shell这样方便的工具,其它与Scala编程是一样的,因为都是JVM上的语言,Scala与Java可以互操作,Java编程接口其实就是对Scala的封装。如:

JavaSparkContext sc = newJavaSparkContext(...);

JavaRDD lines =ctx.textFile("hdfs://...");

JavaRDD words = lines.flatMap(

new FlatMapFunction() {

public Iterable call(String s) {

return Arrays.asList(s.split(""));

}

}

);

大数据系列hadoop,spark相关文章:

上一篇:Spark大数据 下一篇:Spark大数据
最新评论
◆◇.情兽2014-09-09 10:52:44
nextPC="hadoop104"
吖头2014-09-09 09:26:27
权限这个会搞死人的如果不是一开始就注意的话
王风和2014-09-09 02:03:20
【Hadoop:大数据解决方案的常胜将军】Hadoop技术跨越了SQL数据库、NoSQL数据库,非结构化数据、文档数据存储等。Hadoop现在也更加灵活,允许业务做更多事情,处理更多数据类型。如此强大的功能源于Hadoop的许多同伴项目,包括像Pig这样的语言,以及如下的可扩展解决方案,详见:http://t.cn/8s4BHbu
Wendy2014-09-08 11:41:53
是不是在找的过程中出错了
BUPT_风吹屁屁凉2014-09-07 09:01:56
【Hadoop连载系列之三:HBase分布式安装】 http://t.cn/8sibZ5w 1 概述 HBase是基于Hadoop的分布式的、面向列的、可拓展的开源数据库。当需要对大数据进行随机的、实时的读写时使用HBase。属于NoSQL。HBase利用 Hadoop/HDFS作为其文件存储系统,利用Hadoop/MapReduce来处理HBase中的海量数据,利用Z...
飞儿2014-09-07 12:05:39
在eclipse上运行MR
临风听蝉2014-09-06 09:19:34
Linux内核开发技术今日推荐: http://t.cn/8FObC9Y 大数据Hadoop相关技术今日推荐: http://t.cn/8FH0cdT Linux系统虚拟化技术今日推荐: http://t.cn/8F82nGP
丫头2014-09-06 05:14:46
就是要学点东西了...
寒星一点2014-09-05 12:59:49
吃葡萄,想问题,hadoop建库,多元数据分析,数值同化预报。
夏子2014-09-04 10:46:00
【为什么有些公司在机器学习业务方面倾向使用 R + Hadoop 方案】R 在解决统计学问题方面无与伦比,在数据量达到 2G 以上速度就很慢了,于是就催生出了与 Hadoop 相结合跑分布式算法这种解决方案,但是,R 这样起源于统计学的计算机包与 Hadoop 相结合会不会出问题?http://t.cn/RPllCOC
 
  • Hadoop生态系统资料推荐