一、大數據的四大特征:
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)
}